Oracle - 从顶点坐标提取(第一个,最后一个和所有顶点)

Oracle - Coordinate extraction from vertices (first, last and all vertices)

对于给定的要素(线或区域)及其所有成员,我需要提取 (1) all[=102= 的坐标]顶点,(2)第一个顶点和(3)最后一个 顶点(3 个单独的查询 以创建 3 个不同的结果集

我正在使用 Oracle spatial。

我已经为 table ARAMAL(它是一个 3d 线实体;主键列:IPID;几何列:GEOMETRY)测试了这个 sql 代码,它运行良好。

  • (1) - 列出所有顶点

    SELECT A.IPID, t.X, t.Y, t.Z, t.id 来自 ARAMAL A, TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY)) t ORDER BY A.IPID, t.id;

结果(IPID=1479723 的示例):

IPID X Y Z ID

1479723 -99340.38408 -102364.3603 10 1

1479723 -99341.21035 -102366.2701 11 2

1479723 -99342.03375 -102368.1783 12 3

1479723 -99342.86238 -102370.0875 13 4

……………………

  • (2) - 列出第一个顶点

    SELECT A.IPID, t.X, t.Y, t.Z, t.id 来自 ARAMAL A, TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY)) t where t.id=1 ORDER BY A.IPID;

结果(IPID=1479723 的示例)

IPID X Y Z ID

1479723 -99340.38408 -102364.3603 10 1

  • (3)如何只用sql得到最后一个顶点(没有附加函数)?

(预期)结果(IPID=1479723 的示例)

IPID X Y Z ID

1479723 -99342.86238 -102370.0875 13 4

我想如果我使用特定功能,这个过程可以 运行 更快 - 我也希望能够使用它们。

我遇到了一个很棒的网站 (Simon Greener),其中一些功能我认为可以解决问题

http://spatialdbadvisor.com/oracle_spatial_tips_tricks/322/st_vertexn-extracting-a-specific-point-from-any-geometry

函数是:

ST_StartPoint

CREATE OR REPLACE
FUNCTION ST_StartPoint(p_geom IN mdsys.sdo_geometry)
    RETURN mdsys.sdo_geometry
  IS
  BEGIN
    RETURN ST_PointN(p_geom,1);
  END ST_StartPoint;
/

ST_EndPoint

CREATE OR REPLACE
  FUNCTION ST_EndPoint(p_geom IN mdsys.sdo_geometry)
    RETURN mdsys.sdo_geometry
  IS
  BEGIN
    RETURN ST_PointN(p_geom,-1);
  END ST_EndPoint;
/

我是这个世界的新手,我不太了解这些函数的语法......

  • 对于我之前使用过的table ARAMAL,我应该如何use/apply它们来获得我需要的结果(以及格式)?

IPID X Y Z ID

1479723 -99340.38408 -102364.3603 10 1

.....

提前致谢, 最好的祝福, 佩德罗

如果您正在处理空间数据并不重要,您对给定 ipid 具有最大值 id 的行感兴趣,因此您可以像这里一样 运行 :

select * 
  from (
    select a.ipid, t.x, t.y, t.z, t.id,
           max(t.id) over (partition by a.ipid) mx_id
      from aramal a, table(sdo_util.getvertices(a.geometry)) t)
  where id = mx_id;

demo

有几种方法可以获取最后一行,您可以使用 row_number()、子查询,就像本网站上的许多 top-n 问题一样。