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

相关文章

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al