电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

GDAL 矢量屬性數據修改方式(python)

瀏覽:27日期:2022-08-02 17:48:46

Case:需要給一個現有的shp數據創建一個字段,并將屬性表中原有的一個文本類型的屬性轉換為整型后填入新創建的字段。

Problem:新字段創建成功,但是賦值操作無效,即無法成功給字段寫入值。

solution:對字段進行賦值后需要,重新寫入Feature,否則賦值無效,即layer0.SetFeature(feature)。

特別注意:在對數據進行讀寫操作,一定要以讀寫的方式打開,即Open(filePath,1),該方法的原型為Open(pszName,int bUpdate = false),并且具有返回值,參數說明如下:

名稱 說明 pszName 需要打開文件或數據源的路徑 bUpdate 是否需要更新數據集,默認為只讀,如果需要對數據進行讀寫操作,需要給此參數賦值1 返回值 返回數據集的指針,如果為NULL,則表明打開數據集失敗

以下將給出創建字段和獲取字段值、子段賦值的實例。

1.為矢量數據創建字段

# 添加字段 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('字段創建成功:',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()

補充知識:Python批量修改shapefile屬性表字段名(arcpy增刪字段)

嘗試了3種方法,時間緊迫屢敗屢戰,最后終于成功。

方法1和2是失敗記錄,希望有類似經歷成功的同學分享下經驗。

方法3是成功記錄,修改 = 新增 + 計算 +刪除相關字段,因為沒有刪除改名前字段需求,故刪除部分沒有另做。

方法1 —— 【將shapefile的dbf文件按csv文件讀寫】

——失敗,dbf中有空值及編碼問題

不同文件間通過改后綴簡單粗暴改寫,操作方法存在風險

過于依賴熟悉的領域,由于時間緊迫沒有試用dbf第三方庫 GDAL 矢量屬性數據修改方式(python)

#-*- coding: utf-8 -*- import osimport shutilimport csv #批量修改shp中dbf文件中的字段名#LANE_WIDTH改為LANEWIDTHL#LANE_WID_1改為LANEWIDTHR#ORIGIN_LIN改為ORG_LINKID roadDir = r'D:20Q100DATAModifyTitleROAD_TEST'modifyRoadDir = r'D:20Q100DATAModifyTitleModifiedLink'csvDir = r'D:20Q100DATAModifyTitleROAD_CSV'fileList = os.listdir(roadDir) num = 0for 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數據為csv文件,讀存內容部分 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——直接使用修改字段名函數——失敗,arcpy模塊沒有AlterField_management方法

——失敗,但發現直接探尋官方方法還是比網搜野路子要節約時間

GDAL 矢量屬性數據修改方式(python)

使用Arcgis10.2 - Advanced浮動版,符合許可信息但Arcpy調用函數失敗,存疑。附官網AlterField函數用法介紹:

https://pro.arcgis.com/zh-cn/pro-app/tool-reference/data-management/alter-field-properties.htm

#-*- coding: utf-8 -*- import osimport arcpy #批量修改shp中dbf文件中的字段名#LANE_WIDTH改為LANEWIDTHL#LANE_WID_1改為LANEWIDTHR#ORIGIN_LIN改為ORG_LINKID roadDir = r'D:20Q100DATAModifyTitleROAD_TEST'fileList = os.listdir(roadDir) num = 0for file in fileList: #截取城市名 city = file.split('_')[0] print('正在修改{}的shp字段......'.format(city)) #修改前后字段名對照字典 modifyDic = {'LANE_WIDTH':'LANEWIDTHL','LANE_WID_1':'LANEWIDTHR','ORIGIN_LIN':'ORG_LINKID'} #讀取shp數據 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——添加改名后新字段(字段屬性與前保持一致)、計算改名后字段值 = 改名前字段值,成功!

#-*- coding: utf-8 -*- import osimport arcpy #批量修改shp屬性表中的字段名#LANE_WIDTH改為LANEWIDTHL#LANE_WID_1改為LANEWIDTHR#ORIGIN_LIN改為ORG_LINKID roadDir = r'D:20Q100DATAModifyTitleROAD_TEST'fileList = os.listdir(roadDir) num = 0for file in fileList: city = file.split('_')[0] #截取城市名 print('正在添加和計算{}的shp正確字段......'.format(city)) #修改前后字段名對照屬性字典 modifyDic = {'LANE_WIDTH':['LANEWIDTHL','1'],#錯誤字段名:[正確字段名,長度] '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: 計算字段字段 arcpy.CalculateField_management(shpFile, correctfieldName, '['+wrongfieldName+']', 'VB', '') ## # Process: 添加字段——LANEWIDTHL## arcpy.AddField_management(shpFile, 'LANEWIDTHL', 'TEXT', '', '', '1')## # Process: 計算字段字段——LANEWIDTHL## arcpy.CalculateField_management(shpFile, 'LANEWIDTHL', '['++]', 'VB', '')#### # Process: 添加字段——LANEWIDTHR## arcpy.AddField_management(shpFile, 'LANEWIDTHR', 'TEXT', '', '', '1')## # Process: 計算字段字段——LANEWIDTHR## arcpy.CalculateField_management(shpFile, 'LANEWIDTHR', '[LANE_WID_1]', 'VB', '')#### # Process: 添加字段——ORG_LINKID## arcpy.AddField_management(shpFile, 'ORG_LINKID', 'TEXT', '', '', '10')## # Process: 計算字段字段——ORG_LINKID## arcpy.CalculateField_management(shpFile, 'ORG_LINKID', '[ORIGIN_LIN]', 'VB', '')#### # Process: 刪除字段## #arcpy.DeleteField_management(in_table, 'LANE_WIDTH') print('{}修改完成!請確認!'.format(city)) num += 1 print('{}城市全部完成!'.format(num))

以上這篇GDAL 矢量屬性數據修改方式(python)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 道康宁消泡剂-瓦克-大川进口消泡剂供应商 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 膜结构车棚|上海膜结构车棚|上海车棚厂家|上海膜结构公司 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 湖南教师资格网-湖南教师资格证考试网 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 中医治疗皮肤病_潍坊银康医院「山东」重症皮肤病救治平台 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 |