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

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))

以上这篇GDAL 矢量属性数据修改方式(python)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python+gdal+遥感图像拼接(mosaic)的实例

    作为摄影测量与遥感的从业者,笔者最近开始深入研究gdal,为工作打基础!个人觉得gdal也是没有什么技术含量,调用别人的api.但是想想这也是算法应用的一个技能,多学无害! 关于遥感图像的镶嵌,主要分为6大步骤: step1: 1)对于每一幅图像,计算其行与列: 2)获取左上角X,Y 3)获取像素宽和像素高 4)计算max X 和 min Y,切记像素高是负值 maxX1 = minX1 + (cols1 * pixelWidth) minY1 = maxY1 + (rows1 * pixelH

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

    Case:需要给一个现有的shp数据创建一个字段,并将属性表中原有的一个文本类型的属性转换为整型后填入新创建的字段. Problem:新字段创建成功,但是赋值操作无效,即无法成功给字段写入值. solution:对字段进行赋值后需要,重新写入Feature,否则赋值无效,即layer0.SetFeature(feature). 特别注意:在对数据进行读写操作,一定要以读写的方式打开,即Open(filePath,1),该方法的原型为Open(pszName,int bUpdate = false

  • MySql忘记密码修改方式适应5.7以上版本

    1.先停止mysqld.exe的进程 2.打开cmd进入到你mysql的bin目录下输入此命令: mysqld --skip-grant-tables 输入完成后这个cmd窗口就不能用了 另外在打开一个  如图: 3.同样进入到mysql的bin目录下直接输入mysql然后回车   现在是跳过密码验证链接到了数据库如图: 4.查看库 这个mysql这个里面的user表就放我们登陆的用户名和密码的 感兴趣可以自己查看一下 5.这里就要特别注意了在5.7以上的版本中user表里面没有password

  • vue两个组件间值的传递或修改方式

    1.可以用公共的父组件来实现: 2.可以在store.js里面在设置公共变量: 3.也可以用本地存储localStorage.setItem()和localStorage.getItem(),通过修改本地存储的值和获取修改后的值来实现: 4.就是父子组件间的值的传递与修改props,这里需要注意的是子组件里面不      能直接修改props里面接受的值,需要定义一个中间变量来接受props里的值并修改,通过$emit即this.$emit('checkDisplay',this.display

  • R语言可视化存储矢量图实现方式

    目录 1. R 中自带的默认绘图 1) PDF 格式 2) EPS 格式 2. ggplot 绘图 1) PDF 格式 2) EPS 格式 之前写的博客中有提及过如何在 R 语言中绘制矢量图,然后用于论文引用.但没有专门开一篇博客来进行说明比较,这里重新开一篇博客来进行说明. 通常保存为矢量图可能大多数时候是为了论文中的引用,所以格式一般为 EPS, PDF 这两种格式,这里也主要针对这两种格式进行说明. 1. R 中自带的默认绘图 通常我们使用 plot(), lines(), points(

  • python 使用GDAL实现栅格tif转矢量shp的方式小结

    前言 目前有一张tif格式的栅格影像,需要在web地图上进行展示,使用动态切片WMS的方式,渲染速度比较慢,而且大的时候会出现模糊的问题.并且后面需要做多期影像的切换,渲染与加载效率也值得关注. 计划是使用栅格转矢量的方式,将栅格数据转为矢量shp文件,然后进行矢量切片,使用Mapbox进行前端动态渲染.在网上查询了很多资料,有人说使用d3-contour在node.js中生成或者使用rasterio在python中进行转换,整体过程都比较麻烦,很不易实现.最终选定了使用GDAL进行栅格转矢量的

  • python mysql自增字段AUTO_INCREMENT值的修改方式

    在之前得文章中我们说过,如果使用delete对数据库中得表进行删除,那么只是把记录删除掉,并且id的值还会保持上次的状态. 即删除之前如果有四条数据,删除之后,再添加新的数据,id怎会从5开始. 但是我们显示想让id从2开始,应该怎么做呢? 这个时候我们就要学习去修改数据表的一些属性值了,而这个属性值就是AUTO_INCREMENT. 首先我们要知道怎么查看这个属性的值. 例如我建了一张表: create table t4(id int auto_increment primary key, n

  • SpringCloud gateway request的body验证或修改方式

    SpringCloud gateway request的body验证或修改 后续版本新增了以下过滤器 org.springframework.cloud.gateway.filter.headers.RemoveHopByHopHeadersFilter 默认会把以下头部移除(暂不了解这做法的目的) - connection - keep-alive - te - transfer-encoding - trailer - proxy-authorization - proxy-authenti

  • pycharm全局修改方式

    目录 pycharm全局修改 方法1 方法2 pycharm搜索和替换 搜索方式 实战演练 pycharm全局修改 pycharm 全局改函数 方法1 ctrl shift r全局替换 方法2 点击函数,右键 Refactor Change Signature,快捷键 ctrl f6 就可以修改函数名了,关联可以自动修改. Refactor  Rename 是修改变量名. pycharm搜索和替换 搜索方式 1.全局查询 路径:Edit->Find->Find in Path 快捷键:Ctrl

  • vue3.0安装Element ui及矢量图使用方式

    在此只关注v3的安装及使用,如果想了解v2可移步到其官网:https://element.eleme.io/#/zh-CN/component/installation v3官网:https://element-plus.org/zh-CN/guide/installation.html 使用element ui时vue2和vue3的区别 安装命令 main.js中引入文件有所不同 使用icon时v2不需要安装,v3需安装 v2和v3在vue文件中使用icon时编写方式有所不同 icon在v2中

  • vue对插件(iview,elementui,treeselect)样式的局部修改方式

    目录 (iview,elementui,treeselect)样式的局部修改 学习描述 具体方法 vue+iview 样式穿透-修改第三方插件样式 修改第三方插件样式 (iview,elementui,treeselect)样式的局部修改 学习描述 在vue的使用过程中,我们知道插件的使用可以大大的提高我们的开发效率,这写插件都是经过很多人的验证和修改的,要比我们自己写方便的很多. 但是在开发的过程中,有些插件一些在特定的页面我们可能不要原来的样式,需要进行修改.然而我们在使用vue的过程中都会

随机推荐