Suite

Outil ou programme pour nettoyer le jeu de données de polygones


J'ai un jeu de données de polygones (shapefile, fichier d'onglet mapinfo) que je voudrais "nettoyer" pour être topologiquement correct. Les polygones se voient attribuer un ID qui représente une classe spécifique. Par exemple, ID 3 est une forêt et ID 2 est de l'herbe. En général les polygones ne se touchent pas ou ne se superposent pas mais il y a quelques exceptions. Par exemple, un petit polygone, la forêt, se trouve au-dessus d'un plus grand polygone, l'herbe. Ce que je voudrais faire, c'est avoir un trou dans le polygone d'herbe à l'intersection du polygone de forêt.

Ce que j'ai essayé jusqu'à présent, c'est l'outil v.clean dans le plugin QGIS/grass. Mais pour une raison quelconque, il crée également un polygone d'herbe de la même taille que le polygone de forêt. Ainsi, au lieu de deux polygones, il y a trois polygones. Les images ci-dessous illustrent ce que j'ai, ce que je veux, ce que je voudrais et ce que fait l'outil v.clean.

Illustre le polygone d'arbre au-dessus du polygone d'herbe

Le polygone de forêt a été déplacé pour illustrer que le polygone d'herbe n'a pas de trou

Le résultat de v.clean. Trois polygones et un trou.

Le résultat que j'aimerais

Il y a environ 100 000 000 de polygones (pas tous dans un seul fichier), donc le faire manuellement n'est pas une option. J'ai arcmap et mapinfo mais j'aimerais un opensource (script QGIS/greass/saga/postgis/python) pour nettoyer les polygones. Aucune suggestion?


Pour GRASS, il s'agit d'une fonctionnalité documentée dev.in.ogr, et comme indiqué dans le manuel, dans le cas de polygones qui se chevauchent, les zones qui se chevauchent reçoivent les catégories des deux polygones importés d'origine. La solution serait donc de trouver les centroïdes avec des catégories doubles et d'en retirer la catégorie herbe. La solution ci-dessous est pour la ligne de commande GRASS.

Cet exemple suppose que vous importez le fichier de formes avecv.in.ogr input=INFILE.shp output=clé de test=ID, ce qui garantira que les identifiants d'origine pour l'herbe et la forêt deviendront des catégories dans le vecteur GRASS.

v.edit map=test tool=catdel ids=$(v.edit map=test ids=$(v.edit map=test tool=select where="cat=1" --q) tool=select where="cat =2" --q) chat=1

Ce script d'apparence plutôt compliqué a trois opérations différentes. Le plus interne trouve d'abord tous les identifiants de fonctionnalité avec category=1 et le donne comme argument au second v.edit, qui à partir de ces fonctionnalités trouve tous ceux qui ont également category=2, et à la fin, le plus externe prend ceci list, qui contient désormais toutes les fonctionnalités des catégories 1 et 2, et supprime la catégorie 1 de celles-ci. Cela devrait supprimer les doubles catégories.

Doutes

En fait, dans le cas de 100 000 000 de polygones, cela ne fonctionne probablement pas, car je ne compterais pas sur les scripts shell capables de gérer ces grandes listes ou arguments.

Vous pouvez le transformer en un script plus volumineux, peut-être avec python, pour obtenir le même résultat :

  1. utilisationv.modifiercomme ci-dessus pour trouver la liste des identifiants avec la catégorie=1
  2. pour chacun de ces identifiants, utilisezv.catégoriepour savoir s'il a aussi category=2, et
  3. si l'id a aussi la catégorie=2, utilisezv.modifiercomme ci-dessus pour supprimer la catégorie=1 de l'identifiant en question.

C'est maladroit, mais permettra d'obtenir le résultat souhaité en temps voulu.


S'il ne s'agit que d'une petite quantité de polygones à découper, vous pouvez utiliser les outils de la barre d'outils des outils de numérisation avancés (Affichage--> Barres d'outils).

Si vous voulez vérifier si les fichiers de formes se chevauchent, je recommande le Vérificateur de topologie-brancher. Cet outil vous permet de configurer quels calques ne doivent pas se chevaucher, les formes au sein des calques qui ne doivent pas se chevaucher, etc. Outil très simple, utilisez-le tout le temps. Bonne chance;)