【发布时间】:2021-11-30 04:46:14
【问题描述】:
我正在尝试在 oracle11g 服务器上查找多边形所覆盖的所有点。 内部和包含返回逻辑值,但覆盖和覆盖总是错误的。 我误解了这个吗?当点在矩形多边形的中间时,如果 contains 为真,那么 Covers 不应该为真吗?
创建表
CREATE TABLE geo
(
name varchar(255),
geo MDSYS.SDO_GEOMETRY NOT NULL
);
设置元数据
insert into user_sdo_geom_metadata(table_name, column_name, diminfo, srid)
VALUES (
'GEO',
'GEO',
SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('LONGITUDE',-180, 180, 0.25),
MDSYS.SDO_DIM_ELEMENT('LATITUDE',-90, 90, 0.25)),
4326);
创建空间索引
CREATE INDEX blabla ON geo (geo) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
在 0/0 和 2/2 之间画一个矩形
INSERT INTO geo (name, geo)
VALUES ('SimplePolygon',
sdo_geometry(2003, 4326, null,
sdo_elem_info_array(1, 1003, 1),
sdo_ordinate_array(0, 0,
2, 0,
2, 2,
0, 2,
0, 0)));
在 1/1 上放一个点
INSERT INTO geo(name, geo)
VALUES ('SimplePoint',
sdo_geometry(2001, 4326, null,
sdo_elem_info_array(1, 1, 1),
sdo_ordinate_array(1, 1)));
将所有数据与所有数据关联起来,看看哪个掩码返回真/假。
select
g1.name,
g2.name,
sdo_relate(g1.geo, g2.geo, 'mask=COVEREDBY') as COVEREDBY,
sdo_relate(g1.geo, g2.geo, 'mask=COVERS') as COVERS,
sdo_relate(g1.geo, g2.geo, 'mask=COVERS+INSIDE') as COVERSINSIDE,
sdo_relate(g1.geo, g2.geo, 'mask=INSIDE') as INSIDE,
sdo_relate(g1.geo, g2.geo, 'mask=CONTAINS') as CONTAINS,
sdo_relate(g1.geo, g2.geo, 'mask=ANYINTERACT') as ANYINTERACT,
-- turn around geometry
sdo_relate(g2.geo, g1.geo, 'mask=COVEREDBY') as COVEREDBY2,
sdo_relate(g2.geo, g1.geo, 'mask=COVERS') as COVERS2,
sdo_relate(g2.geo, g1.geo, 'mask=INSIDE') as INSIDE2,
sdo_relate(g2.geo, g1.geo, 'mask=CONTAINS') as CONTAINS2,
sdo_relate(g2.geo, g1.geo, 'mask=ANYINTERACT') as ANYINTERACT2
from geo g1, geo g2
【问题讨论】:
标签: oracle oracle11g geospatial