Pourquoi GDALPolygonize est-il tellement plus lent qu'ArcGIS Raster to Polygon?

9

J'essaie de polygoniser un raster en utilisant GDALPolygonize () dans un script Python. Le script a commencé la polygonisation hier à 17h et continue de polygoniser à 9h30. Je n'ai aucune idée de la distance, mais je sais que cela continue car lorsque je rafraîchis mon explorateur Windows, je peux voir la taille du fichier changer pour le fichier de formes de sortie.

Mon raster est plutôt volumineux, mais je ne m'attends toujours pas à ce qu'il prenne autant de temps. Mon raster est de 35 486 colonnes et 23 682 lignes avec une taille de cellule de 1 mètre. Il s'agit d'un raster binaire où une valeur de 1 représente des données et 0 est NoData.

Lorsque j'ai polygonisé dans ArcGIS à l'aide de Raster en polygone dans la boîte à outils de conversion, cela a pris 56 secondes. Le fichier de formes résultant est de 200 Mo tandis que le fichier de formes toujours créé par GDALPolygonize n'est toujours que de 100 Mo. Cela me fait penser que GDAL est à mi-chemin après avoir couru toute la nuit.

Spécifications: Windows 7 64 bits, 8 Go de RAM, GDAL 1.10 64 bits, ArcGIS Desktop 10.2, 64 bits Géotraitement en arrière-plan pour ArcGIS Desktop, Python 2.7.3 64 bits

MISE À JOUR Jour 2 - GDALPolygonize est toujours en cours d'exécution. Il a passé la nuit 2 nuits d'affilée et toute une journée sans se terminer. ArcGIS a pris 56 secondes.

Brian
la source
mise à jour rapide de 2018: gdal_polygonize prend encore beaucoup plus de 56 secondes. J'ai une trame de 12000x12000 et gdal travaille depuis plus d'une heure. Ce n'est pas beaucoup par rapport aux jours, mais c'est plus de 60 fois plus que 56 secondes, j'ai donc le sentiment que je vais regarder un processus en cours lorsque je reviendrai pour vérifier ma machine demain matin.
thymaro

Réponses:

4

J'ai la même expérience. L'algorithme est vraiment lent pour les rasters énormes, mais assez rapide pour les plus petits. Il existe une solution de contournement possible:

  1. Divisez l'énorme fichier raster en petits fichiers par gdalwarp (en utilisant -te pour définir l'étendue de chaque fichier):

gdalwarp -te 12.08 48.5 12.5 51.1 original_file.tif part1.tif

  1. Polygonisez chacun d'eux dans un fichier de formes distinct:

gdal_polygonize.py part1.tif -f "ESRI Shapefile" part1.shp

  1. Fusionnez les fichiers de formes ensemble:

ogr2ogr -f "ESRI Shapefile" -update -append merge.shp part1.shp -nln merge

  1. Dissolvez le nouveau fichier de formes:

ogr2ogr "output.shp" "input.shp" -dialect sqlite -sql "SELECT ST_Union(geometry), field FROM input GROUP BY field"

Je sais, c'est fou comme l'enfer, mais la dernière fois a été bien plus rapide.

Stanley

Stanislav Dušek
la source
1
Vous pourriez probablement envelopper cela dans un script afin que vous n'ayez à faire quelque chose qu'une seule fois
henrik-dmg
Salut Stanley, merci pour cette réponse. J'essaie de faire quelque chose de similaire, car mes rasters mettent une éternité à polygoniser. Cette méthode fusionne-t-elle les polygones sur les bords comme si vous n'aviez jamais divisé les rasters en premier lieu? Pourriez-vous développer les instructions SQL dans la dernière commande? Je ne connais pas SQL et j'essaie de comprendre comment faire fonctionner cela avec mes données.
user20408
au lieu d'utiliser gdalwarp, ne pourriez-vous pas simplement carreler votre raster en créant un fichier vrt lors de son enregistrement? C'est du moins ainsi que j'ai appris à découper mes rasters et je n'ai pas à le faire pour chaque tuile séparément.
thymaro