Oracle Spatial Geometry 涵盖最多
Oracle Spatial Geometry covered by the most
我有一个 table,其中包含许多几何图形。我正在尝试提取被另一个几何体覆盖最多的那个。
最好用图片和代码来解释。
目前我正在执行这个简单的空间查询以获取与传入的 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';
效果很好,returns 一堆行与我传入的几何体以任何方式交互。
不过,我最想要的是找到我传入的几何图形覆盖最多的一个。考虑这张图片。
彩色方块代表 'MY_TABLE'。顶部的黑色多边形代表我正在搜索的传入几何体。我想要从中返回的结果是 Polygon 2,因为这是被我的多边形覆盖最多的那个。这可能吗?有什么我可以用来提取覆盖率并按此排序的东西,或者一种简单的方法 returns 只有那个结果?
--编辑--
只是为了补充已接受的答案(你应该往下投赞成票,因为它是这个的全部基础)这就是我最终得到的。
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;
这 returns 我将所有与我的查询多边形相交的结果与一个名为 INTERSECT_AREA
的新列相交,该列提供了面积。然后我可以对其进行排序并选择最大的数字。
只需计算每个 returned 几何与您的查询 window 之间的交集(使用 SDO_GEOM.SDO_INTERSECTION()
),计算每个此类交集的面积(使用 SDO_GEOM.SDO_AREA()
)和return面积最大的行(结果按计算面积降序排列,只保留第一行)。
例如,以下计算 space 黄石国家公园在其覆盖的每个州所占的面积。结果按区域排序(降序)。
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;
哪个 returns:
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.
以下变体还 return 公园表面在每个相交状态下的百分比:
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;
如果您想要 return 交叉点的几何形状,只需将其包含到您的结果集中即可。
我有一个 table,其中包含许多几何图形。我正在尝试提取被另一个几何体覆盖最多的那个。
最好用图片和代码来解释。
目前我正在执行这个简单的空间查询以获取与传入的 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';
效果很好,returns 一堆行与我传入的几何体以任何方式交互。
不过,我最想要的是找到我传入的几何图形覆盖最多的一个。考虑这张图片。
彩色方块代表 'MY_TABLE'。顶部的黑色多边形代表我正在搜索的传入几何体。我想要从中返回的结果是 Polygon 2,因为这是被我的多边形覆盖最多的那个。这可能吗?有什么我可以用来提取覆盖率并按此排序的东西,或者一种简单的方法 returns 只有那个结果?
--编辑--
只是为了补充已接受的答案(你应该往下投赞成票,因为它是这个的全部基础)这就是我最终得到的。
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;
这 returns 我将所有与我的查询多边形相交的结果与一个名为 INTERSECT_AREA
的新列相交,该列提供了面积。然后我可以对其进行排序并选择最大的数字。
只需计算每个 returned 几何与您的查询 window 之间的交集(使用 SDO_GEOM.SDO_INTERSECTION()
),计算每个此类交集的面积(使用 SDO_GEOM.SDO_AREA()
)和return面积最大的行(结果按计算面积降序排列,只保留第一行)。
例如,以下计算 space 黄石国家公园在其覆盖的每个州所占的面积。结果按区域排序(降序)。
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;
哪个 returns:
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.
以下变体还 return 公园表面在每个相交状态下的百分比:
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;
如果您想要 return 交叉点的几何形状,只需将其包含到您的结果集中即可。