You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询包含多个多边形的MDSYS.SDO_GEOMETRY对象?

问题描述

我有一个包含2个多边形的MDSYS.SDO_GEOMETRY对象:

MDSYS.SDO_GEOMETRY(
  2003,
  32723,
  NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,11,1003,1),
  MDSYS.SDO_ORDINATE_ARRAY(
-47.907596018183,-15.823197195244,
-47.90770574636,-15.824928365549,
-47.906349238544,-15.82507008862,
-47.906743123853,-15.822948594956,
-47.907596018183,-15.823197195244, --- end of coordinate 1
-47.910025764977,-15.822772155044,
-47.910292291122,-15.827300809061,
-47.908579370537,-15.827056272436,
-47.908374813318,-15.823197247034,
-47.910025764977,-15.822772155044))

执行以下查询时,仅返回第一个多边形:

SELECT
cd_geomet,
cd_empr,
cd_estud,
cd_demand,
SDO_UTIL.TO_WKTGEOMETRY(ge_geomet) AS ge_geomet,
dt_cad
FROM
    "ALG"."TS_ALG_GEOMET"
WHERE
    "CD_DEMAND" = 589;

查询返回结果:

POLYGON ((-47.907596018183 -15.823197195244, 
        -47.90770574636 -15.824928365549, 
        -47.906349238544 -15.82507008862, 
        -47.906743123853 -15.822948594956, 
        -47.907596018183 -15.823197195244))

我尝试了以下查询,结果仍相同:

SELECT
    cd_geomet,
    cd_empr,
    cd_estud,
    cd_demand,
    SDO_UTIL.TO_WKTGEOMETRY_VARCHAR(ge_geomet) AS ge_geomet,
    dt_cad
 FROM
    "ALG"."TS_ALG_GEOMET"
WHERE
    "CD_DEMAND" = 589;

执行以下查询得到1个元素、2个环的结果,对应这两个多边形,但无法完整返回它们:

SELECT SDO_UTIL.GETNUMELEM(ge_geomet) AS num_elem, 
SDO_UTIL.GETNUMRINGS(ge_geomet) AS num_rings
FROM ALG.TS_ALG_GEOMET WHERE CD_GLA_GEOMET = 3;

请问如何返回这2个多边形?


解决方法

原因分析

你的SDO_GEOMETRY对象类型代码是2003(单个多边形),但内部包含两个独立的环。Oracle的TO_WKTGEOMETRY会默认仅解析单个多边形,因此只返回第一个环对应的多边形。

方案1:将几何对象转换为多多边形类型(推荐)

如果这两个多边形是独立的,正确的类型应该是多多边形(MULTIPOLYGON),类型代码为2007。可以通过以下语句更新几何对象:

UPDATE "ALG"."TS_ALG_GEOMET"
SET ge_geomet = MDSYS.SDO_GEOMETRY(
  2007,
  ge_geomet.SDO_SRID,
  NULL,
  ge_geomet.SDO_ELEM_INFO,
  ge_geomet.SDO_ORDINATES
)
WHERE "CD_DEMAND" = 589;
COMMIT;

更新后,再执行原来的TO_WKTGEOMETRY查询,会返回完整的MULTIPOLYGON格式,包含两个多边形。

方案2:使用SDO_UTIL.EXTRACT拆分单个多边形

如果不想修改原有几何对象,可以用SDO_UTIL.EXTRACT函数提取每个环对应的多边形:

SELECT
    cd_geomet,
    cd_empr,
    cd_estud,
    cd_demand,
    SDO_UTIL.TO_WKTGEOMETRY(SDO_UTIL.EXTRACT(ge_geomet, 1, rownum)) AS single_polygon,
    dt_cad
FROM
    "ALG"."TS_ALG_GEOMET"
WHERE
    "CD_DEMAND" = 589
CONNECT BY rownum <= SDO_UTIL.GETNUMRINGS(ge_geomet);

这个查询会返回两行结果,每行对应一个独立的多边形。


内容的提问来源于stack exchange,提问作者CORRIDAS DE BOLINHAS DE GUDE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:04:56