Je voudrais reclasser un fichier raster d'un raster avec 10 classes en un raster avec 8 classes utilisant pyhton, gdal et / ou numpy. Les classes sont représentées sous forme d'entiers. J'ai essayé de suivre les étapes de ce post Reclassifier les rasters en utilisant GDAL et Python , le doc numpy.equal et également la doc gdal_calc. Cependant, en vain.
Le fichier raster à reclassifier a des valeurs entières allant de 0 à 11 et inclut également des valeurs 100 et 255. Les éléments suivants montrent la reclassification (de la valeur: à la valeur):
nodata: 4, 0: 4, 1: 1, 2: 2, 3: 3, 4: 3, 5: 4, 6: 5, 7: 5, 8: 6, 9: 7, 10: 8, 100: nodata, 255: nodata,
Ce que j'ai pu faire, c'est sélectionner le fichier raster à reclasser à l'aide de tkinter.FileDialog et obtenir les informations raster telles que la géotransformation et la taille des pixels avec reclass = gdal.Open (raster, GA_ReadOnly).
Comment puis-je résoudre les problèmes ci-dessus.
Il convient de mentionner que les rasters à reclasser peuvent être assez importants dans certains cas (500 Mo à 5 Go).
la source
Réponses:
Ici, vous avez un simple script python pour la reclassification, je l'ai écrit et cela fonctionne pour moi:
Modifiez simplement les plages.
J'espère que cela aidera.
la source
file2
avecdel file2
oufile2 = None
pour vous assurer qu'il est écrit sur le disque..FlushCache()
n'influence que le cache de tuiles interne de GDAL.Au lieu de faire la reclassification en double boucle for décrite par dmh126, faites-le en utilisant
np.where
:Sur un tableau de 6163 par 3537 pixels (41,6 Mo), la classification se fait en 1,59 secondes, où il faut 12min 41s en utilisant la boucle double for. Au total, juste une accélération de 478x.
En résumé, n'utilisez jamais de boucle double pour
numpy
la source
Voici un exemple de base utilisant rasterio et numpy:
la source
Juste pour compléter la réponse de @Mattijn, je pense que cela entraînera un problème si les classes d'entrée se chevauchent avec les classes de sortie. Je ne veux pas que ma nouvelle valeur soit modifiée par la règle suivante.
Je ne sais pas si je perds de la vitesse mais je devrais faire une copie complète:
la source
Voici une autre approche Rasterio que j'ai piratée ensemble en utilisant le livre de recettes Rasterio et la réponse de @ Mattijn.
la source
Dans certains cas, numériser numpy peut être utile pour passer rapidement des plages aux bacs.
la source
Avec la prise en charge de la table des couleurs RVB raster:
la source
Une alternative légèrement différente pourrait être la suivante:
Ce script joue avec numpy.where ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html ): dans toutes les étapes en dehors de la dernière, au lieu de renvoyer une valeur lorsque le n'est pas satisfaite, elle renvoie un autre np.where. Et cela continue jusqu'à ce que toutes les valeurs possibles du raster soient prises en compte.
la source