1

我有一个包含许多几何图形的表。我正在尝试提取被另一种几何图形覆盖最多的那个。

这最好用图片和代码来解释。

目前,我正在执行这个简单的空间查询,以获取与传入的 WKT Geometry 进行空间交互的任何行

SELECT ID, NAME FROM MY_TABLE WHERE 
sdo_anyinteract(geom, 
sdo_geometry('POLYGON((400969 95600,402385 95957,402446 95579,400905 95353,400969 95600))',27700)) = 'TRUE';

效果很好,返回一堆以任何方式与我传入的几何交互的行。

不过,我更希望找到我传入的几何图形最能覆盖哪一个。考虑这个图像。

多边形选择示例

彩色块代表“MY_TABLE”。顶部的黑色多边形代表我正在搜索的传入几何图形。我想从中返回的结果是多边形 2,因为这是我的多边形覆盖最多的一个。这可能吗?有什么我可以用来拉入覆盖率并按此排序的方法,还是一种仅返回一个结果的方法?

- 编辑 -

只是为了补充接受的答案(你应该下去并给予支持,因为它是这个的全部基础)这就是我最终得到的。

SELECT name, MI_PRINX, 
SDO_GEOM.SDO_AREA(
  SDO_GEOM.SDO_INTERSECTION(
    GEOM, 
    sdo_geometry('POLYGON((400969.48717156524 95600.59583240788,402385.9445972018 95957.22742049221,402446.64806962677 95579.91508788493,400905.95874489535 95353.03765349534,400969.48717156524 95600.59583240788))',27700)
    ,0.005
  )
,0.005) AS intersect_area 
FROM LIFE_HEATHLAND WHERE sdo_anyinteract(geom, sdo_geometry('POLYGON((400969.48717156524 95600.59583240788,402385.9445972018 95957.22742049221,402446.64806962677 95579.91508788493,400905.95874489535 95353.03765349534,400969.48717156524 95600.59583240788))',27700)) = 'TRUE'
ORDER BY INTERSECT_AREA DESC;

这将返回与我的查询多边形与一个名为 的新列相交的所有结果,该列INTERSECT_AREA提供该区域。然后我可以对它进行排序并选择最高的数字。

4

1 回答 1

2

只需计算每个返回的几何图形与查询窗口之间的交集(使用SDO_GEOM.SDO_INTERSECTION()),计算每个此类交集的面积(使用SDO_GEOM.SDO_AREA())并返回面积最大的行(按计算面积的降序排列结果并仅保留第一行)。

例如,以下计算黄石国家公园在其覆盖的每个州中所占的空间。结果按面积排序(降序)。

SELECT s.state,
       sdo_geom.sdo_area (
         sdo_geom.sdo_intersection (
           s.geom, p.geom, 0.5),
         0.5, 'unit=sq_km') area
  FROM us_states s, us_parks p
 WHERE SDO_ANYINTERACT (s.geom, p.geom) = 'TRUE'
   AND p.name = 'Yellowstone NP'
 ORDER by area desc;

返回:

STATE                                AREA
------------------------------ ----------
Wyoming                        8100.64988
Montana                        640.277886
Idaho                          154.657145

3 rows selected.

要仅保留具有最大交叉点的行,请执行以下操作:

SELECT * FROM (
  SELECT s.state,
         sdo_geom.sdo_area (
           sdo_geom.sdo_intersection (
             s.geom, p.geom, 0.5),
           0.5, 'unit=sq_km') area
    FROM us_states s, us_parks p
   WHERE SDO_ANYINTERACT (s.geom, p.geom) = 'TRUE'
     AND p.name = 'Yellowstone NP'
   ORDER by area desc
)
WHERE rownum = 1;     

给予:

STATE                                AREA
------------------------------ ----------
Wyoming                        8100.64988

1 row selected.

以下变体还返回公园表面在每个相交状态中的百分比:

WITH p AS (
  SELECT s.state,
         sdo_geom.sdo_area (
           sdo_geom.sdo_intersection (
             s.geom, p.geom, 0.5),
           0.5, 'unit=sq_km') area
    FROM us_states s, us_parks p
   WHERE SDO_ANYINTERACT (s.geom, p.geom) = 'TRUE'
     AND p.name = 'Yellowstone NP'
)
SELECT state, area,
       RATIO_TO_REPORT(area) OVER () * 100 AS pct
FROM p
ORDER BY pct DESC;

如果要返回交点的几何形状,只需将其包含到结果集中即可。

于 2015-07-01T06:15:42.083 回答