6 votos

Bucle For - Álgebra de mapas (ArcGIS) con Python

PREGUNTA ORIGINAL


Soy relativamente nuevo en python y en estos fourms, pero estoy teniendo problemas para utilizar los bucles for para los análisis espaciales dentro de ArcGIS. ¡No parece reconocer la variable, RasterImage!

Esta es una parte del código con la que tengo problemas...

import arcpy, os, sys, string
from arcpy import env
from arcpy.sa import *

arcpy.CheckOutExtension("spatial")

arcpy.env.workspace = r'O:\DATA\test'
InputFolder = arcpy.env.workspace

Temp4 = InputFolder + '\\' + 'temp4'

RasterList = arcpy.ListRasters()
for RasterImage in RasterList:
    print (RasterImage)
    Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA")
    print ('Focal Statistics Done')

Recibo el siguiente error

"Traceback (most recent call last):
File "O:\test.py", line 67, in <module>
Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA")
File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 4796,   in FocalStatistics
ignore_nodata)
File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Utils.py", line 47, in   swapper
result = wrapper(*args, **kwargs)
File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\sa\Functions.py", line 4790,    in wrapper
ignore_nodata)
File "C:\Program Files (x86)\ArcGIS\Desktop10.0\arcpy\arcpy\geoprocessing\_base.py", line 474, in <lambda>
return lambda *args: val(*gp_fixargs(args))
ExecuteError: Failed to execute. Parameters are not valid.
ERROR 000865: Input raster: RasterImage does not exist.
Failed to execute (FocalStatistics)."

Parece que no reconoce mi bucle for in del RasterImage - ¿alguna idea? La declaración de impresión después del bucle muestra que está reconociendo el archivo (en python) pero que los análisis espaciales utilizados en arcpy no.

Pensé que podría tener que ver con el espacio de trabajo utilizado, así que pensé que añadir

RasterImage = InputFolder + '\\' + RasterImage 

puede ayudar a localizar la ruta completa de los conjuntos de datos rasterizados, pero no sirve de nada. Estoy perdido de ideas y los únicos archivos de ayuda que utilizan análisis espaciales en la página de recursos de ArcGIS no utilizan bucles en sus scripts. ¨

ACTUALIZACIÓN


El problema se ha resuelto aplicando lo siguiente:

La pregunta original que muestra el error 'RasterImage' no existe fue causada en parte por las marcas '' y los espacios alrededor del NbrRectangle. He implementado parte de mi nuevo código utilizando las sugerencias de nmpeterson por lo que el geoprocesamiento se llama a través de la función

def focalStats(raster):  
   Temp4 = FocalStatistics(raster, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA")          
   return Temp4 

En las metodologías en las que varios archivos temporales dependen unos de otros (es decir, un geoproceso dentro de otro geoproceso) he utilizado la función .save en un directorio temporal como muestra om_henners antes de borrar todo ese contenido después.

5voto

Jon M Puntos 206

En la línea Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA") es necesario eliminar las comillas simples alrededor de RasterImage -- se está tratando como una cadena literal y buscando un archivo llamado RasterImage.

Editar: Pensando un poco más en esto, me pregunto si el script está fallando porque inicializas Temp4 como una cadena pero luego lo redefines como lo que sea el tipo de retorno de FocalStatistics -- no estoy seguro si se maneja como una cadena o no.

Prueba esto:

import arcpy, os, sys, string
from arcpy import env
from arcpy.sa import *

arcpy.CheckOutExtension("spatial")

arcpy.env.workspace = r'O:\DATA\test'
InputFolder = arcpy.env.workspace

def focalStats(raster):
    Temp4 = FocalStatistics(raster, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA")
    return Temp4

RasterList = arcpy.ListRasters()
for RasterImage in RasterList:
    print (RasterImage)
    focalStats(RasterImage)
    print ('Focal Statistics Done')

3voto

ESV Puntos 4591

Como @nmpeterson dice La primera cuestión se reduce a las comillas que rodean al RasterImage nombre de la variable.

Sin embargo, lo importante es que estás sobrescribiendo la variable Temp4 con el contenido de la trama. En cambio, según el Documentación de FocalStatistics de ESRI, el objeto ráster devuelto tiene un save(path) método.

Asumo que no quieres sobrescribir tu salida cada vez, así que una forma rápida de obtener un nombre temporal es en Python usando tempfile.NamedTemporaryFile(dir="working_dir").name - Sin embargo, esto no almacenará una referencia al Raster original, lo cual asumo que quieres, así que podemos hacerlo de manera ligeramente diferente como sigue (asumiendo que estás usando Info rasters - si estás usando un .tif, .png etc tendrás que quitar la extensión del archivo antes de crear el nuevo archivo):

import arcpy, os, sys, string
from arcpy import env
from arcpy.sa import *

arcpy.CheckOutExtension("spatial")

input_folder = r'O:\DATA\test'
arcpy.env.workspace = input_folder

raster_list = arcpy.ListRasters()
for raster_image in raster_list:
    print (raster_image)
    f_stats = FocalStatistics(raster_image, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA")
    f_stats_out = input_folder + os.sep + raster_image + "_f_stats.tif"
    f_stats.save(f_stats_out)
    print ('Focal Statistics Done')

Una última vez: la convención estándar de Python es utilizar minúsculas para los nombres de las variables con guiones bajos (véase PEP 8 ) pero al final no es gran cosa.

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