Simplification des polygones adjacents à l'aide de l'outil QGIS Simplify Geometries

10

J'ai un grand Shapefile avec 200 000 polygones mais le fichier est trop gros pour l'application qui l'utilisera. Je voudrais généraliser ces polygones et créer un fichier beaucoup plus petit.

J'ai essayé de le faire dans QGIS en utilisant l'outil "Simplifier les géométries". J'ai essayé ceci sur une très petite partie de mon Shapefile et je suis satisfait des résultats mais j'ai un petit problème que je ne sais pas comment résoudre. J'ai ajouté l'image pour montrer le problème.

Les frontières BLANCHES sont des frontières avant la simplification. Les limites ROUGES sont après simplification. Les zones à problèmes sont entourées de couleur orange. Comme vous pouvez le voir, les "limites simplifiées" contiennent certaines zones qui, après simplification, n'appartiennent à aucun des polygones précédents.

Comment simplifier ce fichier de formes et conserver les limites communes entre les polygones sur une seule ligne et éliminer les zones créées après la simplification?

Polygones simplifiés dans QGIS

INFORMATION ADDITIONNELLE:

Après avoir suivi les instructions suggérées

  1. Convertir des polygones en lignes
  2. Simplifier les lignes
  3. Reconvertir les lignes en polygones

J'obtiens les résultats suivants. C'est un peu mieux qu'avant mais j'obtiens toujours des zones en dehors des polygones d'origine (voir les zones blanches dans l'image ci-dessous).

@Andrew a suggéré d'associer chaque ligne à un polygone adjacent, mais je ne sais pas comment le faire dans QGIS.

entrez la description de l'image ici

J'essaie toujours de terminer le processus de simplification des polygones. J'ai suivi les instructions suggérées dans ce post et quand j'ai pensé que j'obtenais des résultats acceptables, un autre problème est apparu. Voici un résumé de ce que j'ai fait avec des images de résultats. Toutes les étapes ont été effectuées à l'aide de la boîte à outils PROCESSING dans QGIS.

  1. Tout d'abord, j'ai converti des polygones en lignes
  2. Deuxièmement, j'ai nettoyé les lignes en utilisant v.clean avec l'option break. Il en est résulté une COUCHE DE VECTEUR NETTOYÉE et une COUCHE D'ERREUR. Le calque d'erreur (points verts sur l'image fournie) a un point vert à chaque intersection de lignes. Je ne sais pas ce que cela signifie.
  3. Troisièmement, j'ai simplifié les lignes en utilisant l'outil "SIMPLIFY GEOMETRY" (résultat en lignes rouges dans les images). En comparant les lignes rouges simplifiées et les lignes oranges originales, je suis satisfait du résultat.
  4. Quatrièmement, je voulais reconvertir les lignes en polygones en utilisant l'outil "Polygoniser" dans "TRAITEMENT" et j'ai obtenu des résultats auxquels je ne m'attendais pas (deuxième image avec des polygones de couleur olive foncé ombré). Cela ressemble à des intersections de couches d'erreur connectées au polygoniseur et a créé un ensemble de polygones complètement différent en ignorant les lignes simplifiées.

Quelqu'un pourrait-il expliquer ce qui n'a pas fonctionné ici?

Pourquoi les lignes rouges simplifiées n'ont pas été converties correctement en polygones simplifiés?

Comme vous pouvez le voir, je ne suis pas un expert en SIG mais je dois le faire moi-même. Je ne sais pas si je suis trop loin de la solution, mais c'est frustrant de voir des lignes simplifiées que j'ai trouvées acceptables pour ce que j'aimerais faire, mais je ne peux pas les convertir en polygones.

Voici deux images avec les résultats des deux dernières étapes du processus:

Lignes simplifiées et lignes originales

Résultats des lignes simplifiées plygonisées

David
la source
@nhopton Sur la page Web de Polygonizer plugins.qgis.org/plugins/Polygonizer, il indique qu'il "crée des polygones à partir de lignes qui se croisent". Cela suggère que des polygones seront créés chaque fois qu'il y a une intersection de lignes (mais peut-être que mon interprétation est fausse). Ce dont j'ai besoin, c'est de me débarrasser de ces lacunes qui ont été créées lors de l'utilisation de l'outil "simplifier les géométries" et si Polygonizer peut le faire, je serais très heureux.
David
En y réfléchissant, votre couche polygonale d'origine devrait se simplifier sans problème. Si ce n'est pas le cas, je pense que cela signifie probablement que vous avez de mauvais polygones dans les données d'origine. Polygones qui se chevauchent légèrement ou qui ont de minuscules espaces entre eux. Essayez de zoomer sur les zones à problème pour voir si vous pouvez trouver quelque chose comme ça. N.
nhopton
Un bon moyen de préserver la topologie consiste dans le workflow proposé par @radouxju (sauf le calcul du centroïde qui n'est pas nécessaire) et représenté dans le modèle de traitement dans ma réponse. Alternativement, je pense que GRASS v.generalizeest une autre excellente option. J'espère que cela t'aides.
Antonio Falciano
Question connexe: gis.stackexchange.com/questions/20799/…
simon04

Réponses:

7

J'ai obtenu un assez bon résultat en utilisant GRASS v.generalize de la boîte à outils de traitement en utilisant les valeurs par défaut:

entrez la description de l'image ici

Certaines lignes restent intactes.

AndreJ
la source
A eu un bon succès avec cette méthode après avoir défini la tolérance d' accrochage v.in.ogr de -1 (pas d'accrochage) à 0,00001 comme suggéré par @Kantan.
cm1
4

J'ai rencontré ce problème avec Qgis2.16, mais je n'ai pas pu obtenir GRASS pour donner un résultat topologiquement correct comme @AndreJ.

Une bonne solution consiste à modifier la tolérance d'accrochage v.in.ogr dans les paramètres avancés de l' outil v.generalize.simplify . La valeur par défaut est -1, ce qui empêche la capture dans GRASS.

En mettant une petite valeur ici (comme 1e-05 m), l'alignement est activé et GRASS reconnaît les bordures partagées des polygones. La simplification donne alors une couche topologiquement correcte, sans trous.

Remarque: En définissant la tolérance d'accrochage à des valeurs plus élevées, il est même possible de modifier les polygones afin que ceux très fins puissent être supprimés si vous le souhaitez. Suivez cette opération avec v.clean en utilisant rmarea et un seuil assez grand pour supprimer les petits restes, et voilà!

Kantan
la source
3

convertissez d'abord votre polygone en lignes

utilisez v.clean pour nettoyer votre topologie (avec l'option "break")

alors vous simplifiez vos lignes

Enfin, vous retournez vos lignes en polygones. (En utilisant polygonize)

EDIT: Pour obtenir les attributs de vos polygones, la meilleure façon, si vous n'avez pas de polygones en plusieurs parties dans le jeu de données d'origine , est d'obtenir les centroïdes de l'ancien et des polygones simplifiés et de les joindre en fonction de l'emplacement le plus proche (les centroïdes doivent ne bouge pas beaucoup si vous modifiez seulement légèrement vos limites)

radouxju
la source
1
Cela me semble que vous omettez quelques étapes, bien que le flux de travail puisse fonctionner à la fin. Lorsque vous convertissez les polygones en lignes, vous devrez peut-être associer la ligne à tous les polygones adjacents. Ensuite, après la simplification, vous devez reconvertir les lignes en polygones en plusieurs parties. Si les polygones d'origine sont convexes, vous pouvez peut-être faire correspondre l'original au simplifié à l'aide du centroïde (par exemple, si le centroïde de l'original est contenu dans le poly simplifié, il s'agit d'une correspondance). S'ils ne sont pas convexes, ce sera beaucoup plus difficile.
Andy W
Salut, j'ai suivi la procédure suggérée par radouxju mais j'ai toujours des parties du polygone d'origine en dehors de ses limites d'origine. Comment associer la ligne à tous les polygones adjacents dans QGIS? Je prévois d'utiliser ces polygones dans les applications Web et je dois réduire le nombre de nœuds pour un chargement plus rapide. Ce que j'obtiens maintenant, c'est une bonne réduction mais je ne peux pas me débarrasser de ces petites zones qui sont là après la simplification. Toutes les idées pour résoudre ce problème seront grandement appréciées.
David
@David. Je pense que votre problème pourrait être avec l'étape 3, les lignes vers les polygones. Dans la boîte à outils de traitement, il y a un outil appelé "Polygonize" et j'essayerais cela. Je pense que cela nécessite encore l'installation des packages Shapely et Numpy. Cela dit, je ne peux pas faire fonctionner "Polygonize" pour moi dans QGIS-Master juste à la minute. N.
nhopton
2

Vous pouvez résoudre le problème avec un modèle de traitement (ex SEXTANTE) comme celui-ci:

entrez la description de l'image ici

Version du script:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Remarque: la seule contrainte est que le champ commun doit être IDdans Join attributes table, car est le seul champ de la sortie de Lines to polygons. C'est pourquoi le champ commun n'est pas une entrée variable du modèle. Un IDchamp doit donc être disponible dans la couche de polygones en entrée.

Antonio Falciano
la source