Sql most所涵盖的Oracle空间几何体

Sql most所涵盖的Oracle空间几何体,sql,oracle,oracle-spatial,Sql,Oracle,Oracle Spatial,我有一个包含许多几何图形的表格。我试图提取另一个几何体覆盖最广的几何体 这最好用图片和代码来解释 目前,我正在进行这个简单的空间查询,以获取与传入的WKT几何体进行空间交互的任何行 SELECT ID, NAME FROM MY_TABLE WHERE sdo_anyinteract(geom, sdo_geometry('POLYGON((400969 95600,402385 95957,402446 95579,400905 95353,400969 95600))',27700))

我有一个包含许多几何图形的表格。我试图提取另一个几何体覆盖最广的几何体

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

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

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';
效果很好,返回一组行,这些行以任何方式与传入的几何体交互

不过,我更想知道的是,我通过的几何学课程中,哪一门课程覆盖得最多。考虑这个图像。

彩色方块代表“我的桌子”。顶部的黑色多边形表示我正在搜索的传入几何体。我想从这里返回的结果是多边形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\u AREA
的新列,该列提供了该区域。然后我可以对其进行排序并选择最大的数字。

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

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

返回:

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;

如果您想返回交点的几何图形,只需将其包含在结果集中。

我只是在我的问题中添加了我自己的示例,因为我认为它可能会有用。不过,您的示例要好得多。非常感谢!您的示例是正确的。请记住按DESC进行排序,以按降序获得结果(首先是最大面积)。
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;