Wie kann ich eine Linienfolge zu Liniensegmenten aufteilen? mit SAP HANA DBSap hana Linienfolge zu Segmenten
zum Beispiel:
'LINESTRING(0 0, 2 2, 0 2, 0 5)'
werden wird:
'LINESTRING(0 0, 2 2) LINESTRING(2 2, 0 2) LINESTRING(0 2, 0 5)'
Wie kann ich eine Linienfolge zu Liniensegmenten aufteilen? mit SAP HANA DBSap hana Linienfolge zu Segmenten
zum Beispiel:
'LINESTRING(0 0, 2 2, 0 2, 0 5)'
werden wird:
'LINESTRING(0 0, 2 2) LINESTRING(2 2, 0 2) LINESTRING(0 2, 0 5)'
Sie einzelne Punkte mit der Funktion ST_PointN extrahieren kann(). es zu nennen für Punkt 1, 2, 3, ... N Ich benutze eine temporäre Tabelle TMP genannt, die Zählerwerte speichern würde:
CREATE TABLE TMP (NUM INT);
select TOP 100 ROW_NUMBER() OVER() from PUBLIC.M_TABLES ;
Dann wende ich ST_PointN für jeden Punkt der Zählertabelle.
select NUM, LS.ST_PointN(NUM).ST_WKT() as CUR_POINT
from(
select NEW ST_LineString('LINESTRING(0 0, 2 2, 0 2, 0 5)') as LS, NUM
from TMP
)nested1
where NUM<=LS.ST_NumPoints()
Das gibt
NUM| CUR_POINT
1 |POINT (0 0)
2 |POINT (2 2)
3 |POINT (0 2)
4 |POINT (0 5)
Sie können ganz einfach diejenigen in eine ST_MultiPoint Geometrie mit einer Aggregation verketten mit ST_UnionAggr():
select ST_UnionAggr(CUR_POINT).ST_AsWKT()
from(
select NUM, LS.ST_PointN(NUM) as CUR_POINT
from(
select NEW ST_LineString('LINESTRING(0 0, 2 2, 0 2, 0 5)') as LS, NUM
from TMP
)nested1
where NUM<=LS.ST_NumPoints()
)nested2
Das gibt
MULTIPOINT ((0 0),(2 2),(0 2),(0 5))
Hinweis : Wir haben Ich mache eine Schleife, anstatt eine Zählertabelle zu verwenden.
Jetzt für Ihre genaue Frage, wir bauen 3 ST_LineString() mit einer Fensterfunktion, um den aktuellen Punkt mit dem nächsten zu kombinieren. Es gibt mehrere Möglichkeiten, eine solche Abfrage zu schreiben, ist hier ein:
select NEW ST_LineString('LineString ('||START_POINT.ST_X()||' '||START_POINT.ST_Y()||','||END_POINT.ST_X()||' '||END_POINT.ST_Y()||')').ST_AsWKT() as LS
from(
select CUR_POINT as START_POINT,
NEW ST_Point(FIRST_VALUE(CUR_POINT) OVER(order by NUM asc rows BETWEEN 1 following and 1 following))as END_POINT
from(
select NUM, LS.ST_PointN(NUM) as CUR_POINT, LS.ST_NumPoints() as NB_POINTS
from(
select NEW ST_LineString('LINESTRING(0 0, 2 2, 0 2, 0 5)') as LS, NUM
from TMP
)nested1
where NUM<=LS.ST_NumPoints()
)nested2
)nested3
where END_POINT is not null
Tada:
LS
LINESTRING (0 0,2 2)
LINESTRING (2 2,0 2)
LINESTRING (0 2,0 5)