Oracle SDO#u与任何互动不';不要在二维地理坐标中使用点
最初的问题是,我试图找出集合中的一个点是否在给定的多边形内。我没有得到结果,所以我把它简化为一个最简单的例子,但仍然没有得到结果 多边形几何体如下所示(围绕坐标中心的小正方形): 现在我想用SDO_RELATE找出点Oracle SDO#u与任何互动不';不要在二维地理坐标中使用点,oracle,oracle-spatial,Oracle,Oracle Spatial,最初的问题是,我试图找出集合中的一个点是否在给定的多边形内。我没有得到结果,所以我把它简化为一个最简单的例子,但仍然没有得到结果 多边形几何体如下所示(围绕坐标中心的小正方形): 现在我想用SDO_RELATE找出点[0,0]是否在多边形内 sdo_relate(geom1, SDO_GEOMETRY('MULTIPOINT((0 0))',8307), 'mask=anyinteract') 我使用了anyinteract,因为根据: ANYINTERACT:
[0,0]
是否在多边形内
sdo_relate(geom1,
SDO_GEOMETRY('MULTIPOINT((0 0))',8307),
'mask=anyinteract')
我使用了anyinteract
,因为根据:
ANYINTERACT:对象是不相交的
多边形内的点显然与它不相交。因此,我花了大约一个小时尝试以不同的方式初始化点,并检查坐标和所有内容,然后尝试将包含而不是ANYINTERACT
放在那里,并最终获得所需的输出
因此,我的问题是:
- 这是虫子吗?
contains
参数显然比anyinteract
- 检查集合中的任何点是否位于多边形中的最佳方法是什么?Contains在这里没有帮助,因为如果任何点位于外部,则ODSDO_RELATE的结果为false。没有比
anyinteract
更合适的交叉点类型了,它不起作用李>
首先,您的多边形格式不正确:无法关闭。对于多边形,最后一点必须与第一点匹配。您可以通过执行以下操作来检测错误:
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
并且查询工作正常。以下是一个例子:
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;
测试表包含多边形的三个变体。让我们尝试一个查询:
select *
from t1
where sdo_relate(
geom,
SDO_GEOMETRY('MULTIPOINT((0 0))',8307),
'mask=anyinteract'
) = 'TRUE';
返回正确的结果:只有有效的多边形被正确标识为包含您的点:
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和CONTAINS之间的差异,它可能会影响多边形边界上的点(或者更准确地说,在边界公差范围内)。ANYINTERACT搜索返回这些。包含/内部搜索不包含
例如,当您要将点分布到多边形(如销售区域中的客户点位置)并且一些客户点恰好落在相邻区域之间的边界上时,这一点非常重要:ANYINTERACT搜索将报告这些位置同时位于两个区域中。内部搜索将报告它们都不在中
最后,对查询使用更简单的语法:
select *
from t1
where sdo_anyinteract(
geom,
SDO_GEOMETRY('MULTIPOINT((0 0))',8307)
) = 'TRUE';
有关如何获取与错误代码对应的消息的一些信息(如13348)。我通常使用这种技巧:
set serveroutput on
exec dbms_output.put_line(sqlerrm(-13348))
这将打印出完整的错误消息。请注意,必须用减号传递错误 非常感谢!我一直在插入错误的多边形,并认为我做的是正确的。你在哪里看到这些错误?例如,当我运行您发布的第一个select时,我只得到13348[Element][Ring]
,但没有错误。我打开了dbms控制台。我明白了。。。13348是错误。一切都好。对不起,甲骨文诅咒你:)我不想模糊我的解释。但13348是错误代码。下面的文本就是相应的消息。我会更新我的答案,了解如何获得信息。
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.
select *
from t1
where sdo_anyinteract(
geom,
SDO_GEOMETRY('MULTIPOINT((0 0))',8307)
) = 'TRUE';
set serveroutput on
exec dbms_output.put_line(sqlerrm(-13348))