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

时间:2019-04-12 11:29:30

标签: sql oracle function spatial

对于给定的要素(线或面)及其所有成员,我需要提取(1)个顶点的坐标, 所有 ,<2> strong> 第一个 顶点和(3) 最后一个 顶点( 3个独立的查询来创建 3组不同的结果

我正在使用Oracle空间。

我已经针对表ARAMAL(这是一个3d线实体;主键列:IPID;几何列:GEOMETRY)测试了该sql代码,并且效果很好。

  • (1)-列出 所有 个顶点

    从ARAMAL中选择A.IPID,t.X,t.Y,t.Z,t.id TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY))t通过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)-列出 第一个 顶点

    从ARAMAL中选择A.IPID,t.X,t.Y,t.Z,t.id TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY))t其中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;
/

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

  • 对于在我应该如何使用/应用它们以获取所需结果(以及格式)之前使用过的ARAMAL表?

IPID X Y Z id

1479723 -99340.38408 -102364.3603 10 1

....

预先感谢, 最好的祝福, 佩德罗

1 个答案:

答案 0 :(得分:0)

使用空间数据并不重要,您对给定的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; 的行感兴趣,因此可以在此处运行它:

row_number()

demo

有多种方法可以获取最后一行,您可以使用top-n子查询,就像该网站上的许多 if (options.removeAllQueryParameters) { for (const key of urlObj.searchParams.keys()) { urlObj.searchParams.delete(key); } } 问题一样。