4 votos

Generador de modelos / Python: cálculo de ráster por lotes

Deseo llevar a cabo una trama de cálculo en un lote de rásteres. Quiero agregar rásteres por mes, como se identifica por su nombre de archivo.

es decir, todos los rásteres en el mes de enero debe agregar juntos y de salida de una sola ene.png/archivo raster. A continuación, todos los rásteres en Febrero debe agregar juntos y producen un único FEB.png.

Por lo general, yo usaría raster calculator, yo prefiero automatizar a través de cualquiera de python o de modelbuilder.

Mi plan es el siguiente:

Input Files. 36 Weekly raster files
5jan15-11jan15.png
12jan15-18jan15.png
19jan15-25jan15.png
26jan15-31jan15.png
01feb15-07feb15.png....

Raster operation.
(raster1+raster2+raster3+raster4)/(raster1+raster2+raster3+raster4) = month.png

output. 12 rasters for each month.
jan.png
feb.png
march.png

es posible escribir una expresión de python o crear un modelbuilder que agregar rásteres por mes usando su nombre de archivo?

Los Intentos Actuales

He construido un modelo, sin embargo, esto sólo se ejecuta en los rásteres que me proporcionas, me exigía para escribir una nueva expresión en cada momento. En otras palabras, es el mismo que ejecutar manualmente trama de la calculadora y la escritura de una nueva expresión de cada mes, quiero automatizar este a través de modelbuilder. enter image description here

2voto

Örjan Jämte Puntos 3127

Podría hacer esto en ModelBuilder, pero sería complicado y probablemente requiera modelos de anidamiento para que la iteración por mes funcione correctamente. Con python, es bastante sencillo. Aquí hay algunos códigos para empezar:

 import os, collections, re
import arcpy

arcpy.CheckOutExtension("Spatial")
arcpy.env.workspace = "<path to rasters directory>"
outdir = "<path to output dir"  

months = ["jan", "feb", "mar", "apr", "may", "jun",
          "jul", "aug", "sep", "oct", "nov", "dec"]
pat = re.compile("|".join(months))
ddict = collections.defaultdict(list)

# Create groupings of the files by month.
for raster in arcpy.ListRasters():
    res = re.findall(pat, raster)
    if res != []:
        ddict[res[0]].append(raster)    

for month,items in ddict.items():
    output = os.path.join(outdir, month + ".png")
    # Create raster objects to perform map algebra
    rasterObjs = [arcpy.Raster(it) for it in items]
    summed = sum(rasterObjs)
    rasOut = summed/summed
    # Save to disk
    arcpy.CopyRaster_management(rasOut, output)        

    # Cleanup
    try:
        arcpy.Delete_management(summed)
        arcpy.Delete_management(rasOut)
        arcpy.Delete_management(rasterObjs)
    except:
        pass
 

0voto

xorsyst Puntos 347

Yo no sé acerca de un modelo, pero he escrito un código que puede dar un poco de información sobre el trabajo hacia su propia secuencia de comandos. No tengo la Calculadora Ráster de licencia para la prueba.

La idea aquí bing desea iterar a través de los nombres de archivo (cadenas) de archivos dentro de su ruta de acceso del directorio. A continuación, usted desea tomar el mes de ningún archivo que tiene la nomenclatura de ##(3 carta de mes)##. Si esa cadena es igual a la del mes especificado, a continuación, agregar que el nombre de archivo a una lista. He creado una función para realizar los cálculos se ven un poco mejor y, de nuevo, yo no lo he probado, pero debería funcionar algo como eso. ejecutar el creado de la función, básicamente, de concatenar todas las cadenas se almacenan en cada matriz se han creado por mes. No hay más que probable que de una manera más fácil de hacer esto, pero yo no soy adepto a python. La única cosa que se me ocurre de que puede convertirse en un problema es que al entrar en los parámetros de la trama de la calculadora puede tomar solo las capas vs real .los archivos png.

`

import arcpy
import os
mJan = []
# have to create one for each month mFeb, mMar
for filename in os.listdir(r'DirectoryPath'):
    month = filename[-9:-6]
    if month == "jan":
        mJan.append(filename)
    #continue elif statesments for each month
    #elif month == "feb":
        #mFeb.append(filename)


def rasterCalc(month, array):
    arcpy.gp.RasterCalculator_sa(" & ".join(array),r'DirectoryPath'+ '\\' + month + '.png')

rasterCalc("jan", mJan)
#continue placing statments`

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