Executando vários cálculos na tabela de atributos do ArcGIS?

8

Eu tenho uma planilha do Excel existente desenvolvida para rastrear dados específicos de hidrante, que são atualizados periodicamente e associados aos dados espaciais do hidrante no ArcGIS. Na planilha, existem várias colunas para inserir dados relacionados à pressão estática, pressão residual e vazão.

insira a descrição da imagem aqui

Utilizando a capacidade nominal de 20 PSI em uma fórmula de teste de fluxo de incêndio para calcular o fluxo de incêndio, a planilha calcula automaticamente. O cálculo é o seguinte.

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

Não tenho certeza da melhor maneira de atacar isso e estou procurando sugestões. Com base nos resultados do cálculo, eu tenho uma coluna adicional com uma declaração IF que indica a cor do fluxo de fogo apropriada na qual o hidrante deve ser pintado. Para quem não sabe, a cor da boca de incêndio é um indicador para despedir o pessoal em uma situação de emergência nas condições do fluxo de incêndio. Eu fiz algumas pesquisas e desenvolvi o seguinte script 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

Gostaria de saber se os cálculos mencionados acima, usados ​​na planilha do Excel, podem ser replicados na tabela de atributos do banco de dados, utilizando a calculadora de campo e o python-parser? Em vez de confiar na planilha do Excel e na necessidade de reunir os dados novamente.

LandArch
fonte
5
Eles podem, mas isso é mais uma questão SQL do que uma questão GIS.
Dan C
A segunda metade pode ser feita através da Calculadora de Campo, só preciso acertar a Codificação Python.
LandArch 27/10
Se essa é uma pergunta sobre o ArcGIS Field Calculator e seu Python Parser, acho que você deve editá- lo para deixar isso claro e evitar que ele seja fechado por ser muito amplo (fazendo duas perguntas).
PolyGeo
Acho que você terá mais facilidade com isso se fizer isso no back-end, no banco de dados SQL que armazena os recursos. Você pode configurar uma consulta de atualização para ser executada diariamente ou, no entanto, com frequência para calcular esses valores e não precisa pensar nisso novamente. Você também pode criá-lo como uma 'coluna computada', que seria preenchida automaticamente com os valores corretos ao editar a camada. Converse com seu administrador de banco de dados.
Dan C
@ Dan CI não discordo de você. Infelizmente, não temos um administrador de banco de dados. Eu acho que sou. Eu descobri o suficiente para configurar o PostgreSQL para que pudéssemos usar os dados no campo no aplicativo ARCGIS Collector em um tablet. Eu estou pensando que Python e calculadora de campo podem ser minha melhor opção apenas para que eu esteja aprendendo algo que eu possa usar mais tarde.
LandArch 28/10

Respostas:

4

Seu código python faz sentido, mas possui alguns erros. Cole isso na caixa "Código do script pré-lógico" na 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"

Em seguida, na caixa abaixo, cole:

Reclass (!Fire_Flow!)

O recuo nesse bloco superior é um pouco incomum, mas a quantidade exata de recuo não importa, desde que as linhas sejam recuadas corretamente em relação uma à outra.

Os erros:

def Reclass !Bon_Color!:

Ao definir uma função, você precisa segui-la com uma lista de parâmetros que a função usa para realizar seu trabalho. A lista deve estar entre parênteses. No seu caso, você está usando apenas um parâmetro de entrada, o seu número Fire_Flow.

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

Você passará !Fire_Flow!para a função, quando estiver na função em que o valor é atribuído à variável fire_flow, portanto, consulte a variável. Além disso, você precisa colocar Blackaspas, para que uma string seja retornada. Do jeito que você o tem aqui, seu script está procurando por uma variável chamada Blacka retornar e ela não existe.

end if

Você não precisa terminar se estiver em Python.

Para o seu primeiro campo, o número do fluxo de incêndio, você precisa nomear seus campos adequadamente e o operador dos expoentes em Python **não é . ^Cole isso na caixa inferior da calculadora de campos:

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

Se você precisar atualizar mais de um campo simultaneamente, concordo com o MacroZED que um cursor de atualização é a melhor maneira, mas isso pode ser um pouco confuso se você é novo no Python.

Dan C
fonte
Obrigado, isso funcionou para calcular a cor do capô, alguma idéia de calcular a outra parte do if?
LandArch 28/10
@LandArch Desculpe, eu pensei que a pergunta estava dizendo que essa parte foi resolvida. Vou acrescentar isso.
Dan C
2

Definitivamente, isso pode ser feito no ArcGIS sem a necessidade de se destacar. Se esses campos (pressão estática, pressão residual e vazão) já estiverem em um conjunto de dados, podemos usar os seguintes cursores para adicionar os novos campos e atualizá-los:

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
fonte
Eu não quero adicionar as colunas, só quero atualizar quando o teste de Estático, Residual e Fluxo for realizado e o número for adicionado.
LandArch 28/10
não tem problema, você pode simplesmente remover isso. editarei o script para refletir isso. O script precisará ser executado novamente sempre que os valores Estático, Residual ou Fluxo forem alterados. Mas esse método será mais rápido que o campo Calcular.
MacroZED
Recebo o seguinte erro, o [#] precisa ser alterado, pois não estão nas linhas 1 a 3 na tabela de atributos? Erro de execução Traceback (chamada mais recente passada): File "<string>", linha 5, em <module> RuntimeError: não pode abrir 'path / to / dataset'
LandArch
Não. O erro ocorre porque você não especificou o conjunto de dados. A variável "ds" precisa ser alterada para o seu conjunto de dados real.
MacroZED
Desculpem a exploração da mão, preciso incluir o caminho físico, por exemplo, C: / ....
LandArch 28/10