J'ai été chargé de créer une analyse d'aptitude des conditions de vagues dans le golfe du Mexique. J'ai environ 2 000 fichiers raster d'environ 8 Mo chacun (2438 colonnes, 1749 lignes, 1 km de cellule). Le paramètre dans les fichiers raster est la période d'onde et j'aimerais reclasser tous les rasters de telle sorte que si 4<= wave period <=9 then make cell = 1
, sinon cellule = 0. Ensuite, résumez tous les rasters en un raster final et divisez par le nombre total de rasters pour donner un pourcentage total d'observations appropriées et résultat de l'exportation dans un format compatible ESRI ... peut-être quelque chose qui peut prendre en charge les flottants si besoin est. Je n'ai pas beaucoup travaillé avec Python ou R, mais après une recherche en ligne, il semble logique d'effectuer ce processus dans l'une de ces langues. J'ai trouvé du code jusqu'à présent dans R, mais je ne sais pas comment faire fonctionner cela.
library(rgdal)
raster_data <- list.files(path=getwd()) #promt user for dir containing raster files
num_files <- length(raster_data)
for (i in raster_data) { #read in rasters
my_data <- readGDAL(raster_data[i])
À ce stade, je ne sais pas si je devrais également reclasser et commencer à additionner les données dans cette boucle ou non. Ma supposition serait oui car sinon je pense que je serais peut-être à court de mémoire sur mon ordinateur, mais tout simplement pas sûr. Je ne sais pas non plus comment reclasser les données.
Dans la recherche en ligne, je pense que j'utiliserais reclass(my_data, c(-Inf,3,0, 4,9,1, 10,Inf,0))
, mais cela semble-t-il correct?
Et pour résumer, j'utiliserais sum(stack(my_data))
et je ferais une sortie. Aussi ... si cela peut être effectué plus efficacement ou écrit en Python, je serais également ouvert à cela. Je suis vraiment un débutant en matière de programmation.
Réponses:
C'est une manière concise de le faire dans R --- ici sans fichiers intermédiaires:
la source
R
doivent tous rester en RAM pour créers
. (Probablement deux fois plus de RAM est nécessaire cars
ne remplacera probablement pasraster_data
.) J'espère que vous avez beaucoup de RAM! Votre solution peut être rendue possible en divisant les 2000 grilles en petits groupes, en effectuant le calcul pour chaque groupe, puis en combinant ces calculs.stack
etcalc
travaillé comme la plupart des autresR
fonctions en chargeant d'abord toutes les données dans la RAM.Comme je l'ai remarqué dans les commentaires, vous devez généralement éviter d'utiliser R à des fins non statistiques en raison de problèmes de performances dans certains aspects (l'utilisation des cycles est un exemple). Voici un exemple de code pour vous à Pyhton (grâce à cet article ) pour la reclassification d'un seul fichier avec une seule bande. Vous pourrez le modifier facilement pour le traitement par lots si vous savez comment obtenir tous les fichiers du répertoire . Notez que les rasters sont représentés comme des tableaux, vous pouvez donc utiliser des méthodes de tableau pour améliorer les performances, le cas échéant. Pour travailler avec des tableaux en Python, voir la documentation Numpy .
UPD: le code que j'ai publié initialement était une version tronquée d'un filtre personnalisé qui avait besoin d'un traitement par pixel. Mais pour cette question, l'utilisation de Numpy augmentera les performances (voir le code).
la source
N'utilisez pas readGDAL. Il lit dans un objet Spatial * qui pourrait ne pas être une bonne idée.
Utilisez le
raster
package. Il peut lire des choses GDAL dans des objets Raster. C’est une bonne chose.r = raster("/path/to/rasterfile.tif")
le lirar
.Votre classement est alors
t = r > 4 & r <= 9
La grande question est de savoir si vous devez les exporter vers de nouveaux fichiers raster, puis effectuer l'étape de résumé dans une autre boucle. Si vous avez le stockage, je les écrirais dans de nouveaux fichiers simplement parce que si votre boucle échoue (car l'un de ces 2000 fichiers est indésirable), vous devrez recommencer. Utilisez donc
writeRaster
pour créer des rasters seuillés si vous décidez de le faire.Votre boucle est alors juste quelque chose comme
cette.
La gestion de la mémoire de R pourrait vous frapper ici - quand vous le faites,
count=count+r
R pourrait bien faire une nouvelle copie decount
. C'est donc potentiellement 2000 exemplaires - mais la collecte des ordures va démarrer et nettoyer, et c'est ici que le bouclage de R était très mauvais.En termes de timing, sur mon PC 4 ans, le seuil op prend environ 1,5 s sur un raster de cette taille de nombres aléatoires compris entre zéro et vingt. Times 2000 = vous faites le calcul. Comme toujours, faites un petit ensemble de test pour développer le code, puis lancez-le sur vos données réelles et allez prendre un café.
la source
R
2.15.0), la lecture d'une grille de 1,6 mégapixels (au format natif à virgule flottante ESRI) prend 0,19 seconde et l'exécution des cinq opérations de boucle - deux comparaisons, une conjonction, un ajout et un magasin - en prend une autre 0,09 seconde, pour 0,28 seconde par itération. Lorsque, au lieu de cela, la boucle est effectuée en mettant en cache 100 grilles à la fois dans un tableau et en utilisantrowSums
pour faire les totaux, l'utilisation de la RAM augmente bien sûr: mais, tout aussi évidemment, il n'y a pas de récupération de place. Le chronométrage tombe seulement à 0,26 seconde par itération.