ArcGIS Field CalculatorのPython Parserの基本的なIf / Then?


18

ArcGIS 10.2 for Desktopを使用していますが、このサイトに目を通しましたが、まだ答えがわからないようです。VBAとPythonには非常に新しいですが、ArcGISで長年使用しました。[属性による選択]を使用すると、これを遅い方法で実行できますが、時間がかかります。

私は病気の症例(ポイントレイヤー)と米国国勢調査(ポリゴンレイヤー)の空間結合を試みています。これにはカウントデータが必要です。ポイント/ケースごとに、ケースが発生した年に応じて2001〜2012の日付範囲を持つYEARというフィールドがあります。毎年、カウント列が必要です。たとえば、COUNT01を呼び出す最初のもの。YEARのケース日付が2001の場合、COUNT01には1が含まれます。それ以外の年(2002-2012)の場合、0にする必要があります。COUNT02、COUNT03 ... COUNT12列があります。「Null」値を持つことはできません。

ここに私が今まで試したものがあります

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

そして、これがArcでのデータの表示です。

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


3
Pythonを使用してこれを行い、質問を編集してvbaand vbscriptタグをタグに置き換えることをお勧めしますpython。まだ消えていませんが、VBScriptは非推奨になっています。実際の入力と期待される出力を示すサンプル行の画像/テーブルを含むより詳細な説明を提供すれば、Pythonパーサーで簡単に行えると期待しています。YEARは年に対応する値を含む日付フィールドまたは整数フィールドですか?
PolyGeo

アドバイスと助けてくれてありがとう。属性テーブルの画像を追加しました。現在、YEAR入力変数はDouble(SAS日付から解析された)として保存され、出力変数の列Counts01はShort Integerとして保存されます。
BenW 14年

1
YEARをケースフィールドとして使用して要約統計を使用することを検討しましたか?これにより、PythonやField Calculatorを使用する必要なく、毎年のCOUNTが得られます。
PolyGeo

助言ありがとう。要約統計を考慮しましたが、最終目標は、1249の国勢調査地区ごとの年間症例数を取得し、そこから年間および10万年間の平均発生率を10万人ごとに計算することです。一部の国勢調査地区には症例がなく、一部の国勢調査区にはトンがありましたが、すべてを含める必要があります。年ごとに路を要約しても、症例のないそれらの路の278が省略されます。
BenW

回答:


38

私はこれがあなたが望むものだと思います... pythonを使用すると、次のことができます(YEARおよびCOUNT0Xフィールドは整数であると仮定します)

  • 以下に強調表示されているPythonに変更します
  • 「Pre Logic」入力ボックスにコードを追加します
  • 計算する各フィールドの必要に応じてyearValを変更します(Count01は2001を使用し、Count02は2002を使用するなど)

注インデントを使用してコードを解析するPythonは、間隔が正しいことを確認します。

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

この


3
@BenW-これで問題が解決した場合は、これを回答としてマークしてください(回答投票数の下のチェックボックス)。
チャドクーパー14年

ifステートメントで文字列の値を確認したい場合、どうすればアクセント付き文字が含まれますか?
グレイライン14年

フィールドが別のタイプ(テキスト、ダブルなど)にある場合はどうしますか?
ハリフ

@khaliffを使用して、Pythonコードにいくつかの型変換関数を挿入しif (int(year) == yearVal): たり、他の関数を挿入したりできます(informit.com/articles/article.aspx?p=459269&seqNum=7を参照)。
-gisnside

ありがとうございました。myCalc、myFunc、Reclassなどをいつ使用するかについてのリンクもありますか?
ハリフ

8

この答えは本質的に上記と同じですが、コードブロックを使用する必要がない方法です... Count01フィールドでは、パーサーをPythonに設定してから、計算を

1 if !YEAR! == 2001 else 0

これを読み取る方法は次のとおりです。YEARフィールドが2001の場合はフィールドを1に設定し、2001でない場合は0に設定します。

複数のif条件がある場合、次のように、elseステートメント内に2番目(および後続)の「if」条件をネストできます。

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

これは、YEARフィールドが2001の場合はフィールドを1に設定し、2001でない場合は2に設定し、2002の場合は2に設定し、そうでない場合は0に設定します。


複数の条件がある場合、「elif」を使用しているように、この計算をどのように変更すればよいですか?
ハリフ

あなたが複数の条件を持っている場合は、巣の第二(およびそれ以降)... else文の内部条件の「if」...あなたはこのようなもので終わるかもしれないので、することができます1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
ジェイソン・ミラー

6

VBScriptを使用する場合、フィールド計算が正しく設定されていません。最初に、フィールドの名前である変数を使用しません。これは混乱を招きます。別の名前を使用して、設定内容を明確にします。「endif」が間違っていて、「end if」であり、コードがpre-logicスクリプトセクションにあるはずです。これを設定する正しい方法を以下に示します。しかし、他の人が言ったように、ESRIはPythonを支持するためにVBScriptを取り除くことに大いに傾いているため、VBScriptを使用しないようにしてください。

フィールド計算機の正しい使用法


ご協力ありがとうございます。それが全体的なコンセンサスであると思われるので、私はPythonで行くことになりました。
BenW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.