¿Realizando múltiples cálculos en ArcGIS Attribute Table?

8

Tengo una hoja de cálculo Excel existente desarrollada para rastrear datos específicos de hidrantes contra incendios, esto se actualiza periódicamente y se une a los datos espaciales de hidrantes en ArcGIS. En la hoja de cálculo hay una serie de columnas para ingresar datos relacionados con la presión estática, la presión residual y la velocidad de flujo.

ingrese la descripción de la imagen aquí

Utilizando la capacidad nominal a 20 PSI en una fórmula de prueba de flujo de fuego para calcular el flujo de fuego, la hoja de cálculo calcula automáticamente. El cálculo es el siguiente.

Fire Flow = Flow * ((Static - 20)/(Static - Residual))^0.54

No estoy seguro de la mejor manera de atacar esto y estoy buscando sugerencias. Con base en los resultados del cálculo, tengo una columna adicional con una declaración IF que indica el color de flujo de incendio apropiado que se debe pintar el hidrante. Para aquellos que no saben, el color del hidrante es un indicador para despedir al personal en caso de emergencia de las condiciones del flujo de incendio. He investigado un poco y he desarrollado el siguiente script de Python:

def Reclass !Bon_Color!:
     if ( !Fire_Flow! <= 0):
       return Black
     elif ( !Fire_Flow! >= 1 and !Fire_Flow! <= 499):
       return  Red
     elif ([Fire_Flow] > 499 and [Fire_Flow] <= 999):
       return Orange
     elif ( !Fire_Flow! > 999 and !Fire_Flow! <= 1499):
         return Green
     elif ( !Fire_Flow! > 1499):
         return Blue
  end if

Me gustaría saber si los cálculos mencionados anteriormente, utilizados en la hoja de cálculo de Excel, podrían replicarse en la tabla de atributos de la base de datos utilizando la calculadora de campo y el analizador de pitón. En lugar de confiar en la hoja de cálculo de Excel y la necesidad de volver a unir los datos.

LandArch
fuente
55
Pueden, pero esto es más una pregunta SQL que una pregunta SIG.
Dan C
La segunda mitad se puede hacer a través de la Calculadora de campo, solo tengo que hacer la codificación de Python correctamente.
LandArch
Si se trata de una pregunta sobre ArcGIS Field Calculator y su Python Parser, creo que debería editarlo para que quede claro y evitar que se cierre por ser demasiado amplio (haciendo dos preguntas).
PolyGeo
Creo que será más fácil con esto si lo hace en el back-end, en la base de datos SQL que almacena las características. Puede configurar una consulta de actualización para que se ejecute a diario o con la frecuencia necesaria para calcular estos valores y no tiene que volver a pensar en ello. También puede crearlo como una 'columna calculada', que se completará automáticamente con los valores correctos a medida que edita la capa. Hable con su administrador de db.
Dan C
@Dan CI no está en desacuerdo con usted. Lamentablemente no tenemos un administrador de base de datos. Supongo que lo soy. Descubrí lo suficiente como para configurar PostgreSQL para que pudiéramos usar los datos en el campo en la aplicación ARCGIS Collector en una tableta. Estoy pensando que Python y la calculadora de campo pueden ser mi mejor opción solo para aprender algo que pueda usar más adelante.
LandArch

Respuestas:

4

Su código de Python tiene sentido pero tiene algunos errores. Pegue esto en el cuadro "Código de script prelógico" en la calculadora de campo:

def Reclass (fire_flow):
     if (fire_flow <= 0):
       return "Black"
     elif (fire_flow >= 1 and fire_flow <= 499):
       return "Red"
     elif (fire_flow > 499 and fire_flow <= 999):
       return "Orange"
     elif (fire_flow > 999 and fire_flow <= 1499):
       return "Green"
     elif (fire_flow > 1499):
       return "Blue"

Luego, en el cuadro debajo de eso, pegue:

Reclass (!Fire_Flow!)

La sangría en ese bloque superior es un poco inusual, pero la cantidad exacta de sangría no importa siempre que las líneas estén sangradas correctamente una con respecto a la otra.

Los errores:

def Reclass !Bon_Color!:

Cuando define una función, debe seguirla con una lista de parámetros que la función utiliza para hacer su trabajo. La lista debe estar entre paréntesis. En su caso, solo está utilizando un parámetro de entrada, su número Fire_Flow.

if ( !Fire_Flow! <= 0):
   return Black

Pasará !Fire_Flow!a la función, una vez que esté en la función, ese valor se asignará a la variable fire_flow, por lo tanto, refiérase a esa variable. Además, debe poner Blackcomillas para que se devuelva una cadena. De la forma en que lo tiene aquí, su script está buscando una variable llamada Blackpara devolver, y no existe.

end if

No necesitas terminar si estás en Python.

Para su primer campo, el número de flujo de fuego, debe nombrar sus campos apropiadamente y el operador para los exponentes en Python es **, no ^pegar esto en el cuadro inferior de la calculadora de campo:

!Fire_Flow! = !Flow! * ((!Static! - 20)/(!Static! - !Residual!))**0.54

Si necesita actualizar más de un campo simultáneamente, estoy de acuerdo con MacroZED en que un cursor de actualización es la mejor manera, pero puede ser un poco confuso si es nuevo en Python.

Dan C
fuente
Gracias, esto funcionó para calcular el color del capó, ¿alguna idea sobre el cálculo de la otra parte del if?
LandArch
@LandArch Lo siento, pensé que la pregunta decía que esa parte fue resuelta. Agregaré eso.
Dan C
2

Esto definitivamente se puede hacer en ArcGIS sin la necesidad de sobresalir. Si estos campos (Presión estática, Presión residual y Velocidad de flujo) ya están en un conjunto de datos, entonces podemos usar los siguientes cursores para agregar los nuevos campos y actualizarlos:

import arcpy

ds = r"path/to/dataset"    

with arcpy.da.UpdateCursor(ds, ["Fire_Flow", "Colour"]) as ucursor:
    with arcpy.da.SearchCursor(ds, ["Static", "Residual", "Flow", "Fire_Flow"]) as scursor:
        for urow in ucursor:
             for srow in scursor:
                 urow[0] = "{}" * (("{}"-20)/("{}"-"{}"))**0.54.format(srow[2], srow[0], srow[0], srow[1])
                 ucursor.updateRow(urow)
                 if srow[3] <= 0:
                     urow[1] = "Black"
                     if srow[3] >= 1 and srow[3] <= 499:
                         urow[1] = "Red"
                         if srow[3] > 499 and srow[3] <= 999:
                             urow[1] = "Orange"
                             if srow[3] > 999 and srow[3] <= 1499:
                                 urow[1] = "Green"
                                 if srow[3] > 1499:
                                     urow[1] = "Blue"
                                     ucursor.updateRow(urow)
MacroZED
fuente
No quiero agregar las columnas, solo quiero actualizarlas cuando se realicen las pruebas de Estático, Residual y Flujo y se agregue el número.
LandArch
no hay problema, solo puedes eliminar eso. editaré el guión para reflejar esto. El script deberá volver a ejecutarse cada vez que cambien los valores Estático, Residual o Flujo. Pero este método será más rápido que el campo Calcular.
MacroZED
Recibo el siguiente error, ¿tiene que cambiarse el [#] ya que no están en la fila 1 a la 3 en la tabla de atributos? Rastime error Traceback (última llamada más reciente): Archivo "<cadena>", línea 5, en <module> RuntimeError: no se puede abrir 'ruta / a / conjunto de datos'
LandArch
No. el error se debe a que no ha especificado el conjunto de datos. La variable "ds" debe cambiarse a su conjunto de datos real.
MacroZED
Perdón por la mano, necesito incluir la ruta física, por ejemplo, C: / ....
LandArch