GDAL 矢量屬性數(shù)據(jù)修改方式(python)
Case:需要給一個(gè)現(xiàn)有的shp數(shù)據(jù)創(chuàng)建一個(gè)字段,并將屬性表中原有的一個(gè)文本類型的屬性轉(zhuǎn)換為整型后填入新創(chuàng)建的字段。
Problem:新字段創(chuàng)建成功,但是賦值操作無效,即無法成功給字段寫入值。
solution:對字段進(jìn)行賦值后需要,重新寫入Feature,否則賦值無效,即layer0.SetFeature(feature)。
特別注意:在對數(shù)據(jù)進(jìn)行讀寫操作,一定要以讀寫的方式打開,即Open(filePath,1),該方法的原型為Open(pszName,int bUpdate = false),并且具有返回值,參數(shù)說明如下:
名稱 | 說明 |
pszName | 需要打開文件或數(shù)據(jù)源的路徑 |
bUpdate | 是否需要更新數(shù)據(jù)集,默認(rèn)為只讀,如果需要對數(shù)據(jù)進(jìn)行讀寫操作,需要給此參數(shù)賦值1 |
返回值 | 返回?cái)?shù)據(jù)集的指針,如果為NULL,則表明打開數(shù)據(jù)集失敗 |
以下將給出創(chuàng)建字段和獲取字段值、子段賦值的實(shí)例。
1.為矢量數(shù)據(jù)創(chuàng)建字段
# 添加字段 defn = layer.GetLayerDefn() fieldIndex=defn.GetFieldIndex('SSSS') if fieldIndex<0: # 添加字段 fieldDefn = ogr.FieldDefn('SSSS', ogr.OFTInteger) fieldDefn.SetPrecision(9) layer0.CreateField(fieldDefn,1); fieldIndex2 = defn.GetFieldIndex('SSSS') if fieldIndex2>0: print("字段創(chuàng)建成功:",fieldIndex)
2.獲取字段值及字段賦值
feature = layer.GetNextFeature() indexA = defn.GetFieldIndex('code') indexB = defn.GetFieldIndex('SSSS') oField = defn.GetFieldDefn(indexB) fieldName = oField.GetNameRef() while feature is not None: valueA= feature.GetFieldAsInteger(indexA) if valueA is None: feature.SetFieldNull(indexB) continue feature.SetField2(fieldName, valueA) layer0.SetFeature(feature) feature = layer0.GetNextFeature() #feature.Destroy() ds.Destroy()
補(bǔ)充知識:Python批量修改shapefile屬性表字段名(arcpy增刪字段)
嘗試了3種方法,時(shí)間緊迫屢敗屢戰(zhàn),最后終于成功。
方法1和2是失敗記錄,希望有類似經(jīng)歷成功的同學(xué)分享下經(jīng)驗(yàn)。
方法3是成功記錄,修改 = 新增 + 計(jì)算 +刪除相關(guān)字段,因?yàn)闆]有刪除改名前字段需求,故刪除部分沒有另做。
方法1 —— 【將shapefile的dbf文件按csv文件讀寫】
——失敗,dbf中有空值及編碼問題
不同文件間通過改后綴簡單粗暴改寫,操作方法存在風(fēng)險(xiǎn)
過于依賴熟悉的領(lǐng)域,由于時(shí)間緊迫沒有試用dbf第三方庫
#-*- coding: utf-8 -*- import os import shutil import csv #批量修改shp中dbf文件中的字段名 #LANE_WIDTH改為LANEWIDTHL #LANE_WID_1改為LANEWIDTHR #ORIGIN_LIN改為ORG_LINKID roadDir = r"D:\20Q1\00DATA\ModifyTitle\ROAD_TEST\\" modifyRoadDir = r"D:\20Q1\00DATA\ModifyTitle\ModifiedLink\\" csvDir = r"D:\20Q1\00DATA\ModifyTitle\ROAD_CSV\\" fileList = os.listdir(roadDir) num = 0 for file in fileList: #新建修改后的城市文件夾 city = file.split("_")[0] os.mkdir(csvDir + city) os.mkdir(modifyRoadDir + city) shutil.copy(roadDir + file + "/RD_LINK.dbf", csvDir + city + "/RD_LINK.csv") print("正在生成{}新dbf文件......".format(city)) dbfData = [] #讀取dbf數(shù)據(jù)為csv文件,讀存內(nèi)容部分 csvFile = open(csvDir + city + "/RD_LINK.csv",encoding='gbk',errors='ignore') csvReader = csv.reader(csvFile) for row in csvReader: titleLine = [] if csvReader.line_num == 1: titleLine.append(row) continue #跳過第1行——列名 dbfData.append(row) #生成正確的字段名行 newTitleLine = [] modifyDic = {"LANE_WIDTH":"LANEWIDTHL","LANE_WID_1":"LANEWIDTHR","ORIGIN_LIN":"ORG_LINKID"} for fieldName in titleLine: if fieldName in modifyDic: newTitleLine.append(modifyDic[fieldName]) else: newTitleLine.append(fieldName) #寫入新dbf文件 newDBF = open(modifyRoadDir + city + "/RD_LINK.dbf",'w') csvWriter = csv.writer(newDBF) csvWriter.writerow(newTitleLine) for row in dbfData: csvWriter.writerow(row) newDBF.close() print("{}新dbf文件已生成!".format(city)) print("{}城市全部完成".format(num))
方法2——直接使用修改字段名函數(shù)——失敗,arcpy模塊沒有AlterField_management方法
——失敗,但發(fā)現(xiàn)直接探尋官方方法還是比網(wǎng)搜野路子要節(jié)約時(shí)間
使用Arcgis10.2 - Advanced浮動(dòng)版,符合許可信息但Arcpy調(diào)用函數(shù)失敗,存疑。附官網(wǎng)AlterField函數(shù)用法介紹:
https://pro.arcgis.com/zh-cn/pro-app/tool-reference/data-management/alter-field-properties.htm
#-*- coding: utf-8 -*- import os import arcpy #批量修改shp中dbf文件中的字段名 #LANE_WIDTH改為LANEWIDTHL #LANE_WID_1改為LANEWIDTHR #ORIGIN_LIN改為ORG_LINKID roadDir = r"D:\20Q1\00DATA\ModifyTitle\ROAD_TEST\\" fileList = os.listdir(roadDir) num = 0 for file in fileList: #截取城市名 city = file.split("_")[0] print("正在修改{}的shp字段......".format(city)) #修改前后字段名對照字典 modifyDic = {"LANE_WIDTH":"LANEWIDTHL","LANE_WID_1":"LANEWIDTHR","ORIGIN_LIN":"ORG_LINKID"} #讀取shp數(shù)據(jù) dbfFile = roadDir + file + "/RD_LINK.shp" fieldList = arcpy.ListFields(dbfFile) for field in fieldList: #遍歷字段名 if field.name.upper() in modifyDic: #找到待修改字段名 arcpy.AlterField_management(dbfFile, field = field.name, new_field_name = modifyDic[field.name]) print("{}字段修改成功!".format(city)) print("{}城市全部完成".format(num))
方法3——添加改名后新字段(字段屬性與前保持一致)、計(jì)算改名后字段值 = 改名前字段值,成功!
#-*- coding: utf-8 -*- import os import arcpy #批量修改shp屬性表中的字段名 #LANE_WIDTH改為LANEWIDTHL #LANE_WID_1改為LANEWIDTHR #ORIGIN_LIN改為ORG_LINKID roadDir = r"D:\20Q1\00DATA\ModifyTitle\ROAD_TEST\\" fileList = os.listdir(roadDir) num = 0 for file in fileList: city = file.split("_")[0] #截取城市名 print("正在添加和計(jì)算{}的shp正確字段......".format(city)) #修改前后字段名對照屬性字典 modifyDic = {"LANE_WIDTH":["LANEWIDTHL","1"],#錯(cuò)誤字段名:[正確字段名,長度] "LANE_WID_1":["LANEWIDTHR","1"], "ORIGIN_LIN":["ORG_LINKID","10"]} #讀取shp文件 shpFile = roadDir + file + "/RD_LINK.shp" for wrongfieldName in modifyDic: correctfieldName = modifyDic[wrongfieldName][0] field_length = modifyDic[wrongfieldName][1] # Process: 添加字段 arcpy.AddField_management(shpFile, correctfieldName, "TEXT", "", "", field_length) # Process: 計(jì)算字段字段 arcpy.CalculateField_management(shpFile, correctfieldName, "["+wrongfieldName+"]", "VB", "") ## # Process: 添加字段——LANEWIDTHL ## arcpy.AddField_management(shpFile, "LANEWIDTHL", "TEXT", "", "", "1") ## # Process: 計(jì)算字段字段——LANEWIDTHL ## arcpy.CalculateField_management(shpFile, "LANEWIDTHL", "["++]", "VB", "") ## ## # Process: 添加字段——LANEWIDTHR ## arcpy.AddField_management(shpFile, "LANEWIDTHR", "TEXT", "", "", "1") ## # Process: 計(jì)算字段字段——LANEWIDTHR ## arcpy.CalculateField_management(shpFile, "LANEWIDTHR", "[LANE_WID_1]", "VB", "") ## ## # Process: 添加字段——ORG_LINKID ## arcpy.AddField_management(shpFile, "ORG_LINKID", "TEXT", "", "", "10") ## # Process: 計(jì)算字段字段——ORG_LINKID ## arcpy.CalculateField_management(shpFile, "ORG_LINKID", "[ORIGIN_LIN]", "VB", "") ## ## # Process: 刪除字段 ## #arcpy.DeleteField_management(in_table, "LANE_WIDTH") print("{}修改完成!請確認(rèn)!".format(city)) num += 1 print("{}城市全部完成!".format(num))
以上這篇GDAL 矢量屬性數(shù)據(jù)修改方式(python)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python BautifulSoup 節(jié)點(diǎn)信息
這篇文章主要介紹了Python BautifulSoup 節(jié)點(diǎn)信息,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Python 爬蟲之超鏈接 url中含有中文出錯(cuò)及解決辦法
這篇文章主要介紹了Python 爬蟲之超鏈接 url中含有中文出錯(cuò)及解決辦法的相關(guān)資料,出現(xiàn)UnicodeEncodeError: 'ascii' codec can't encode characters,的錯(cuò)誤解決辦法,需要的朋友可以參考下2017-08-08python unittest實(shí)現(xiàn)api自動(dòng)化測試
這篇文章主要為大家詳細(xì)介紹了python unittest實(shí)現(xiàn)api自動(dòng)化測試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10Pandas統(tǒng)計(jì)重復(fù)的列里面的值方法
今天小編就為大家分享一篇Pandas統(tǒng)計(jì)重復(fù)的列里面的值方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實(shí)現(xiàn)
本文主要介紹了Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02