5 votos

Conversión de rásters de gran tamaño a NumPy

Tengo una base de datos geográfica que contiene un gran número de conjuntos de datos ráster: hay dos rásteres para cada país del mundo, y son muy grandes, en algunos casos hasta 3 GB por conjunto de datos ráster.

Tengo que convertirlos en matrices NumPy para ejecutar un programa analítico que he escrito sobre ellos, pero me encuentro con un error de memoria cuando mi script intenta convertir el primer conjunto de datos raster. El script crea una lista de todos los rásteres en el conjunto de datos (rasterList), luego toma los códigos de los países al final de cada nombre del conjunto de datos ráster y rellena una nueva lista con todos los códigos de los países. A continuación, borro rasterList, e itero a través de los códigos de los países, convirtiendo los rásteres en 'GLUR_'+código o 'Pop00_'+código. Borro cada ráster de la memoria después de convertirlo, pero el programa no llega ni siquiera a eso...

El código es:

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 = []

for raster in rasterList:
    codeList.append(raster[5:])

del rasterList

for code in 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 array converted"
    del inputPop
    del arr

y da este error:

Traceback (most recent call last):
  File "J:\PYTHON\RasterToNumPy.py", line 21, in <module>
    arr = arcpy.RasterToNumPyArray(inputGLUR, nodata_to_value=0)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\__init__.py", line 2244, in RasterToNumPyArray
    return _RasterToNumPyArray(*args, **kwargs)
MemoryError

Esto es en un ordenador con un procesador i7 y 16GB de RAM. Los datos se almacenan en un disco externo. Alguna idea sobre cómo manejar rasters de este tamaño?

2voto

WilfriedVS Puntos 321

Para cualquiera que encuentre esto y tenga una pregunta similar, encontré una respuesta útil en esto pregunta relacionada .

Lo que me funcionó fue exportar los grandes conjuntos de datos rasterizados de la geodatabase a archivos .tif, y luego usar el lector de imágenes SciPy para renderizarlos como matrices NumPy:

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

Espero que le sirva de ayuda a cualquiera que esté atascado en un problema similar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X