0

このコードは、ラスター セル数が追加されたポリゴン データで使用します。たとえば、ラスターが土地被覆の場合、各土地被覆タイプの列と、各ポリゴン内の対応するセル数が表示されます。この出力は地理空間モデリング環境からのものです。Tabulate Raster は、私が使用している大きなシェープファイルでクラッシュし続けるためです。最終的には、以下のコードが達成するセル数ではなく、面積値が必要です。

そのため、コードはシェープファイル属性をループし、元のカウント フィールドを取り出し、ユーザー入力に基づいて新しいフィールドを作成し (ユーザー入力名 + ラスター値を使用して AddField をループして新しいフィールド名を取得します)、元のフィールドをループします。値を入力し、新しいフィールドのユーザー指定の面積値を計算します。基本的に、モデルビルダーで通常バッチ処理するフィールドの追加、フィールドの計算モデルを自動化しようとしています。

新しいフィールドを計算するための適切なロジックを理解するのに苦労しています。現在書かれているように、for ループで元のフィールドを取得しますが、最後の元のフィールド値のみが使用され、最後の新しいフィールドのみが入力されます。次のように、最初の元のフィールドを取得して、対応する新しいフィールドに入れるループが必要です。

origFields = ('NLCDV1', 'NLCDV2'...) and addedFields = ('KM2_LC1', 'KM2_LC2'...) の場合、addField の計算は適切な値で終了します: 'KM2_LC1' = convert (ここで convert = !NLCDV1! * cell) 'KM2_LC2' = convert (convert = !NLCDV2! * cell) など、存在する可能性のあるすべての値について。

#User inputs the desired final units, loop through to find the desired units and calculates the new fields.
unit = arcpy.GetParameterAsText(7) #Must be: SqMeter, SqKm, Acres, Hectares, SqMi, or SqFt.

#User must know original units of raster, must be in Meters or Foot_US!!!
for field in origFields:

  if rastunit == "Meter":
    #To make square meters final area unit.
    if unit == "SqMeter":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

    #To convert square meters into Square Kilometers.
    elif unit == "SqKm":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqkm, "PYTHON_9.3")

    #To convert square meters into Acres.
    elif unit == "Acres":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmac, "PYTHON_9.3")

    #To convert square meters into Hectares.
    elif unit == "Hectares":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmhec, "PYTHON_9.3")

    #To convert square meters into Square Miles.
    elif unit == "SqMi":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqmi, "PYTHON_9.3")

    #To convert square meters into Square Feet.
    elif unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convertsqmsqft, "PYTHON_9.3")
    else:
      print arcpy.AddWarning("Ineligible unit provided.")


  elif rastunit == "Foot_US":
    #To make square feet final area unit.
    if unit == "SqFt":
      arcpy.CalculateField_management(inputPoly, addField, convert, "PYTHON_9.3")

  else:
    print "This raster has the following units:" +rastunit+ ". If not in Foot_US or Meters, please reproject the raster."

対応する元のフィールドを新しく追加されたフィールドと一致させる方法を理解する必要があります。zip(origField, addedField, calcs) のようなものを使用することを考えていました。これを行ったとき、次の出力が得られました。

(u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0')
(u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0')
(u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0')
(u'NLCDV4', 'KM2_LC4', '!NLCDV4! * 900.0')
(u'NLCDV5', 'KM2_LC5', '!NLCDV5! * 900.0')
(u'NLCDV7', 'KM2_LC7', '!NLCDV7! * 900.0')
(u'NLCDV8', 'KM2_LC8', '!NLCDV8! * 900.0')
(u'NLCDV9', 'KM2_LC9', '!NLCDV9! * 900.0')

これらの行はまさに私が必要としているものですが、そのような出力を使用してフィールドにデータを入力できるかどうかはわかりません。使用できるとしても、私は python が初めてで、zip も初めてなので、方法がわかりません。それらを使用する。

ロジックに関するヘルプは大歓迎です。クリーンアップ/再注文に関する提案は大歓迎です。私が言ったように、これがすべて完了したとき、私はかなり初心者です。ロジックができたら、準備完了です。ご覧いただきありがとうございます。コードが複雑すぎる場合は申し訳ありません (その場合でも驚くことではありません)。

4

1 に答える 1

1

私はあなたが何を求めているのか(まだ)よくわかりませんが、おそらくこれが役立つでしょう:

origFields = (u'NLCDV1', u'NLCDV2', u'NLCDV3')
addedFields = ('KM2_LC1', 'KM2_LC2', 'KM2_LC3')
calcs = ('!NLCDV1! * 900.0', '!NLCDV2! * 900.0', '!NLCDV3! * 900.0')

for orig, added, calc in zip(origFields, addedFields, calcs):
    print '{!r}, {!r}, {!r}'.format(orig, added, calc)

出力:

u'NLCDV1', 'KM2_LC1', '!NLCDV1! * 900.0'
u'NLCDV2', 'KM2_LC2', '!NLCDV2! * 900.0'
u'NLCDV3', 'KM2_LC3', '!NLCDV3! * 900.0'
于 2013-07-27T15:05:52.053 に答える