问题描述
嗨,
我正在运行这个脚本对数据库:
这功能正常。我已经基于c.a.设置了元数据。5 m公差。
但是现在我收到了一个功能要求,这将检查某些请求的更高容忍度,因为我们可能会以较低的精度获得坐标。
基本上,需要的是,不仅仅是找到点,它会返回一个正值,如果该点在该点的定义半径内。有没有办法动态地做到这一点。请求来自java应用程序。
希望我的问题足够清楚。
提前谢谢。
额外信息。
试图在livesql上进行设置,但由于插入语句很大,因此无法设置。它是一个具有几千个点的SDO_GEOMETRY。有什么方法可以将其作为文件上传给您?
我正在运行这个脚本对数据库:
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视图中插入信息来设置的:
在这个例子中,我们假设坐标是地理 (经度/纬度GPS坐标)。公差在最后一个参数中指定为sdo_dim_element(): 0.5,这里表示50厘米 (½ m)。对于投影数据,公差以该投影中的坐标为单位 (通常为米,但某些投影使用英尺)。
所以,这个查询:
将返回包含所选标记的所有地块-或更准确地说,是那些形状在该标记周围的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中实现的空间运算符和九个相交模型的解释。
-符合您当前标准的行
-与您当前标准不匹配但 * 会 * 在更宽松的标准下匹配的行
然后我可以把这个传给我们的空间团队看看
======================
我从空间团队那里得到了这个-非常感谢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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




