暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Spatial-如何找到离点x距离内的形状。

ASKTOM 2021-04-21
606

问题描述

嗨,

我正在运行这个脚本对数据库:

SELECT
    id
FROM
    polygon_shapes
WHERE
    sdo_contains(
        shape,
        sdo_geometry('POINT(6.37616 74.335136111)', 4326)
    ) = 'TRUE';


这功能正常。我已经基于c.a.设置了元数据。5 m公差。

但是现在我收到了一个功能要求,这将检查某些请求的更高容忍度,因为我们可能会以较低的精度获得坐标。

基本上,需要的是,不仅仅是找到点,它会返回一个正值,如果该点在该点的定义半径内。有没有办法动态地做到这一点。请求来自java应用程序。

希望我的问题足够清楚。

提前谢谢。

额外信息。
试图在livesql上进行设置,但由于插入语句很大,因此无法设置。它是一个具有几千个点的SDO_GEOMETRY。有什么方法可以将其作为文件上传给您?

专家解答

我们能否有一个完整的测试用例,包括

-符合您当前标准的行
-与您当前标准不匹配但 * 会 * 在更宽松的标准下匹配的行

然后我可以把这个传给我们的空间团队看看

======================

我从空间团队那里得到了这个-非常感谢Hans/Albert。我也强烈建议你参加他们的正常办公时间会议

所有空间谓词都包括 “模糊性” 的概念。这是一个基本要求,因为从本质上讲,所有空间信息 (坐标) 都意味着一定程度的准确性。在Oracle Spatial中,它由为每个表指定的公差设置表示。在空间元数据中指定了所有包含空间数据的表所需的空间元数据,并根据最终用户处理的空间数据的准确性,由最终用户正确指定。

它是通过在USER_SDO_GEOM_METADATA视图中插入信息来设置的:

insert into user_sdo_geom_metadata (table_name, column_name, diminfo, srid)
values (
  'LAND_PARCELS',
  'SHAPE',
  sdo_dim_array(
    sdo_dim_element ('Long',-180, 180, 0.5),
    sdo_dim_element ('Lat',-90, 90, 0.5)
  ),
  4326
);


insert into user_sdo_geom_metadata (table_name, column_name, diminfo, srid)
values (
  'MARKERS',
  'LOCATION',
  sdo_dim_array(
    sdo_dim_element ('Long',-180, 180, 0.5),
    sdo_dim_element ('Lat',-90, 90, 0.5)
  ),
  4326
);


在这个例子中,我们假设坐标是地理 (经度/纬度GPS坐标)。公差在最后一个参数中指定为sdo_dim_element(): 0.5,这里表示50厘米 (½ m)。对于投影数据,公差以该投影中的坐标为单位 (通常为米,但某些投影使用英尺)。

所以,这个查询:

select l.parcel_id, ...
from land_parcels l, markers m
where m.marker_id = 'MK21-HR'
and sdo_anyinteract (l.shape, m.location) = 'TRUE';


将返回包含所选标记的所有地块-或更准确地说,是那些形状在该标记周围的50厘米缓冲区内的地块。这也意味着它可能返回多个匹配项,因为多个地块相交

但更重要的是,请注意,这是使用sdo_anyinteract谓词。使用sdo_contains谓词将返回不同的结果: 它将仅返回严格包含点的那些多边形,即具有其虚拟50厘米 “缓冲区” 的点完全包含在多边形内。

因此,不仅要理解宽容的概念,而且要理解空间谓词的含义。这些谓词是基于一个众所周知的概念定义的,称为九个相交模型,该模型通过描述几何形状的内部,边界和外部如何相互作用来形式化几何形状相互作用的方式。见https://en.wikipedia.org/wiki/DE-9IM有关详细信息。

简而言之:

-INSIDE(A,B) /containe (B,A) 表示A完全在B内部,即它不接触B的边界。包含 (B,A) 与内部 (A,B) 相反
-COVEREDBY(A,B)/COVERS (B,A) 表示A在B内部,但其边界触及B的边界
-触摸 (A,B) 表示A和B相邻: 只有它们的边界接触
-重叠 (A,B) 表示A和B的边界以某种方式相交
-相等 (A,B) 表示A和B在拓扑上相同。
-ANYINTERACT(A,B) 是指A和B以上述任何一种方式进行交互。

所有这些都在分配的容差内执行。例如,只要两个相邻的包裹在指定的公差内,它们就会被发现接触。这意味着例如,如果公差设置为50厘米,则将被40厘米宽的条带分开的两个包裹视为接触。如果公差设置为20厘米,则将它们视为不相交。

匹配点和多边形可能很棘手。我们可能会认为,给定多边形 (不重叠) 和点的覆盖范围,一个点将始终位于一个多边形中。然而,一旦你引入宽容,情况就不一定如此。有些点显然会清楚地在多边形内部,而有些则清楚地在外面。但是有些是模棱两可的: 它们在多边形的 “边界” 上-或更准确地说,它们落在边界周围的小缓冲区中,其宽度由公差 (例如50厘米) 设置。这意味着以下几点:

-使用INSIDE() 或contain () 时,这些点将不在多边形中,也不会在相邻的多边形中。计算每个多边形中有多少点的查询不会计算它们
-使用ANYINTERACT() 时,这些点将在多边形中,也将在相邻的多边形中。计算每个多边形中有多少点的查询将对它们进行两次计数 (如果该点恰好在三个或更多多边形相遇的地方附近,则计算更多)。

应用程序必须准备好处理这些奇怪的事情。例如: 使用ANYINTERACT(),将点分配给第一个匹配的多边形。或者最大的一个。或基于其他列的任何其他条件…

https://docs.oracle.com/en/database/oracle/oracle-database/21/spatl/spatial-concepts.html#GUID-7469388B-6D23-4294-904F-78CA3B7191D3有关公差概念及其使用方式的详细信息。

https://docs.oracle.com/en/database/oracle/oracle-database/21/spatl/spatial-concepts.html#GUID-FA71CB03-FFF0-4529-BA07-AD0605DA7A89有关在Oracle中实现的空间运算符和九个相交模型的解释。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论