Dissoudre des polygones dans QGIS (GEOS) avec tolérance

11

J'ai une couche vectorielle polygonale représentant la zone inondée lors d'une inondation. La couche a été produite de telle manière que certaines des zones sont composées de plusieurs petits polygones se touchant (voir capture d'écran ci-dessous, étiquetés "données originales").

Je voudrais dissoudre les polygones où ils se touchent. Si j'utilise l'outil de géotraitement Dissolve dans les fTools de QGIS, qui utilise la bibliothèque GEOS, j'obtiens des résultats inattendus (voir «Dissolution avec QGIS fTools»). Il semble que GEOS n'utilise pas de seuil pour déterminer si les polygones se touchent, comme mentionné dans ces problèmes:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

La même approche dans ArcGIS donne le résultat attendu (voir «Dissoudre avec ArcGIS 10.1»).

Apparemment, c'est une "fonctionnalité" de GEOS, plutôt qu'un bug. Existe-t-il un moyen de corriger les données dont je dispose pour produire le résultat attendu? Une petite perte de précision (quelques cm?) Pourrait être acceptable pour moi. Idéalement, la solution serait quelque chose que je pourrais écrire dans un plugin QGIS, comme une étape de prétraitement.

Question connexe (sans réponse): Comment définir la valeur de tolérance de l'outil de géotraitement dans QGIS?

Lien vers des exemples de données sous forme de fichier de formes: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

dissoudre des polygones v.dissolve

Snorfalorpagus
la source
Une solution de contournement consisterait d'abord à agrandir puis à réduire le polygone dissous fTools (en tamponnant d'abord avec un tampon positif puis avec un tampon négatif).
Jake
J'ai essayé cela, mais je me retrouve avec d'autres problèmes (par exemple i.stack.imgur.com/LnFJy.png ). Ici, la zone bleue est créée lorsque je tampon / dissout / tampon négatif, où elle ne devrait pas être. Ce n'est pas beaucoup mieux que le problème d'origine. Je ne vois pas comment récupérer le coin "net" d'origine.
Snorfalorpagus

Réponses:

14

Dans ce cas, il semble que vous ayez besoin d'aider l'outil de dissolution en fixant d'abord la topologie. Voici comment procéder dans GRASS.

Lorsque vous chargez le fichier de formes, voici comment GRASS le voit:

Chaque croix marque une zone. Vous pouvez voir qu'il y a des croix sur les lignes de démarcation: Ce sont les polygones de ruban causés par le léger décalage entre les lignes de démarcation.

  1. Supprimez les polygones en ruban formés par les espaces entre les polygones réels:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Prenez les lignes de démarcation:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Brisez les limites aux nouvelles intersections:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Supprimez les lignes de délimitation désormais dupliquées:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Dissoudre les polygones

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:

Jake
la source
Merci @Jake. C'est une réponse très claire. Malheureusement, lorsque j'essaie d'appliquer le processus à l'ensemble de mes données (couvrant 2500 km2), j'obtiens une erreur de l'outil de capture "ERREUR: G_realloc: impossible d'allouer 144720024 octets de mémoire à snap.c: 186". Je suppose que je vais devoir le décomposer en petits morceaux. Cela devrait être correct cependant, car je le décompose déjà en carrés de 0,25 km2 pour accélérer les intersections / l'indexation spatiale (c'est le champ "ID" dans les données d'exemple).
Snorfalorpagus
7

Utiliser la commande GRASS GIS v.dissolve (dans le plugin Sextante -> Commandes GRASS -> Vector)

Si je vous reproduis rapidement l'exemple: entrez la description de l'image ici

Le résultat avec v.dissolve:

entrez la description de l'image ici

Explication

Le problème est facile à comprendre. Un fichier de formes n'a pas de topologie, si deux zones partageaient une bordure commune, cette bordure serait numérisée deux fois et également stockée en double.

Vous voyez cela clairement lorsque vous essayez de modifier le fichier de formes:

entrez la description de l'image ici

GRASS GIS (comme ArcGIS) est un SIG topologique. Lorsque vous importez le fichier de formes dans GRASS, la couche résultante a une topologie: la frontière commune entre deux zones existe une fois et est partagée.

entrez la description de l'image ici

Pour cette raison, lorsque vous souhaitez dissoudre un fichier de formes ( dissoudre deux limites ), vous pouvez rencontrer des problèmes (dans QGIS, GvSIG, OpenJUMP ou l'ancien ArcView 3.x), voir ArcUserI: Comprendre la topologie et les fichiers de formes .

Dans GRASS, v.dissolve est conçu pour dissoudre les frontières communes entre les zones avec le même numéro de catégorie

gène
la source
1
Je suppose que c'est un problème numérique, et je me demande si votre assez bonne copie de la géométrie de l'OP capturerait les mêmes propriétés numériques?
Chau
@Chau: v.dissolvea un paramètre de tolérance, qui résout le problème de l'OP.
Jake
Ce détail devrait être incorporé dans la réponse ci-dessus, merci d'avoir clarifié :)
Chau
J'ai ajouté un lien vers les données d'origine en tant que fichier de formes dans la question. Quand je l'utilise, v.dissolvecela semble fonctionner, sauf qu'il "remplit" le petit carré au milieu des fonctionnalités. i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Je propose une explication
gène