0

我有很多多边形和很多点,并且想要找到一个点,这样当在该点和多边形之间绘制一条线时,它不会与任何其他多边形相交。所以基本上我需要一个非常接近多边形的点,并且它们之间没有其他多边形。

我尝试了以下查询,它给了我所有的点,无论它们是否被多边形相交。

SELECT P.POINTLOC from pointTable P WHERE NOT MDSYS.SDO_OVERLAPBDYINTERSECT(P.POINTLOC," +
            "MDSYS.SDO_GEOMETRY(2003,null,null,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1)," +
"MDSYS.SDO_ORDINATE_ARRAY(4, 226, 150, 254, 164, 240, 191, 212, 176,4,226)))    = 'TRUE'";

Then I tried this query and it gives some correct points but miss a few correct points:

SELECT P.POINTLOC from pointTable P WHERE MDSYS.SDO_WITHIN_DISTANCE(P.POINTLOC," +
            "MDSYS.SDO_GEOMETRY(2003,null,null,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1)," +
"MDSYS.SDO_ORDINATE_ARRAY(4, 226, 150, 254, 164, 240, 191, 212, 176,4,226)),'distance = 40')    = 'TRUE'";

有人能指出哪个 Oracle 空间运算符最适合这种情况吗?

4

1 回答 1

0

听起来您正在寻找 Nearest Neighbor 实现 - Oracle 提供了 Spatial operator SDO_NN

您可以在此处找到更多详细信息:http: //docs.oracle.com/database/121/SPATL/sdo_operat.htm#SPATL1032

这只会让你到目前为止,因为它会找到离多边形最近的点,但它不能保证你的点和目标多边形之间没有多边形。我怀疑如果你想确保这一点,你必须要有创意。

我的方法是:

  1. 用于SDO_NN获取最近的点或点
  2. 用于SDO_GEOM.SDO_CENTROID查找多边形重心
  3. 创建一个SDO_GEOMETRY连接两个点的查询/内存线
  4. 将此作为NOT EXISTS子句的基础,以排除多边形与该线相交的点

可能类似于以下未经测试/未完成的示例:

SELECT *
FROM points pnt
WHERE sdo_nn(pnt.point, sdo_geometry(your polygon here)) = 'TRUE' -- fill this with your polygon
AND NOT EXISTS (
  SELECT 1
  FROM polygons plg
  WHERE sdo_geom.sdo_intersection(
    plg.polygon
  , sdo_geometry(
      2002
    , NULL -- oracle srid
    , NULL -- point
    , sdo_elem_info_array(1, 2, 1) -- line
    , sdo_ordinate_array(
      , sdo_geom.sdo_centroid(
          sdo_geometry(your polygon here) -- fill this with your polygon
        , 0.05
        ).x
      , sdo_geom.sdo_centroid(
          sdo_geometry(your polygon here) -- fill this with your polygon
        , 0.05 -- tolerance
        ).t
      , pnt.point.sdo_point.x
      , pnt.point.sdo_point.y
      ) -- line between point and polygon centroid
    )
  , 0.05 -- tolerance
  ) = 'TRUE'
) 

根据您的数据集/性能,您可能希望使用集合或循环在 PL/SQL 中执行其中一些操作。

上面的例子有点粗糙和准备好了,但我希望你能明白要点。

于 2014-11-24T21:24:29.847 回答