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),其中一些功能我认为可以解决问题
函数是:
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;
有几种方法可以获取最后一行,您可以使用 row_number()
、子查询,就像本网站上的许多 top-n
问题一样。
对于给定的要素(线或区域)及其所有成员,我需要提取 (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),其中一些功能我认为可以解决问题
函数是:
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;
有几种方法可以获取最后一行,您可以使用 row_number()
、子查询,就像本网站上的许多 top-n
问题一样。