Mehrere Berechnungen in der ArcGIS-Attributtabelle durchführen?

8

Ich habe eine vorhandene Excel-Tabelle entwickelt, um bestimmte Hydrantendaten zu verfolgen. Diese wird regelmäßig aktualisiert und mit den räumlichen Hydrantendaten in ArcGIS verknüpft. In der Tabelle gibt es eine Reihe von Spalten, in die Daten zu statischem Druck, Restdruck und Durchflussrate eingegeben werden können.

Geben Sie hier die Bildbeschreibung ein

Unter Verwendung der Nennkapazität bei 20 PSI in einer Fire Flow Test- Formel zur Berechnung des Fire Flow berechnet die Tabelle automatisch. Die Berechnung ist wie folgt.

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

Ich bin mir nicht sicher, wie ich das am besten angreifen kann, und suche nach Vorschlägen. Basierend auf den Ergebnissen der Berechnung habe ich eine zusätzliche Spalte mit einer IF-Anweisung, die die geeignete Brandflussfarbe angibt, für die der Hydrant gestrichen werden soll. Für diejenigen, die nicht wissen, ist die Hydrantenfarbe ein Indikator für das Feuerwehrpersonal im Notfall die Brandflussbedingungen. Ich habe einige Nachforschungen angestellt und das folgende Python-Skript entwickelt:

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

Ich möchte wissen, ob die oben genannten Berechnungen, die in der Excel-Tabelle verwendet werden, mithilfe des Feldrechners und des Python-Parsers in der Datenbankattributtabelle repliziert werden können. Anstatt sich auf die Excel-Tabelle und die Notwendigkeit zu verlassen, die Daten erneut zu verbinden.

LandArch
quelle
5
Sie können, aber dies ist eher eine SQL-Frage als eine GIS-Frage.
Dan C
Die zweite Hälfte kann über Field Calculator durchgeführt werden. Ich muss nur die Python-Codierung richtig einstellen.
LandArch
Wenn dies eine Frage zum ArcGIS-Feldrechner und seinem Python-Parser ist, sollten Sie ihn meiner Meinung nach bearbeiten , um dies zu verdeutlichen und zu vermeiden, dass er geschlossen wird, weil er zu weit gefasst ist (indem Sie zwei Fragen stellen).
PolyGeo
Ich denke, Sie werden es leichter haben, wenn Sie es im Back-End in der SQL-Datenbank tun, in der die Funktionen gespeichert sind. Sie können eine Aktualisierungsabfrage einrichten, die täglich oder wie oft auch immer ausgeführt wird, um diese Werte zu berechnen, und Sie müssen nicht erneut darüber nachdenken. Möglicherweise können Sie es auch als 'berechnete Spalte' erstellen, die beim Bearbeiten der Ebene automatisch mit den richtigen Werten gefüllt wird. Sprechen Sie mit Ihrem Datenbankadministrator.
Dan C
@ Dan CI nicht mit Ihnen nicht einverstanden. Leider haben wir keinen Datenbankadministrator. Ich denke, dass ich es bin. Ich habe genug herausgefunden, um PostgreSQL so einzurichten, dass wir die Daten im Feld in der ARCGIS Collector App auf einem Tablet verwenden können. Ich denke, dass Python und Feldrechner meine bessere Option sein können, nur damit ich etwas lerne, das ich später verwenden kann.
LandArch

Antworten:

4

Ihr Python-Code ist sinnvoll, weist jedoch einige Fehler auf. Fügen Sie dies in das Feld "Pre-Logic Script Code" im Feldrechner ein:

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"

Fügen Sie dann in das Feld darunter Folgendes ein:

Reclass (!Fire_Flow!)

Die Einrückung in diesem oberen Block ist etwas ungewöhnlich, aber das genaue Ausmaß der Einrückung spielt keine Rolle, solange die Linien relativ zueinander korrekt eingerückt sind.

Die Fehler:

def Reclass !Bon_Color!:

Wenn Sie eine Funktion definieren, müssen Sie ihr eine Liste von Parametern folgen, mit denen die Funktion ihre Arbeit erledigt. Die Liste sollte in Klammern stehen. In Ihrem Fall verwenden Sie nur einen Eingabeparameter, Ihre Fire_Flow-Nummer.

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

Sie werden passieren !Fire_Flow!in die Funktion, wenn Sie in der Funktion sind der Wert der Variablen zugewiesen wird fire_flow, so stattdessen auf diese Variable verweisen. Außerdem müssen Sie BlackAnführungszeichen setzen, damit eine Zeichenfolge zurückgegeben wird. So wie Sie es hier haben, sucht Ihr Skript nach einer Variablen mit dem Namen Black, die zurückgegeben werden soll, und sie existiert nicht.

end if

Sie brauchen kein Ende, wenn Sie in Python sind.

Für Ihr erstes Feld, die Feuerflussnummer, müssen Sie Ihre Felder entsprechend benennen, und der Operator für Exponenten in Python lautet **nicht. ^Fügen Sie dies in das untere Feld des Feldrechners ein:

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

Wenn Sie mehr als ein Feld gleichzeitig aktualisieren müssen, stimme ich MacroZED zu, dass ein Aktualisierungscursor der bessere Weg ist, aber diese können etwas verwirrend sein, wenn Sie Python noch nicht kennen.

Dan C.
quelle
Danke, das hat funktioniert, um die Motorhaubenfarbe zu berechnen. Irgendwelche Gedanken zur Berechnung des anderen Teils des Wenn?
LandArch
@ LandArch Entschuldigung, ich dachte, die Frage besagt, dass dieser Teil erledigt wurde. Ich werde das hinzufügen.
Dan C
2

Dies kann definitiv in ArcGIS erfolgen, ohne dass Excel erforderlich ist. Wenn diese Felder (statischer Druck, Restdruck und Durchflussrate) bereits in einem Datensatz enthalten sind, können wir die neuen Felder mithilfe der folgenden Cursor hinzufügen und aktualisieren:

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)
Makroisiert
quelle
Ich möchte die Spalten nicht hinzufügen, sondern nur aktualisieren, wenn der Test von Static, Residual und Flow durchgeführt und die Nummer hinzugefügt wird.
LandArch
Kein Problem, das können Sie einfach entfernen. Ich werde das Skript bearbeiten, um dies widerzuspiegeln. Das Skript muss jedes Mal neu ausgeführt werden, wenn sich die Werte für Static, Residual oder Flow ändern. Diese Methode ist jedoch schneller als das Feld Berechnen.
MacroZED
Ich erhalte die folgende Fehlermeldung: Muss das [#] geändert werden, da es sich nicht um die Zeilen 1 bis 3 in der Attributtabelle handelt? Laufzeitfehler Traceback (letzter Aufruf zuletzt): Datei "<string>", Zeile 5, in <module> RuntimeError: 'Pfad / zu / Datensatz' kann nicht geöffnet werden
LandArch
Nein, der Fehler liegt darin, dass Sie den Datensatz nicht angegeben haben. Die Variable "ds" muss in Ihren tatsächlichen Datensatz geändert werden.
MacroZED
Entschuldigung für das Halten der Hand, ich muss den physischen Pfad
angeben