ArcGIS属性テーブルで複数の計算を実行しますか?


8

特定の消火栓データを追跡するために開発された既存のExcelスプレッドシートがあります。これは定期的に更新され、ArcGISの空間消火栓データに結合されます。スプレッドシートには、静圧、残圧、および流量に関連するデータを入力するための多数の列があります。

ここに画像の説明を入力してください

火の流れを計算するために火の流れのテストで20 PSIの定格容量を利用して、スプレッドシートは自動的に計算します。計算は以下のとおりです。

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

これを攻撃する最善の方法はわかりません。提案を探しています。計算の結果に基づいて、消火栓を塗装する適切な火の流れの色を示すIFステートメントを含む追加の列があります。知らない人のために、消火栓の色は、緊急時に火災の流れの状態で職員を消火するための指標です。私はいくつかの研究を行い、次の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

Excelスプレッドシートで使用される上記の計算が、フィールド計算機とpython-parserを使用してデータベース属性テーブルに複製できるかどうか知りたいのですが?Excelスプレッドシートに依存するのではなく、データを再結合する必要があります。


5
可能ですが、これはGISの質問よりもSQLの質問です。
Dan C

それらの後半はフィールド計算機を介して行うことができます、私はちょうどPythonコーディングを正しくしなければなりません。
LandArch 2016年

これがArcGIS Field CalculatorとそのPythonパーサーに関する質問である場合は、それを編集して明確にし、(2つの質問をすることによって)広くなりすぎて閉じられないようにする必要があります
PolyGeo

機能を格納するSQL dbで、バックエンドでこれを行うと、これで簡単に時間を過ごせると思います。更新クエリを設定して、毎日または頻繁にこれらの値を計算するように設定できます。もう一度考える必要はありません。レイヤーを編集すると、正しい値が自動的に入力される「計算された列」として作成することもできます。データベース管理者に相談してください。
Dan C

@Dan CIはあなたに反対しません。残念ながら、データベース管理者はいません。私はそれだと思います。タブレットでARCGIS Collector Appのフィールドのデータを使用できるように、PostgreSQLをセットアップするのに十分なことがわかりました。私は、Pythonとフィールド計算機が私のより良い選択肢であると考えているので、後で使用できることを学びます。
LandArch、2016年

回答:


4

あなたのpythonコードは理にかなっていますが、いくつかのエラーがあります。これをフィールド計算機の「プレロジックスクリプトコード」ボックスに貼り付けます。

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"

次に、その下のボックスに貼り付けます。

Reclass (!Fire_Flow!)

その一番上のブロックのインデントは少し変わっていますが、行が互いに対して正しくインデントされている限り、インデントの正確な量は重要ではありません。

エラー:

def Reclass !Bon_Color!:

関数を定義するときは、関数がその機能を実行するために使用するパラメーターのリストを関数の後に続ける必要があります。リストは括弧内にある必要があります。あなたのケースでは、1つの入力パラメーター、Fire_Flow番号のみを使用しています。

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

あなたは合格しようとしている!Fire_Flow!あなたは値を変数に割り当てられていることを関数にしていたら、関数にfire_flow、その代わりにその変数を参照してください。また、Black引用符で囲む必要があるため、文字列が返されます。ここにあるように、スクリプトはBlack返す名前の変数を探していますが、それは存在しません。

end if

Pythonの場合は終了する必要はありません。

最初のフィールドであるファイアフロー番号については、フィールドに適切な名前を付ける必要があります。Python **では、指数の演算子はであり^、フィールド計算機の下部のボックスに.pasteしません。

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

複数のフィールドを同時に更新する必要がある場合は、MacroZEDに同意します。更新カーソルの方が良い方法ですが、Pythonを初めて使用する場合は少し混乱する可能性があります。


おかげで、これはボンネットの色を計算するのに役立ちました、ifの他の部分を計算することについての考えは?
LandArch、2016年

@LandArch申し訳ありませんが、問題はその部分が処理されたということだと思いました。追加します。
Dan C

2

これは間違いなく、ArcGISでExcelを実行する必要なく実行できます。これらのフィールド(静圧、残圧、流量)がすでにデータセットにある場合、次のカーソルを使用して新しいフィールドを追加し、それらを更新できます。

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)

列を追加したくありません。静的、残差、フローのテストが実行され、番号が追加されたときに更新したいだけです。
LandArch、2016年

問題ありません。削除してください。これを反映するようにスクリプトを編集します。Static、Residual、またはFlowの値が変更されるたびに、スクリプトを再実行する必要があります。しかし、この方法はフィールドを計算するよりも速くなります。
MacroZED 2016年

次のエラーが発生します。[#]は属性テーブルの行1〜3ではないため、変更する必要がありますか?ランタイムエラートレースバック(最後の最後の呼び出し):<モジュール>のファイル "<string>"、5行目RuntimeError: 'path / to / dataset'を開けません
LandArch

いいえ、エラーはデータセットを指定していないためです。変数「ds」を実際のデータセットに変更する必要があります。
MacroZED 2016年

手持ちで申し訳ありません。物理パスを含める必要があります。例:C:/ ....
LandArch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.