Oracle 18c如何获取SDO_GEOMETRY线各顶点的点几何行
Oracle 18c 逐行返回线要素顶点对应点几何的实现方案
你已经在用的sdo_util.getvertices()本身就能返回每个顶点的序号、坐标值,直接基于这些返回值构造SDO_GEOMETRY点对象即可,不需要依赖未公开函数,兼容性和稳定性都更好。
实现代码
with cte as ( select 100 as asset_id, sdo_geometry('linestring (10 20, 30 40)') shape from dual union all select 200 as asset_id, sdo_geometry('linestring (50 60, 70 80, 90 100)') shape from dual union all select 300 as asset_id, sdo_geometry('linestring (110 120, 130 140, 150 160, 170 180)') shape from dual) select cte.asset_id, v.id as vertex_id, sdo_geometry( 2001, -- 固定值:代表二维点类型 cte.shape.sdo_srid, -- 直接继承原线要素的坐标系 sdo_point_type(v.x, v.y, null), null, null ) as shape from cte, sdo_util.getvertices(shape) v
返回结果
执行后输出格式完全匹配预期:
ASSET_ID VERTEX_ID SHAPE ---------- ---------- ---------------- 100 1 [SDO_GEOMETRY] 100 2 [SDO_GEOMETRY] 200 1 [SDO_GEOMETRY] 200 2 [SDO_GEOMETRY] 200 3 [SDO_GEOMETRY] 300 1 [SDO_GEOMETRY] 300 2 [SDO_GEOMETRY] 300 3 [SDO_GEOMETRY] 300 4 [SDO_GEOMETRY]
补充说明
- 如果你的线要素是带Z值的三维数据,只需要把点类型编号从
2001改为3001,同时把sdo_point_type的第三个参数传入v.z即可;如果是带M测量值的线,对应调整点类型编号和参数即可和原数据维度对齐。 - 你提到的未公开函数
SDO_UTIL.GET_COORDINATE(geometry, point_number)虽然也能通过生成顶点序号序列关联的方式实现同样效果,但因为是非公开接口,Oracle不保证跨版本兼容性,不推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

