Dissoudre ou séparer des lignes sur des attributs communs dans PostGIS ou GRASS?


9

J'ai un fichier de formes d'axe de route qui a des routes divisées à chaque intersection. Cependant, je voudrais joindre LINESTRINGs qui ont un ensemble commun d'attributs en un seul LINESTRING. Tant que le nom, la limite de vitesse, etc., ne changent pas, je veux les fusionner. C'est pour une éventuelle fusion avec OpenStreetMap.

Le logiciel ArcGIS for Desktop d'Esri semble autoriser cela avec la commande Dissoudre et l'option UNSPLIT_LINES.

J'ai également trouvé une commande Dissoudre dans QGIS mais elle ne semble fonctionner que sur des polygones et des champs uniques.

En supposant que rien n'existe pour QGIS, quelqu'un sait-il comment le faire dans PostGIS ou GRASS?



Si cette question était posée aujourd'hui, je pense qu'elle serait classée comme trop large. Plutôt que d'essayer de le fermer maintenant, je vais le modifier pour moderniser les réponses existantes et empêcher des réponses plus larges.
PolyGeo

Réponses:


4

Question interessante. Je ne me considère pas comme un gourou de PostGIS, mais j'ai joué avec votre problème et j'ai proposé la requête suivante qui dissout les LINESTRINGenregistrements routiers en MULTILINESTRINGenregistrements lorsqu'ils ont des valeurs communes dans plusieurs champs (dans mon jeu de données, j'ai fait correspondre les champs nameet state). J'ai utilisé OGR pour envoyer un fichier de formes autoroutes (renommé ushwys) dans PostGREsql; donc mon champ de géométrie est appelé wkb_geometry. Essayez de pirater cette requête pour répondre à vos données et conditions de champ:

SELECT 
u.name, 
u.state, 
ST_AsText( ST_Multi( ST_Collect( u.wkb_geometry ) ) ) as multilines 
FROM ushwys u
GROUP BY u.name, u.state 
ORDER BY u.state 
LIMIT 100; --########### DROP THE LIMIT WHEN YOU'RE DONE EXPERIMENTING

Si cela fonctionne, vous pouvez utiliser ogr2ogr pour effectuer cette requête et exporter les résultats dans la plupart des formats vectoriels que vous préférez, tels que le fichier de formes, GML, CSV ou autre. Pour plus d'informations sur l'appel de requêtes SQL à partir d'ogr2ogr, consultez la documentation OGR SQL .

À titre de référence, j'ai examiné l' instruction PostGIS ST_Collect , ainsi que ce site qui illustre le regroupement sur plusieurs champs.

Si vous trouvez que les suppressions de cette requête ne fonctionnent pas pour vous, faites-le moi savoir et je supprimerai ma réponse afin qu'elle ne s'attarde pas et ne perturbe pas les gens.


PS Si vous n'êtes pas familier avec l'utilisation d'ogr2ogr pour pousser des géodonnées dans PostGIS, j'ai utilisé le script ogr2ogr suivant pour effectuer mon importation de données ( méfiez-vous de la copie à partir du Web et du collage direct dans votre fenêtre de commande ogr2ogr, car j'ai trouvé le formatage de la page introduit des sauts de ligne et des substitutions de polices / caractères pour les guillemets doubles qui cassent le script ogr ):

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=postgres dbname=gisdb password=my_password" 
"E:\GISData\UnitedStates\highways.shp" -nln ushwys -nlt geometry

[Mise à jour]

Je voulais voir à quoi cela "ressemblait" dans QGIS après avoir exécuté cette requête, j'ai donc modifié la requête pour appliquer cette WHEREclause (qui me donne toutes les variantes de l'US Highway 65 dans l'État du Missouri):

where u.state = 'MO' and u.name LIKE '%US%65%'

Ensuite, j'ai utilisé QGIS et le plugin QuickWKT pour visualiser les huit (8) de mes MULTILINESTRINGenregistrements routiers résultants . Comme vous pouvez le voir sur la capture d'écran, les résultats finaux emmènent l'autoroute 65 de la frontière nord de Missoui avec l'Iowa jusqu'à sa frontière sud avec l'Arkansas:

entrez la description de l'image ici

Pour moi, cette visualisation montre que ma requête n'a produit aucune duplication ou élimination inattendue des fonctionnalités. Alors, je me suis demandé "ok, la dissolution a renvoyé huit fonctionnalités, mais combien de fonctionnalités dans le tableau d'origine représentent en fait l'autoroute 65 au Missouri?" Ma prochaine requête a répondu à cette question. Il semble que le jeu de données d'origine utilise trente-huit (38) entités pour représenter l'autoroute 65 au Missouri:

SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38

En dernière analyse, la requête a réduit trente-huit (38) entités à huit (8) entités partageant des valeurs dans les champs de nom et d'état. À ce stade, je suis relativement convaincu que cette requête est utile et appropriée pour dissoudre des géométries en une seule partie dans des géométries en plusieurs parties lorsque la tâche de dissolution doit prendre en compte plusieurs champs.

À votre santé. :)



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.