我正在尝试查找oracle11g服务器上的多边形覆盖的所有点。在内部和包含返回逻辑值,但covers和covered总是false。我误解了这一点吗?当点在矩形多边形的中间时,如果包含为真,那么覆盖不应该是真的吗?
创建表
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)));将所有数据与所有数据相关联,并查看掩码返回true/false。
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


发布于 2021-10-11 13:01:19
从Spatial Relationships and Filtering documentation
与COVERS相反,一个对象的边界和内部完全包含在另一个对象的内部或边界中,它们的内部相交,并且一个对象的边界或内部与另一个对象的边界相反。A COVEREDBY B暗示B COVERS A.

关系为假的原因是“一个对象的边界或内部与另一个对象的边界相交”的最终条件。因为你的点和矩形没有相交的边界,所以它们既不是COVER,也不是COVEREDBY。
https://stackoverflow.com/questions/69526111
复制相似问题