Suite

Conversion de grands rasters en NumPy


J'ai une géodatabase qui contient un grand nombre de jeux de données raster - il y a deux rasters pour chaque pays dans le monde, et ils sont très volumineux, dans certains cas jusqu'à 3 Go par jeu de données raster.

Je dois les convertir en tableaux NumPy afin d'exécuter un programme analytique que j'ai écrit dessus, mais je rencontre une erreur de mémoire lorsque mon script essaie de convertir le premier jeu de données raster. Le script crée une liste de tous les rasters du jeu de données (rasterList), puis récupère les codes de pays à la fin de chaque nom de jeu de données raster et remplit une nouvelle liste de tous les codes de pays. Je supprime ensuite rasterList et parcourt les codes de pays, en convertissant les rasters en 'GLUR_'+code ou 'Pop00_'+code. Je supprime chaque raster de la mémoire après sa conversion, mais le programme ne va même pas aussi loin…

Le code est :

import arcpy, os import numpy as np from arcpy import env env.workspace = "J:/Data/CISC.gdb" filepath = "J:/LIVE/" rasterList = arcpy.ListRasters("G*") codeList = [] pour raster dans rasterList : codeList.append(raster[5:]) del rasterList pour code dans codeList : print code inputGLUR = arcpy.Raster("J:/Data/CISC.gdb/GLUR_"+code) lowerLeft = arcpy.Point (inputGLUR.extent.XMin, inputGLUR.extent.YMin) cellSize = inputGLUR.meanCellWidth print "Converting GLUR_"+code, "to NumPy array" arr = arcpy.RasterToNumPyArray(inputGLUR, nodata_to_value=0) os.chdir("J: /LIVE/NumPy_GLUR") numpy.save("GLUR_"+code+".npy", arr) print "GLUR Converted" del inputGLUR del arr inputPop = arcpy.Raster("J:/Data/CISC.gdb/Pop00_"+ code) lowerLeft = arcpy.Point(inputPop.extent.XMin, inputPop.extent.YMin) cellSize = inputPop.meanCellWidth print "Converting Pop00_"+code, "to NumPy array" arr = arcpy.RasterToNumPyArray(inputPop, nodata_to_value=0) os.chdir("J:/LIVE/NumPy_Pop") numpy.save("Pop00_"+code, arr) print "Population arr ay converti" del inputPop del arr

et renvoie cette erreur :

Traceback (appel le plus récent en dernier) : Fichier "J:PYTHONRasterToNumPy.py", ligne 21, dans  arr = arcpy.RasterToNumPyArray(inputGLUR, nodata_to_value=0) Fichier "C:Program Files (x86)ArcGISDesktop10.3ArcPyarcpy\__init__.py", ligne 2244, dans RasterToNumPyArray return _RasterToNumPyArray(*args, *kwargs) MemoryError

C'est sur un ordinateur avec un processeur i7 et 16 Go de RAM. Les données sont stockées sur un disque externe. Des idées sur la façon de gérer les rasters de cette taille ?


Pour tous ceux qui trouvent cela et qui ont une question similaire, j'ai trouvé une réponse utile dans cette question connexe.

Ce qui a fonctionné pour moi, c'est d'exporter les grands jeux de données raster de la géodatabase vers des fichiers .tif, puis d'utiliser le lecteur d'images SciPy pour les restituer sous forme de tableaux NumPy :

importer scipy de scipy importer misc raster = misc.imread("myraster.tif") np.save("myarray.npy", raster)

J'espère que cela sera utile à toute personne bloquée sur un problème similaire!