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

Oracle 18c如何提取SDO_GEOMETRY线顶点存入SDO_GEOMETRY_ARRAY点数组

Oracle 18c 线要素转SDO_GEOMETRY点数组实现方法

完全可以用Oracle Spatial原生函数实现,不需要自定义坐标解析逻辑,核心实现逻辑如下:

  • 用SDO_UTIL.GETVERTICES函数把线对象拆成逐顶点的坐标记录,函数会直接返回每个顶点的x、y、z属性值
  • 对每个提取到的顶点,用坐标值构造点类型的SDO_GEOMETRY对象,直接继承原线要素的SRID坐标系,避免空间参考不一致
  • 用COLLECT函数把同一条线对应的所有点对象聚合,最后强转为MDSYS.SDO_GEOMETRY_ARRAY类型即可

直接运行以下SQL就能得到预期结果:

with data (asset_id, shape) as (
  select 100, sdo_geometry('linestring (10 20, 30 40)')                       from dual union all
  select 200, sdo_geometry('linestring (50 60, 70 80, 90 100)')               from dual union all
  select 300, sdo_geometry('linestring (110 120, 130 140, 150 160, 170 180)') from dual
)
select 
  asset_id,
  cast(
    collect(
      sdo_geometry(
        2001, -- 2D点的类型常量
        shape.sdo_srid,
        sdo_point_type(t.x, t.y, null),
        null,
        null
      )
    ) as MDSYS.SDO_GEOMETRY_ARRAY
  ) as point_array
from data,
table(sdo_util.getvertices(shape)) t -- 炸开线要素生成逐顶点记录
group by asset_id;

执行返回结果和要求的格式完全匹配:

  • ASSET_ID=100的线包含2个顶点,返回长度为2的点数组
  • ASSET_ID=200的线包含3个顶点,返回长度为3的点数组
  • ASSET_ID=300的线包含4个顶点,返回长度为4的点数组

不同场景的调整说明:

  • 如果处理带Z值的3D线,把点构造函数里z位的null替换为t.z,同时把gtype参数从2001改成3001即可
  • 如果线带M测量值,对应调整gtype参数、传入测量值即可适配
  • 这套逻辑不需要修改核心代码,也可以直接用来提取面要素的所有边界顶点

内容的提问来源于stack exchange,提问作者User1974

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:09:29