广告位联系
返回顶部
分享到

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

python 来源:互联网搜集 作者:秩名 发布时间:2020-03-10 21:10:55 人浏览
摘要

Case:需要给一个现有的shp数据创建一个字段,并将属性表中原有的一个文本类型的属性转换为整型后填入新创建的字段。 Problem:新字段创建成功,但是赋值操作无效,即无法成功给字段写入值。 solution:对字段进行赋值后需要,重新写入Feature,否则赋值无效

Case:需要给一个现有的shp数据创建一个字段,并将属性表中原有的一个文本类型的属性转换为整型后填入新创建的字段。

Problem:新字段创建成功,但是赋值操作无效,即无法成功给字段写入值。

solution:对字段进行赋值后需要,重新写入Feature,否则赋值无效,即layer0.SetFeature(feature)。

特别注意:在对数据进行读写操作,一定要以读写的方式打开,即Open(filePath,1),该方法的原型为Open(pszName,int bUpdate = false),并且具有返回值,参数说明如下:

名称 说明
pszName 需要打开文件或数据源的路径
bUpdate 是否需要更新数据集,默认为只读,如果需要对数据进行读写操作,需要给此参数赋值1
返回值 返回数据集的指针,如果为NULL,则表明打开数据集失败

以下将给出创建字段和获取字段值、子段赋值的实例。

1.为矢量数据创建字段

?
1
2
3
4
5
6
7
8
9
10
11
# 添加字段
 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.获取字段值及字段赋值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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第三方库

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#-*- 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#-*- 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——添加改名后新字段(字段属性与前保持一致)、计算改名后字段值 = 改名前字段值,成功!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#-*- 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)) 


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://blog.csdn.net/feixiegis/article/details/80319568
    Tag :
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计