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

问题描述 投票:0回答:1

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

我正在使用Oracle Spatial。

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

  • (1) - 列出所有顶点 SELECT A.IPID,t.X,t.Y,t.Z,t.id FROM ARAMAL A,TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY))t ORDER BY A.IPID,t.id;

结果(IPID = 1479723的示例):

IPID X Y Y 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 FROM ARAMAL A,TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY))t其中t.id = 1 ORDER BY A.IPID;

结果(IPID = 1479723的示例)

IPID X Y Y id

1479723 -99340.38408 -102364.3603 10 1

  • (3)如何使用sql(无附加函数)纯粹获取最后一个顶点?

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

IPID X Y Y 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;
/

我是这个世界的新手,我真的没有得到这些功能的语法......

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

IPID X Y Y id

1479723 -99340.38408 -102364.3603 10 1

....

在此先感谢,最好的问候,佩德罗

sql oracle function spatial
1个回答
0
投票

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

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问题。

© www.soinside.com 2019 - 2024. All rights reserved.