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
相关产品推荐
相关产品推荐

