2017-03-30 8 views
0

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)' 

Antwort

0

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)