【问题标题】:How to use sdo_relate covers with Polygon and Point如何使用 sdo_relate 覆盖多边形和点
【发布时间】: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


    【解决方案1】:

    来自Spatial Relationships and Filtering documentation

    • COVERS:一个对象的边界和内部完全包含在另一个对象的内部或边界中,它们的内部相交,一个对象的边界或内部与另一个对象的边界相交。
    • COVEREDBY:与COVERS相反。 A COVEREDBY B 暗示 B COVERS A

    关系为假的原因是“和一个对象的边界或内部与另一个对象的边界相交”的最终条件。由于您的点和矩形没有相交的边界,因此它们既不是 COVER 也不是 COVEREDBY 一个和另一个。

    【讨论】:

    • 我将点放在多边形的边界上,但覆盖不返回 TRUE。如果我对部分位于较大多边形线上的另一个多边形执行此操作,则 COVERS 为这两个多边形返回 TRUE。会不会是积分和COVERS不兼容。
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多