首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDO_RELATE ANYINTERACT不适用于2d地理坐标中的点

SDO_RELATE ANYINTERACT不适用于2d地理坐标中的点
EN

Stack Overflow用户
提问于 2015-05-21 15:21:11
回答 1查看 3.7K关注 0票数 3

最初的问题是,我试图找出集合中的一个点是否在给定的多边形内。我没有得到任何结果,所以我把它简化为一个最简单的例子,但仍然没有结果。

多边形的几何形状如下(坐标中心周围的小方格):

代码语言:javascript
复制
geom1 := SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1),     
SDO_ORDINATE_ARRAY(10,10, 10,-10, -10,-10, -10,10))

现在我试着找出,如果点[0,0]在这个多边形内使用SDO_RELATE。

代码语言:javascript
复制
sdo_relate(geom1, 
        SDO_GEOMETRY('MULTIPOINT((0 0))',8307),
       'mask=anyinteract')

我用过anyinteract,因为根据Oracle文档

物体是不相交的。

多边形内的点显然与它不相交。因此,我花了大约一个小时尝试以不同的方式初始化这些点,并检查坐标和所有内容,然后尝试将CONTAINS放在那里而不是ANYINTERACT,最后得到所需的输出。

所以我的问题是:

  • 这是个虫子吗?contains参数显然比anyinteract更严格
  • 检查集合中的任何点是否位于多边形中的最佳方法是什么?包含在这里没有帮助,因为如果有任何点在外部,那么SDO_RELATE的结果是假的。没有比anyinteract更合适的交叉口类型了,它不起作用。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-22 09:07:41

首先,你的多边形是畸形的:它不关闭。对于多边形,最后一点必须与第一点相匹配。您可以通过执行以下操作来检测错误:

代码语言:javascript
复制
SQL> select sdo_geom.validate_geometry_with_context (SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(10,10, 10,-10, -10,-10, -10,10)), 0.05) from dual;

13348 [Element <1>] [Ring <1>]    
1 row selected.

ORA-13348: polygon boundary is not closed

一旦纠正了这个错误,就会得到一个不同的错误:

代码语言:javascript
复制
SQL> select sdo_geom.validate_geometry_with_context (SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(10,10, 10,-10, -10,-10, -10,10, 10,10)), 0.05) from dual;

13367 [Element <1>] [Ring <1>]
1 row selected.

ORA-13367: wrong orientation for interior/exterior rings

对于多边形,点必须是逆时针方向.一旦纠正了这一点,多边形就正确了:

代码语言:javascript
复制
SQL> select sdo_geom.validate_geometry_with_context (SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(10,10, -10,10, -10,-10, 10,-10, 10,10)), 0.05) from dual;

TRUE
1 row selected.

查询正常工作。下面是一个示例:

代码语言:javascript
复制
create table t1 (id number, note varchar2(20), geom sdo_geometry);

insert into t1 (id, note, geom) 
values (
 1,
 'Not closed',
 SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(10,10, 10,-10, -10,-10, -10,10))
);

insert into t1 (id, note, geom) 
values (
 2,
 'Wrong orientation',
 SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(10,10, 10,-10, -10,-10, -10,10, 10,10))
);

insert into t1 (id, note, geom) 
values (
 3,
 'Valid',
 SDO_GEOMETRY(2003, 8307, null, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(10,10, -10,10, -10,-10, 10,-10, 10,10))
);

commit;

insert into user_sdo_geom_metadata (table_name, column_name, diminfo, srid)
values (
  'T1',
  'GEOM', 
  sdo_dim_array (
    sdo_dim_element ('Long',-180,180,0.5),
    sdo_dim_element ('Lat',-90,90,0.5)
  ),
  8307
);
commit;

create index t1_sx on t1 (geom) indextype is mdsys.spatial_index;

测试表包含多边形的三个变体。让我们尝试一个查询:

代码语言:javascript
复制
select *
from t1
where sdo_relate(
  geom, 
  SDO_GEOMETRY('MULTIPOINT((0 0))',8307),
  'mask=anyinteract'
) = 'TRUE';

返回正确的结果:只有有效的多边形被正确地标识为包含您的点:

代码语言:javascript
复制
        ID NOTE                 GEOM(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
---------- -------------------- -------------------------------------------------------------------------------
         3 Valid                SDO_GEOMETRY(2003, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(10, 10, -10, 10, -10, -10, 10, -10, 10, 10))

1 row selected.

至于ANYINTERACT与包含点在多边形之间的区别,它可以影响多边形边界上的点(或者更准确地说是在边界公差范围内)。ANYINTERACT搜索返回这些。“包含/内部搜索”没有。

这可能很重要,例如,当您想要将点分发到多边形(如销售区域中的客户点位置)以及一些客户位置点恰好落在相邻区域之间的边界时: ANYINTERACT搜索将报告这些位置位于和两个区域中。内部搜索将报告他们在和。

最后,对查询使用更简单的语法:

代码语言:javascript
复制
select *
from t1
where sdo_anyinteract(
  geom, 
  SDO_GEOMETRY('MULTIPOINT((0 0))',8307)
) = 'TRUE';

关于如何获取与错误代码相对应的消息的一些信息(如13348)。我通常使用这样的技巧:

代码语言:javascript
复制
set serveroutput on
exec dbms_output.put_line(sqlerrm(-13348))

它将打印出完整的错误消息。注意,必须用减号传递错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30377947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档