Arcpy基础入门-5、读取自定义格式xml

2024-01-27 05:18

本文主要是介绍Arcpy基础入门-5、读取自定义格式xml,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

arcpy作为一种脚本开发语言,其功能的目的是为用户提供强有力的可扩展性。

这一节通过示例,介绍比较下使用python和arcpy读取自定义格式的xml并构建要素的方法。

先简单描述下自定义的xml格式:

j


自定义了一种北京54坐标系的航迹数据,每一个航迹包括了属性和对应的几何点,由于通用的航迹格式GPS只支持经纬度坐标的读取,所以需要自己写脚本,对要素进行处理


将xml格式的数据转化为要素有两种方式:一种是较为常见的创建要素,赋属性的方式,

使用的是arcpy.insertcursor,这种方式和ArcEngine开发有点相似,代码如下:

#coding=utf-8
import arcpy, os, time
import xml.dom.minidom
import random
from arcpy import env
arcpy.env.overwriteOutput = True #inGPXFile = arcpy.GetParameterAsText(0)
inpath = 'F:\\gpx\\航迹-settingDB-20150605031316.gpx'
uipath = unicode(inpath , "utf8")#outputFC = arcpy.GetParameterAsText(1)
outputFC = r'F:\gpx\20150605031316.shp'
uoutputFC = unicode(outputFC , "utf8")# 打开xml文档
dom = xml.dom.minidom.parse(uipath)
#得到文档元素对象
root = dom.documentElementdef get_attrvalue(node, attrname):return node.getAttribute(attrname) if node else ''def get_nodevalue(node, index = 0):if node:if node.childNodes:return node.childNodes[index].nodeValue   else:return Nonedef get_xmlnode(node,name):return node.getElementsByTagName(name) if node else []trk_nodes = get_xmlnode(root,'trk')
#获得节点测试
print trk_nodes#创建shp
path = os.path.split(outputFC)[0]
name = os.path.split(outputFC)[1]
print path
print name
arcpy.CreateFeatureclass_management(path,name,"POLYLINE")fieldName1 = "name"
fieldAlias = "轨迹名称"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName1, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName2 = "time"
fieldAlias = "时间"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName2, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName3 = "length"
fieldPrecision = 9
fieldAlias = "长度"
arcpy.AddField_management(outputFC, fieldName3, "DOUBLE", fieldPrecision, "", "",fieldAlias, "NULLABLE")fieldName4 = "jiange"
fieldAlias = "间隔"
arcpy.AddField_management(outputFC, fieldName4, "LONG", "","","",fieldAlias, "NULLABLE")fieldName5 = "tpkname"
fieldAlias = "图幅名字"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName5, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName6 = "daino"
fieldAlias = "带号"
arcpy.AddField_management(outputFC, fieldName6, "LONG", "","","",fieldAlias, "NULLABLE")cur=arcpy.InsertCursor(outputFC)
for trk_node in trk_nodes:trk_node_time = get_xmlnode(trk_node,'time')trk_node_length = get_xmlnode(trk_node,'length')trk_node_jiange = get_xmlnode(trk_node,'jiange')trk_node_name = get_xmlnode(trk_node,'name')trk_node_daino = get_xmlnode(trk_node,'daino')trk_node_tpkname = get_xmlnode(trk_node,'tpkname')trk_time =get_nodevalue(trk_node_time[0]).encode('utf-8','ignore')trk_length =get_nodevalue(trk_node_length[0]).encode('utf-8','ignore')trk_jiange =get_nodevalue(trk_node_jiange[0]).encode('utf-8','ignore')trk_name =get_nodevalue(trk_node_name[0]).encode('utf-8','ignore')trk_daino =get_nodevalue(trk_node_daino[0]).encode('utf-8','ignore')trk_tpkname =get_nodevalue(trk_node_tpkname[0]).encode('utf-8','ignore')array = arcpy.Array()trkseg_node = get_xmlnode(trk_node,'trkseg')print trkseg_nodetrkpt_nodes = get_xmlnode(trkseg_node[0],'trkpt')print trkpt_nodesfor trkpt_node in trkpt_nodes:trkpt_node_x = get_xmlnode(trkpt_node,'X')trkpt_node_y = get_xmlnode(trkpt_node,'Y')trkpt_x =get_nodevalue(trkpt_node_x[0]).encode('utf-8','ignore')trkpt_y =get_nodevalue(trkpt_node_y[0]).encode('utf-8','ignore')x=float(trkpt_x)y=float(trkpt_y)pnt=arcpy.Point()pnt.X = trkpt_ypnt.Y = trkpt_xarray.add(pnt)print xprint ypolyline = arcpy.Polyline(array)array.removeAll()feat= cur.newRow()feat.shape = polylinefeat.setValue("shape",polyline)feat.setValue("time",trk_time)feat.setValue("length",float(trk_length))feat.setValue("jiange",int(trk_jiange))feat.setValue("name",trk_name)feat.setValue("daino",int(trk_daino))feat.setValue("tpkname",trk_tpkname)cur.insertRow(feat)del  feat
del cur
还有另外一种方式使用arcpy.da模块下面的插入游标,根据arcgis的帮助文档,这种方式速度会更快, 详情见这里,代码如下:

#coding=utf-8
import arcpy, os, time
import xml.dom.minidom
import random
from arcpy import env
arcpy.env.overwriteOutput = True inGPXFile = arcpy.GetParameterAsText(0)
#inpath = 'F:\\gpx\\航迹-settingDB-20150605031316.gpx'
#uipath = unicode(inpath , "utf8")outputFC = arcpy.GetParameterAsText(1)
#outputFC = r'F:\gpx\20150605031316.shp'
#uoutputFC = unicode(outputFC , "utf8")# 打开xml文档
dom = xml.dom.minidom.parse(inGPXFile)
#得到文档元素对象
root = dom.documentElementdef get_attrvalue(node, attrname):return node.getAttribute(attrname) if node else ''def get_nodevalue(node, index = 0):if node:if node.childNodes:return node.childNodes[index].nodeValue   else:return Nonedef get_xmlnode(node,name):return node.getElementsByTagName(name) if node else []trk_nodes = get_xmlnode(root,'trk')
#获得节点测试
print trk_nodes#创建shp
path = os.path.split(outputFC)[0]
name = os.path.split(outputFC)[1]
print path
print name
arcpy.CreateFeatureclass_management(path,name,"POLYLINE")fieldName1 = "name"
fieldAlias = "轨迹名称"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName1, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName2 = "time"
fieldAlias = "时间"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName2, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName3 = "length"
fieldPrecision = 9
fieldAlias = "长度"
arcpy.AddField_management(outputFC, fieldName3, "DOUBLE", fieldPrecision, "", "",fieldAlias, "NULLABLE")fieldName4 = "jiange"
fieldAlias = "间隔"
arcpy.AddField_management(outputFC, fieldName4, "LONG", "","","",fieldAlias, "NULLABLE")fieldName5 = "tpkname"
fieldAlias = "图幅名字"
fieldLength = 50
arcpy.AddField_management(outputFC, fieldName5, "TEXT", "","",fieldLength,fieldAlias, "NULLABLE")fieldName6 = "daino"
fieldAlias = "带号"
arcpy.AddField_management(outputFC, fieldName6, "LONG", "","","",fieldAlias, "NULLABLE")
cur = arcpy.da.InsertCursor(outputFC, ("time","length","jiange","name","daino","tpkname","SHAPE@"))
for trk_node in trk_nodes:trk_node_time = get_xmlnode(trk_node,'time')trk_node_length = get_xmlnode(trk_node,'length')trk_node_jiange = get_xmlnode(trk_node,'jiange')trk_node_name = get_xmlnode(trk_node,'name')trk_node_daino = get_xmlnode(trk_node,'daino')trk_node_tpkname = get_xmlnode(trk_node,'tpkname')trk_time =get_nodevalue(trk_node_time[0]).encode('utf-8','ignore')trk_length =get_nodevalue(trk_node_length[0]).encode('utf-8','ignore')trk_jiange =get_nodevalue(trk_node_jiange[0]).encode('utf-8','ignore')trk_name =get_nodevalue(trk_node_name[0]).encode('utf-8','ignore')trk_daino =get_nodevalue(trk_node_daino[0]).encode('utf-8','ignore')trk_tpkname =get_nodevalue(trk_node_tpkname[0]).encode('utf-8','ignore')array = arcpy.Array()trkseg_node = get_xmlnode(trk_node,'trkseg')print trkseg_nodetrkpt_nodes = get_xmlnode(trkseg_node[0],'trkpt')print trkpt_nodesfor trkpt_node in trkpt_nodes:trkpt_node_x = get_xmlnode(trkpt_node,'X')trkpt_node_y = get_xmlnode(trkpt_node,'Y')trkpt_x =get_nodevalue(trkpt_node_x[0]).encode('utf-8','ignore')trkpt_y =get_nodevalue(trkpt_node_y[0]).encode('utf-8','ignore')x=float(trkpt_x)y=float(trkpt_y)pnt=arcpy.Point()pnt.X = trkpt_ypnt.Y = trkpt_xarray.add(pnt)print xprint ypolyline = arcpy.Polyline(array)row =[trk_time,float(trk_length),int(trk_jiange),trk_name,int(trk_daino),trk_tpkname,polyline] cur.insertRow(row)
至于如何根据脚本创建模型工具,可以去看下基础入门之3和4



这篇关于Arcpy基础入门-5、读取自定义格式xml的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649161

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成