Verbinden Sie sich überschneidende Linien mit PostGIS

15

Das ist etwas, worüber ich mich fast schäme, aber ich kann es scheinbar nicht schaffen, es für mein Leben zum Laufen zu bringen.

Ich habe eine Straßenebene mit Segmenten, jedes Segment hat ein Road IDund ein Segment type.

Ich möchte alle Segmente Road IDzu einer Linie zusammenfügen, aber nur, wenn sie gleich sind typeund sich berühren (alle Linien werden zusammengeschnappt).

Bildbeschreibung hier eingeben

Road ID - Type
   1       L
   1       L
   1       T
   1       L
Nathan W
quelle

Antworten:

11

Ich glaube, der folgende Code ist aus mehreren Gründen eine etwas sauberere Lösung als die ausgewählte Antwort. Erstens sind keine Tabellenverknüpfungen erforderlich, und daher ist kein Zusatz zur 'ON'-Klausel für jedes der Straßenattribute erforderlich, und zweitens kann die obige Methodik möglicherweise mehrere Linienfolgen erzeugen, wenn mehrere nicht zusammenhängende Straßencluster vorhanden sind alle dieselben Attributwerte, während ST_Dump dieses Problem in dieser Lösung behebt.

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
Grant Humphries
quelle
Meine Geometrie wird mit keiner der beiden Abfragen zusammengeführt
Luffydude
@Luffydude Möchten Sie weitere Informationen bereitstellen? Möglicherweise ist die Geometrie, mit der Sie arbeiten, nicht so ausgerichtet, dass sie zusammengeführt werden kann
Grant Humphries,
Dies funktionierte wunderbar für mich, um einen Straßendatensatz basierend auf der Straßen-ID zusammenzuführen. Dies bewältigte die Straßen mit Lücken sehr gut (keine Linien über die Lückenabschnitte). Ich bin kein OP, aber das ist eine großartige Antwort. Dies sollte die akzeptierte Antwort sein. Vielen Dank.
jbalk
Das ist die beste Antwort!
Aborruso
6

Scheint so

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"
Nathan W
quelle
0

Nur Spucken, aber ich kann mir ein paar andere Lösungen vorstellen. Ich weiß nicht, ob sie besser oder schlechter sind, nur dass sie andere sind.

Erstens, wenn es nur ein paar Straßentypen gibt, können Sie Typ für Typ folgendermaßen vorgehen:

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

Sie können die meisten der oben genannten Optionen auch mit Road_Type als Variable in einer FOR-Schleife verwenden, wenn mehrere Typen vorhanden sind.

Mein letzter Gedanke bestand darin, alle Geometrien zusammenzuführen und dann Straßentypen mit der Funktion ST_Line_Substring ( Link-Link ) aufzurufen, aber das funktioniert überhaupt nicht.

Viel Glück damit, Rob

rec.thegeom
quelle