Unisci le linee che si intersecano con PostGIS


15

Questo è qualcosa che mi vergogno quasi di chiedere, ma non riesco a farlo funzionare per la vita di me.

Ho uno strato stradale con segmenti, ogni segmento ha un Road IDe un segmento type.

Vorrei unire tutti i segmenti insieme, ciascuno Road IDin una stringa lineare ma solo quando sono uguali typee si toccano (tutte le linee sono unite).

inserisci qui la descrizione dell'immagine

Road ID - Type
   1       L
   1       L
   1       T
   1       L

Risposte:


11

Credo che il codice qui sotto sia una soluzione un po 'più pulita della risposta selezionata per un paio di motivi. Innanzitutto non sono necessari join di tabella e quindi non è necessario un addendum alla clausola "ON" per ciascuno degli attributi di strada, e in secondo luogo la metodologia sopra descritta può potenzialmente produrre multi-linestring se ci sono più cluster non contigui di strade che hanno tutti gli stessi valori di attributo, mentre ST_Dump si occupa di quel problema in questa soluzione.

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

La mia geometria non si fonde con nessuna delle query
Luffydude,

@Luffydude ti interessa fornire ulteriori informazioni? È possibile che la geometria con cui stai lavorando non sia allineata in modo tale che sia possibile fonderla
Grant Humphries

Questo ha funzionato magnificamente per me unire un set di dati stradali basato sull'ID strada. Ciò ha gestito magnificamente le strade con spazi vuoti (nessuna linea tra le sezioni di spazio). Non sono un OP, ma questa è un'ottima risposta. Questa dovrebbe essere la risposta accettata. Grazie.
jbalk,

Questa è la risposta migliore!
aborruso,

6

Sembra che funzioni

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

Ho appena sputato ma posso pensare ad alcune altre soluzioni. Non so se sono migliori o peggiori, solo che sono altri.

In primo luogo, se ci sono solo alcuni tipi di strade, puoi procedere tipo per tipo con qualcosa del tipo:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

Puoi anche usare la maggior parte di quanto sopra con Road_Type come variabile in un ciclo FOR se ci sono molti tipi.

Il mio ultimo pensiero riguardava la fusione di tutte le geometrie, quindi la chiamata dei tipi di strada con la funzione ST_Line_Substring ( Link-Link ) ma non funzionava affatto.

Buona fortuna, Rob

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.