基于周界点的多边形 - oracle 空间

Posted

技术标签:

【中文标题】基于周界点的多边形 - oracle 空间【英文标题】:polygon based on perimeter points - oracle spatial 【发布时间】:2013-06-15 12:13:48 【问题描述】:

我有一张带积分的表格。我想根据这些点创建多边形,然后只返回周长上的这些点(不包括多边形内的点)。有没有使用 SDO GEOMETRY 在数据库级别执行此操作的简单方法?我发现像 GrahamScan 一样的东西,但我找不到类似 Spatial 的东西

【问题讨论】:

首先如何定义一组无序点的周长?您是否正在寻找一组点的凸包(如果您不知道它是什么,请用谷歌搜索)? 【参考方案1】:

对于 Oracle 提供的内置软件包,我想不出任何简单的答案。如果你想在 Oracle 中解决这个问题,你可能不得不考虑编写一些相当糟糕的代码来做到这一点。

一个俗气的解决方案可能是将其分解为几个步骤:

    暴力破解每组两点之间的所有可能线(选择点的笛卡尔积,将它们构造成线): 查找与任何其他线(最外周)不相交的所有线并获取点值。 将点值连接回原始表以检索任何数据(如有必要)。

这可能不会很好地执行或扩展,但如果您的数据集不是很大,它应该可以工作。

这是一个简单的说明(未经测试的 SQL)...

输入:

SELECT sdo_geometry(2001, NULL, sdo_point_type(tbl.x, tbl.y,  NULL), NULL, NULL)
FROM my_table tbl

坐标的笛卡尔积转换为线:

WITH point_cartesian AS (
  SELECT 
    tbl.x x1
  , tbl.y y1
  , tbl2.x x2
  , tbl2.y y2
  FROM my_table tbl
  CROSS JOIN my_table tbl2
  WHERE tbl.x != tbl2.x 
  OR tbl.y != tbl2.y
)
SELECT sdo_geometry(
  2002
, NULL
, NULL
, sdo_elem_info_array(1, 2, 1)
, sdo_ordinate_array(x1, y1, x2, y2)
)
FROM point_cartesian

确定所需的行:

WITH point_cartesian AS (
  SELECT 
    tbl.x x1
  , tbl.y y1
  , tbl2.x x2
  , tbl2.y y2
  FROM my_table tbl
  CROSS JOIN my_table tbl2
  WHERE tbl.x != tbl2.x 
  OR tbl.y != tbl2.y
)
, lines AS (
  SELECT sdo_geometry(
    2002
  , NULL
  , NULL
  , sdo_elem_info_array(1, 2, 1)
  , sdo_ordinate_array(x1, y1, x2, y2)
  ) geom
  , ROWNUM line_id
  FROM point_cartesian
)
SELECT *
FROM lines l1
WHERE NOT EXISTS (
  SELECT 1
  FROM lines l2
  WHERE l2.line_id != l1.line_id
  AND sdo_geom.sdo_intersect (l1.geom, l2.geom, 0.05) IS NOT NULL
)

请注意:SQL 未经测试,但希望您能理解。

【讨论】:

【参考方案2】:

如果数据确实像第一个答案中描述的那样,那么最简单和最快的方法就是在您的点集周围获取凸包。假设您的输入是表 MY_TABLE,其中包含两列 X 和 Y,分别代表经度和纬度(因此 SRID 为 4326):

select sdo_aggr_convexhull (
         sdoaggrtype (
           sdo_geometry(2001, 4326, sdo_point_type(x, y,  NULL), NULL, NULL),
           0.5
         )
       )
from my_table;

结果是一个使用周长点构造的多边形。

【讨论】:

以上是关于基于周界点的多边形 - oracle 空间的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 空间 - 逆时针检查多边形顶点

地理围栏:使用 oracle 空间查找多边形内的要素数量(点/线/多边形)

JTS 空间数据关系分析

JTS 空间数据关系分析

休眠空间多边形坐标方向

查找与指定方向的空间点的最近距离