shapefile增加属性并计算(ArcMap/Arcpy)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章