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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Python实现的凯撒密码算法示例
Apr 12 Python
Python内置random模块生成随机数的方法
May 31 Python
pytorch中的自定义数据处理详解
Jan 06 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
哪些是python中web开发框架
Jun 17 Python
Python扫描端口的实现
Jan 25 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
Python函数中apply、map、applymap的区别
Nov 27 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
星际原理概述
2020/03/04 星际争霸
解决中英文字符串长度问题函数
2007/01/16 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python中内置的日志模块logging用法详解
2016/07/12 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
python selenium 弹出框处理的实现
2019/02/26 Python
使用python实现简单五子棋游戏
2019/06/18 Python
python实现飞船大战
2020/04/24 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
Aosom西班牙:家具在线商店
2020/06/11 全球购物
工业设计专业个人求职信范文
2013/12/28 职场文书
上班玩手机检讨书
2014/02/17 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python