最近在改文章的時候需要重新計算一個屬性,不是那種簡單的加減所以要使用到python
首先嚐試了直接在python裏面調用arcpy
其中的codeblock就是我要實現的給屬性賦值的函數,expression就是調用這個函數,然後輸入的值是原有的一些屬性字段,因爲是基於python,所以用!屬性名稱!。
更多詳見官網;https://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/data-management-toolbox/calculate-field.htm
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 12:08:31 2020
@author: ***
"""
#本程序用CIS生成一個MYI concentration屬性
#-*- coding: utf-8 -*-
import arcpy
import os
expression = "Reclass(!CT!,!CA!,!SA!,!CB!,!SB!,!CC!,!SC!)"
codeblock="""def Reclass(CT,CA,SA,CB,SB,CC,SC):
if CT==" ":
return -9
dic={'00':0,'01':0,'02':0,'10':10,'12':20,'13':30,'20':20,'23':30,'24':40,'30':30,'34':40,'35':50,'40':40,'45':50,'46':60,'50':50,'56':60,'57':70,'60':60,'67':70,'68':80,'70':70,'78':80,'79':90,'80':80,'81':100,'89':90,'90':90,'91':100,'92':100,' ':-9}
totalcon=dic.get(CT,-9)
MYIcon=0
if (totalcon==0):
return 0
elif (totalcon==-9):
return None
else:
if SA=='95' or SA=='96' or SA=='97':
if dic.get(CA,-9)==-9:
return totalcon
else:
MYIcon=dic.get(CA,0)
if SB=='95' or SB=='96' or SB=='97':
MYIcon=MYIcon+dic.get(CB,0)
if SC=='95' or SC=='96' or SC=='97':
MYIcon=MYIcon+dic.get(CC,0)
return MYIcon """
roadDir = r"H:\\IceClassification\\sentinel\\Strait\\validation\\CIS\\new\\cis_SGRDREA_20161121T1800Z_pl_a"
fileList = os.listdir(roadDir)
shpFile = roadDir + "\\cis_SGRDREA_20161121T1800Z_pl_a.shp"
fields = arcpy.ListFields(shpFile)
for f in fields:
print(f.name)
# Process: 添加字段
arcpy.AddField_management(shpFile, "MYIcon", "LONG",field_is_nullable="NULLABLE")
# Process: 計算字段字段
arcpy.CalculateField_management(shpFile, "MYIcon", expression, "PYTHON_9.3", codeblock)
但是點運行了一段時間後很慢,因此開始嘗試使用ArcMap直接操作(因此我不能保證以上代碼正確)
首先是增加屬性(記得需要停止編輯模式):打開屬性表後 選add field
然後是按你的需要填寫字段屬性和名稱
之後在生成好的字段表頭點右鍵有個計算器,點開後如圖,記得parser選擇python,然後下面打勾
上面那個方框就填函數即可,就是下面這樣
def Reclass(CT,CA,SA,CB,SB,CC,SC):
if CT==" ":
return -9
dic={'00':0,'01':0,'02':0,'10':10,'12':20,'13':30,'20':20,'23':30,'24':40,'30':30,'34':40,'35':50,'40':40,'45':50,'46':60,'50':50,'56':60,'57':70,'60':60,'67':70,'68':80,'70':70,'78':80,'79':90,'80':80,'81':100,'89':90,'90':90,'91':100,'92':100,' ':-9}
totalcon=dic.get(CT,-9)
MYIcon=0
if (totalcon==0):
return 0
elif (totalcon==-9):
return None
else:
if SA=='95' or SA=='96' or SA=='97':
if dic.get(CA,-9)==-9:
return totalcon
else:
MYIcon=dic.get(CA,0)
if SB=='95' or SB=='96' or SB=='97':
MYIcon=MYIcon+dic.get(CB,0)
if SC=='95' or SC=='96' or SC=='97':
MYIcon=MYIcon+dic.get(CC,0)
return MYIcon
下面那個框填寫expression的內容,我的如下
Reclass(!CT!,!CA!,!SA!,!CB!,!SB!,!CC!,!SC!)
然後點計算
OK了