J'ai un gros fichier raster (129600 par 64800 pixels) avec les plans d'eau mondiaux (valeurs 1 bit 0 et 1) et j'essaie d'extraire les rives des océans et des eaux intérieures.
J'ai essayé avec ArcGIS et QGIS de convertir de raster en polyligne, mais cela prend des siècles.
Quelqu'un connaît-il un moyen meilleur / plus rapide (Python ou R) ou un meilleur outil pour cette tâche?
Mise à jour
- R: rasterToContour peut être rapide et précis, mais si vous avez un très grand ensemble de données comme le mien (8 398 080 000 pixels), vous avez besoin d'une très grande quantité de RAM (plus de 16 Go) ou vous forcez R à faire plus de traitement sur le disque dur et prendra également des âges.
- Python / GDAL: gdal_poligonize crée des polygones au lieu de polylignes
Update 2
- R rasterToContour: rasterToContour ne fournit pas les résultats souhaités. Comparé à ArcGIS (raster sur polygone suivi d'une entité sur ligne), il n'extrait pas le contour exact des pixels, comme indiqué dans les exemples ci-dessous.
MISE À JOUR 3
Python / GDAL: j'ai exécuté gdal_polygonize à partir de la ligne de commande contre ArcGIS sur un jeu de données de test et les résultats étaient extrêmement clairs:
- gdal: 49 secondes
- ArcGIS: 1,84 secondes
python
r
performance
Generic Wevers
la source
la source
Réponses:
Je travaille avec R et utilisé à
rasterToPolygons
partir duraster
package dans le passé, mais maintenant je préfèregdal_polygonizeR
par John Baumgartner. Il se base surgdal_polygonize.py
et est beaucoup plus rapide. John Baumgartner a publié le code et a donné un exemple d'utilisation dans son blog .Si vous êtes familier avec python, vous pouvez
gdal_polygonize.py
bien sûr l' utiliser directement.la source
Pour la postérité, j'ai eu du succès avec le
stars::
packageR
pour faire ce type d'opération rapidement.la source
Essayez à
rasterToContour
partir du package raster .Vous pouvez ensuite facilement écrire les fichiers dans un dossier local, par exemple sous la forme «ESRI Shapefile» (.shp), en utilisant le code ci-dessous. Jetez un oeil à
ogrDrivers
de rgdal pour les pilotes de votre système est compatible avec.la source
rasterToContour
sur une valeur plus élevée, par exemple 1e + 9. Vous vous retrouverez alors avec plus de détails. Le paramètre par défaut crée des lignes de contour assez généralisées.resample
vos données à une résolution spatiale plus grossière, la seule solution que j'imagine alors serait de diviser vos données en plusieurs tuiles (par exemple 16 sous-rasters), puis de les exécuterrasterToContour
sur chaque tuile séparément de manière itérative et , enfin,merge
les fichiers de formes résultants en un seul fichier de formes énorme. Si vous êtes intéressé, le package Rsenal de notre groupe de travail offre une fonction appeléesplitRaster
pour créer plusieurs sous-rasters à partir d'un seul raster énorme.Bien que je sois un grand fan de GDAL, l'outil de polygonisation était également trop lent pour mes applications.
Une alternative rapide est
gdal_trace_outline
des scripts Dans GDAL qui ont également plus d'options concernant la tolérance, les beignets, etc.De
gdal_polygonize
cette façon, vous obtenez également des polygones avec lesquels vous devrez ensuite convertirogr2ogr -nlt MULTILINESTRING
.L'inconvénient est que vous devez le compiler vous-même, sauf si vous êtes sur un système Linux ou Mac OsX.
la source