此代碼將用於附加柵格單元數的多邊形數據。例如,如果柵格是土地覆蓋,則每個土地覆蓋類型將會有一列,並且每個多邊形內的相應單元格數將會有一列。該輸出來自地理空間建模環境,因爲Tabulate Raster在我正在使用的大型shape文件上不斷崩潰。最終,我想要一個面積值,而不是一個細胞計數,這是下面的代碼將實現的。使用if語句的Python for-loop
因此,代碼將循環遍歷shapefile屬性,拉出原始計數字段,然後基於用戶輸入創建新字段(循環通過AddField使用用戶輸入名稱+柵格值獲取新字段名稱),然後循環通過原始字段的值並計算新字段的用戶指定區域值。本質上,我試圖自動化添加字段,計算字段模型,我通常在模型構建器中批處理。
我很難找出計算新字段的正確邏輯。正如現在所寫,它使用for循環獲取原始字段,但只有最後一個原始字段值最終被使用,並且只填充最後一個新字段。我需要循環將第一個原始字段放在相應的新字段中,例如:
如果origFields =('NLCDV1','NLCDV2'...) 和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,所以我不知道如何使用它們。
任何與邏輯的幫助將不勝感激,並歡迎任何關於清理/重新排序的建議。就像我說的那樣,當這一切都說完成時,我是新手。一旦我有了邏輯,我會很開心!感謝您的關注,如果我的代碼過於複雜(如果是這種情況,請不要感到驚訝)。
請簡化代碼和問題。此外,你的代碼縮進看起來很亂。 – martineau
我刪除了大部分代碼,只留下了我被卡住的for循環。希望這是令人愉快的。當我在PythonWin中調試它並且運行我的整個腳本時,縮進運行正常,以進行澄清。它讀取光柵單元,選擇適當的if語句,然後選擇與用戶的單元輸入相匹配的if語句。 – user2547367