GDAL 矢量属性数据修改方式(python)


Posted in Python onMarch 10, 2020

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 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数据为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 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数据
 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 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("正在添加和计算{}的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 相关文章推荐
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
代码分析Python地图坐标转换
Feb 08 Python
基于python实现名片管理系统
Nov 30 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
Python中断多重循环的思路总结
Oct 04 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
python时间日期操作方法实例小结
Feb 06 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
python中mongodb包操作数据库
Apr 19 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 #Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 #Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 #Python
Django 404、500页面全局配置知识点详解
Mar 10 #Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 #Python
Python实现获取当前目录下文件名代码详解
Mar 10 #Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 #Python
You might like
PHP/HTML混写的四种方式总结
2017/02/27 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
市场部规章制度
2014/01/24 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
拉歌口号大全
2014/06/13 职场文书
个人收入证明模板
2014/09/18 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
十七岁的单车观后感
2015/06/12 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android