GDAL 矢量属性数据修改方式(python)
作者:Martian.Alien 发布时间:2021-01-30 20:53:28
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第三方库
#-*- 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方法
——失败,但发现直接探寻官方方法还是比网搜野路子要节约时间
使用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))
来源:https://blog.csdn.net/feixiegis/article/details/80319568
猜你喜欢
- 以下列出了两种数据库的方法:ASP+Access20001.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID)2.
- 本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下项目地址:https://github.c
- 下面继续为大家带来XHTML与HTML兼容的16条指引!1.避免将页面声明为XML类型,页面使用UTF-8或者UTF-16字符集。2.在空元
- 线性回归是一种常见的机器学习算法,也是人工智能中常用的算法。它是一种用于预测数值型输出变量与一个或多个自变量之间线性关系的方法。例如,你可以
- 最近发现各大类库都能利用div.innerHTML=HTML片断来生成节点元素,再把它们插入到目标元素的各个位置上。这东西实际上就是inse
- 实现效果将位于/img目录下的1000张.png图片,转换成.webp格式,并存放于img_webp文件夹内。源图片目录目标图片目录关于批量
- 一个不错的js星级评分代码,可以评多个指标。相关文章推荐:用css制作星级投票评分功能 效果图:<script language=&q
- 1概述 SQL语言的本质就是一串伪代码,表达的是做什么,而不是怎么做的意思。如其它语言一样,SQL语句需要编译之后才能运行,所以每一条SQL
- 前言在几周前,我开始工作于一个证券投资组合网站。虽然我只能使用 React 完成整个网站,但我决定使用 Go 来创建一个可以处理某些任务(例
- 以前我也写过一个注册表类,不过那一个不能进行多个类的注册,下面用数组对类进行了存储。 <?php //基础类 class webSit
- 我插入Mysql5的中文一直是乱码。但是直接使用mysqlAdmin,EMS等工具插入DB就不是乱码。而且我还可以使用程序正常地读出来。原因
- 本文实例为大家分享了python统计序列中元素的具体代码,供大家参考,具体内容如下问题1: &
- asp ajax json教程首先用ACCESS建json.mdb的库,然后建一个表t_jsontable,字段如下:jt_id,jt_na
- 一、前言在Python中,除了可以自定义模块外,还可以引用其他模块,主要包括使用标准库和第三方模块。下面分别进行介绍。二、导入和使用标准模块
- 网页中使用flash可以增强页面的动态交互效果,特别是用flash来制作广告,效果更好。经常使用flash的人,可能就碰到了flash会遮住
- 学习目的: 掌握文本框的用法 初次接触try…catch…语法 今天内容很轻松,用一个例子,输入年月日,判断输入是否正确 图片如下: 用个
- 本文实例为大家分享了Python/C++实现字符串逆序的具体代码,供大家参考,具体内容如下题目描述:将字符串逆序输出Python实现一:借助
- 在web运行中很重要的一个功能就是加载静态文件,在django中可能已经给我们设置好了,我们只要直接把模板文件放在templates就好了,
- django中,很多时候我们都需要有一个地方来进行更加详细的权限控制,例如说哪些用户可以访问哪些页面,检查登录状态等,这里的话就涉及到了中间
- 下面的asp函数实现了对站点的所有缓存Application的清理,释放!Sub RemoveAllCache() D