For a given feature (line or area) and for all of its members I need to extract the coordinates of (1) all the vertices, (2) the first vertex and (3) the last vertex (3 separate queries to create 3 different sets of results)
I’m using Oracle spatial.
I’ve tested this sql code for the table ARAMAL (it’s a 3d line entity; Primary key column: IPID; geometry column: GEOMETRY) and it works well.
(1) – List all the vertices
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;
Result (example for 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) – List the first vertex
SELECT A.IPID, t.X, t.Y, t.Z, t.id FROM ARAMAL A, TABLE(SDO_UTIL.GETVERTICES(A.GEOMETRY)) t where t.id=1 ORDER BY A.IPID;
Result (example for IPID=1479723)
IPID X Y Z id
1479723 -99340.38408 -102364.3603 10 1
- (3) How can I obtain the last vertex purely with sql (no additional functions)?
(Expected) Result (example for IPID=1479723)
IPID X Y Z id
1479723 -99342.86238 -102370.0875 13 4
I guess this process could run faster if I use specific functions – I would also like to be able to use them.
I’ve come across a great site (Simon Greener) with some functions that I guess could do the trick
The functions are:
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;
/
I’m a newbie to this world and I don’t really get the syntax of these functions…
- For the table ARAMAL that I’ve used before how should I use/apply them to get the results (and in the format) I need?
IPID X Y Z id
1479723 -99340.38408 -102364.3603 10 1
….
Thanks in advance, Best regards, Pedro
Advertisement
Answer
It doesn’t matter if you are working with spatial data, you are interested in row which has maximum id for given ipid, so you can run it like here:
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;
There are several ways to get last row, you can use row_number(), subquery, like in many top-n questions on this site.