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

相关文章

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键