对于给定的要素(线或面)及其所有成员,我需要提取(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
(预期)结果(例如IPID = 1479723的示例)
IPID X Y Z id
1479723 -99342.86238 -102370.0875 13 4
我想如果使用特定功能,此过程可以运行得更快-我也希望能够使用它们。
我遇到了一个很棒的网站(Simon Greener),其中包含一些我认为可以解决问题的功能
功能是:
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;
/
我是这个世界的新手,我真的不了解这些函数的语法……
IPID X Y Z id
1479723 -99340.38408 -102364.3603 10 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()
有多种方法可以获取最后一行,您可以使用top-n
子查询,就像该网站上的许多 if (options.removeAllQueryParameters) {
for (const key of urlObj.searchParams.keys()) {
urlObj.searchParams.delete(key);
}
}
问题一样。