4 votos

¿Cómo calcular el número total de celdas de datos en raster?

Estoy utilizando ArcGIS 9.3 y python 2.5. Mi código es mostrado en la parte inferior de este post.

Tengo un mapa de bits que contiene la intensidad del fuego de la información a 200m de la célula de resolución. Ejecute la secuencia de comandos y la primera parte de la célula devuelve el tamaño del fuego. Esto funciona bien.

Yo, a continuación, el clip de la trama mediante un polígono que representa un boscosa de la cuenca. El nuevo ráster que representa el área de la cuenca que está quemada. Cuando trato de usar el mismo código para contar el número de células de la nueva trama, siempre me da una respuesta de cero, incluso si no es definitivamente una trama creada por la herramienta recortar.

He intentado todas las combinaciones de cada una de las herramientas que puedo pensar.

mi código...

    fire = str(ignitionID) + "_" + str(weatherID) + "_Intensity.asc"
    print "fire: " + fire

    # ---------------------------------------------------------------------------
    # this section calculates the size of the fire for model calibration purposes
    # ---------------------------------------------------------------------------

    # Process: Build Raster Attribute Table...
    the_fire = input_fires + fire
    shutil.copy(the_fire, "C:\\FIRESTORM\\Workspace") # copy the fire to workspace
    the_fire = "C:\\FIRESTORM\\Workspace\\" + fire

    try:
      gp.BuildRasterAttributeTable_management(the_fire, "NONE")
      resultf = gp.GetCount_management(the_fire)  # count num of rows in raster
      countf = int(resultf.GetOutput(0))
      fire_area = countf * 4  # each cell has an area of 4 ha
      print "the fire area = " + str(fire_area) + " ha"

    except:  # the attribute table cannot be created coz the fire is too large

      fire_area = 300000 # default value for large fires 300000 ha
      print "the fire area EXCEEDS 262,140 ha"

    # -----------------------------------------------------------------------------
    # this section calculates the area of the catchments that are burnt by the fire
    # -----------------------------------------------------------------------------

    # Local variables...
    catch_extent = input_catch + "WS_Catchment_region.shp"  # catchment boundary
    fire_raster = "C:\\FIRESTORM\\Workspace\\fire_raster"
    fire_ascii = the_fire
    Output_raster = "C:\\FIRESTORM\\Workspace\\Extract_ASCI1"
    Output_ASCII = "C:\\FIRESTORM\\Workspace\\rastert_extract1.asc"
    catch_burn_area = 0  # reset catchment burn area

    # Process: ASCII to Raster...
    gp.ASCIIToRaster_conversion(fire_ascii, fire_raster, "INTEGER")

    # Process: Define Projection... based on projection of catch_extent
    desc = gp.Describe(catch_extent)
    spatialRef = desc.SpatialReference
    gp.DefineProjection_management(fire_raster, spatialRef)

    # Process: Extract by Mask...
    gp.ExtractByMask_sa(fire_raster, catch_extent, Output_raster)

    # Convert raster to ascii
    gp.RasterToASCII_conversion(Output_raster, Output_ASCII)

    # Process: Build Raster Attribute Table...
    gp.BuildRasterAttributeTable_management(Output_ASCII, "OVERWRITE")

    # count number of rows in raster
    resulti = gp.GetCount_management(Output_ASCII)
    counti = int(resulti.GetOutput(0))
    catch_burn_area = counti * 4  # each cell has an area of 4 ha

    print "catchment area burnt = " + str(catch_burn_area) + " ha"

1voto

houbysoft Puntos 222

par de opciones que se me ocurren sin adentrarse demasiado en el código. Ambos se basan en una zona de la máscara, lo que podría hacer por empujar a su trama, que es probablemente una mezcla de valores, a través de un Con (doc aquí) así que la salida sólo tiene valores de 1 cuando no hay datos. Puede tomar la máscara/zona de cuadrícula y utilice w/:

  1. zonalgeometry (doc aquí)
  2. @whuber la sugerencia de zonalsum el 1s y se multiplica por el área.

Como alternativa, puede utilizar un cursor para olfatear el uno y sólo el IVA de la fila y extraer el CONDE de campo (no estoy seguro de la sintaxis para esta vuelta en 9.3). Ejemplo:


---EDIT---

csr = arcpy.SearchCursor(gridVAT)
row = csr.next()
min = row.getValue('COUNT')

El pensamiento COLUMNCOUNT + ROWCOUNT no funcionará en forma irregular (es decir, no cuadrada y orientado w/coord sys).

De acuerdo w/@radouxju, no realmente ver el propósito de la representación ASCII. Parece tremendamente caro, pero no puede ver todo su flujo de trabajo.

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