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了

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