最近在改文章的时候需要重新计算一个属性,不是那种简单的加减所以要使用到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了