Convertir un raster en polygones de contour lisses dans QGIS


14

J'ai eu un succès limité en créant des polygones de contour lisses à partir de couches raster.

J'ai créé des courbes de niveau et des polylignes limites, puis j'ai utilisé QGIS Union. Ensuite, j'utilise QGIS Polygonize. Utilisez ensuite les statistiques zonales du raster d'origine pour obtenir la valeur des polygones.

La deuxième méthode que j'ai essayée était de convertir le raster en polygone. Créez ensuite une nouvelle colonne d'attributs arrondie au contour que je souhaite. Ensuite, je dissous les lignes entre la même valeur. Utilisez ensuite v.generalize. Cette méthode est un peu plus rapide, mais elle laissera certains polygones dentelés / non lissés.

entrez la description de l'image ici

Existe-t-il une méthode plus simple qui fonctionne tout le temps. Il semble qu'il devrait y avoir une commande simple qui effectue tout le processus.


2
Pourquoi utilisez-vous Polygonize? votre raster en entrée est-il continu (comme un DEM à virgule flottante)? QGIS dispose d'un outil de contour, qui est un raccourci vers GDAL_Contour .. qgistutorials.com/en/docs/working_with_terrain.html Essayez-vous d'obtenir des contours ou des zones hypsométriques?
Michael Stimson

Le fichier d'entrée est un tif et le fichier de sortie requis est un fichier de forme avec uniquement des polygones à des incréments spécifiques. J'ai trouvé de nombreux outils pour créer des polylignes, mais pas des polygones.
Rx_

Assez juste, vous essayez d'obtenir des zones hypsométriques. J'utilise (principalement) Esri qui a une option pour simplifier les polygones créés par raster en polygone mais cela n'aidera pas ici. À quoi cela ressemblerait-il si vous deviez créer les contours à partir du DEM, ajouter un cadre de délimitation, puis polygoniser? Vous pouvez ensuite créer des points d'étiquette, intersecter / échantillonner les valeurs et étiqueter les polygones avec les attributs ... peut-être pourriez-vous obtenir quelques polygones de même valeur qui peuvent être dissous mais le plus gros problème est de sauter de plus d'un intervalle. J'ai du code pour attribuer l'hypso à partir des contours mais cela fonctionne sur la couverture ArcInfo
Michael Stimson

Ce que vous décrivez est ce que je pense faire dans ma première méthode. C'est encombrant. Vous devez vous assurer que chaque fichier possède un attribut id, puis supprimer les polygones qui ne contiennent pas de zone au-dessus de zéro une fois polygonisés. Je n'ai pas réussi à obtenir le libellé correct cohérent de la ligne à transférer vers le polygone. La deuxième méthode est si proche d'être ce que je veux, mais v.generalize semble ne pas fonctionner à 100% du temps. J'aimerais que l'ESRI simplifie les polygones soit une option dans QGIS comme vous l'avez souligné.
Rx_

Réponses:


12

J'ai rencontré les mêmes problèmes que vous rencontrez dans votre deuxième méthode. J'ai exporté un raster vers un vecteur et j'essaie d'utiliser v.generalise et j'obtiens principalement des polygones lisses avec la frontière occasionnelle `` en escalier '' qui ne semble pas avoir été affectée par l'algorithme.

J'ai trouvé un processus qui a fonctionné pour ma tâche, je ne sais pas si c'est la meilleure façon, mais j'ai pensé le partager au cas où cela vous aiderait.

Ce que j'ai commencé était une grille ascii de BoM qui ressemblait à ceci: entrez la description de l'image ici

Ce que je voulais quelque chose de similaire à ce que BoM produit comme ça: entrez la description de l'image ici

J'ai pu arriver à un résultat (dont j'étais satisfait) en utilisant les étapes suivantes.

  • Charger la grille (dans mon cas, la grille ASCII de BoM) dans QGIS.
  • Recodé en classes discrètes. (Boîte à outils de traitement> Herbe> Raster> r.recode)
  • Exécutez un filtre majoritaire pour `` nettoyer '' (Boîte à outils de traitement> SAGA> Filtre raster> Filtre majoritaire)
  • A créé des contours à partir de la grille filtrée à des intervalles de 1, et les a stockés dans un attribut «classe» (parce que mes classes étaient 1,2,3,4, etc.). (Menu raster> Extraction> Contour)
  • Les contours de sortie sont quelque peu généralisés, mais j'ai utilisé v.generalised avec l'algorithme 'serpents' pour les lisser. (Boîte à outils Traitement> Herbe> Vecteur> v.generalize)
  • J'ai ensuite converti les lignes en polygone. (Boîte à outils Traitement> Géoalgorithmes QGIS> Outils de géométrie vectorielle> Lignes en polygones)
  • Enfin, j'ai dû convertir les polygones d'une seule partie en plusieurs parties, afin que tous les polygones dessinent bien. (Boîte à outils de traitement> Géoalgorithmes QGIS> Outils de géométrie vectorielle> Pièces uniques à parties multiples).

Après le style, ma sortie est ci-dessous: entrez la description de l'image ici

J'aimerais également savoir si quelqu'un connaît une manière plus simple. À l'origine, je pensais comme @Rx_ que je pouvais simplement convertir mon raster en vecteur puis généraliser et j'aurais fini. Ce que je devais faire était beaucoup plus long.


3

J'aime les réponses ici, mais je ne peux pas croire que QGIS ne dispose toujours pas d'un moyen rapide et facile de le faire. MapInfo peut générer des contours sous forme de polygones ou de lignes avec n'importe quel intervalle que vous pouvez spécifier.

Cela semble être une tâche aussi fondamentale et également importante pour obtenir des extensions. Si quelqu'un a un moyen mis à jour ou plus rapide de le faire, partagez-le!


1

Une manière plus directe consiste à utiliser gdal_countourdirectement (en tant que programme en ligne de commande) en "mode polygonal" (c'est-à-dire avec l' -poption).

Exemple:

gdal_contour -p -amin min_val -amax max_val -i 1 input_raster.tif output_shape.shp

Documentation: https://gdal.org/programs/gdal_contour.html

Cette option est disponible uniquement dans la version> = 2.4 (cela peut être vérifié avec gdalinfo --version). Si vous utilisez Ubuntu 18.4, vous devrez peut-être l'installer à partir d' UbuntuGIS


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.