Joignez des lignes d'intersection avec PostGIS


15

C'est quelque chose que j'ai presque honte de demander mais je n'arrive pas à le faire fonctionner pour la vie de moi.

J'ai une couche de route avec des segments, chaque segment a un Road IDet un segment type.

Je voudrais joindre tous les segments ensemble, pour chacun Road IDen une seule ligne mais seulement lorsqu'ils sont identiques typeet se touchent (toutes les lignes sont alignées).

entrez la description de l'image ici

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

Réponses:


11

Je crois que le code ci-dessous est une solution un peu plus propre que la réponse sélectionnée pour plusieurs raisons. Premièrement, aucune jointure de table n'est nécessaire et donc un addendum à la clause 'ON' n'est pas nécessaire pour chacun des attributs de rue, et deuxièmement, la méthodologie ci-dessus peut potentiellement produire des chaînes multi-lignes s'il existe plusieurs grappes de rues non contiguës qui ont toutes les mêmes valeurs d'attribut, tandis que ST_Dump s'occupe de ce problème dans cette solution.

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

Ma géométrie ne fusionne avec aucune des requêtes
Luffydude

@Luffydude soucieux de fournir plus d'informations? Il est possible que la géométrie avec laquelle vous travaillez ne soit pas alignée de sorte qu'il soit possible de la fusionner
Grant Humphries

Cela a très bien fonctionné pour moi de fusionner un ensemble de données routières basé sur l'identifiant de la route. Cela a parfaitement géré les routes avec des lacunes (pas de lignes à travers les sections d'écart). Je ne suis pas OP, mais c'est une excellente réponse. Cela devrait être la réponse acceptée. Merci.
jbalk

C'est la meilleure réponse!
aborruso

6

Semble que cela fonctionne

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

Je crache du ballon mais je peux penser à quelques autres solutions. Je ne sais pas s'ils sont meilleurs ou pires, juste qu'ils sont autres.

Tout d'abord, s'il n'y a que quelques types de routes, vous pouvez taper par type avec quelque chose comme:

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

Vous pouvez également utiliser la plupart des éléments ci-dessus avec Road_Type comme variable dans une boucle FOR s'il existe un tas de types.

Ma dernière pensée a consisté à fusionner toutes les géométries, puis à appeler les types de routes avec la fonction ST_Line_Substring ( Link-Link ) mais cela ne fonctionnera pas du tout.

Bonne chance avec ça, Rob

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.