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.documentElement

def 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 None

def 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_node
trkpt_nodes = get_xmlnode(trkseg_node[0],'trkpt')
print trkpt_nodes
for 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_y
pnt.Y = trkpt_x
array.add(pnt)
print x
print y
polyline = arcpy.Polyline(array)
array.removeAll()
feat= cur.newRow()
feat.shape = polyline
feat.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.documentElement

def 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 None

def 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_node
trkpt_nodes = get_xmlnode(trkseg_node[0],'trkpt')
print trkpt_nodes
for 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_y
pnt.Y = trkpt_x
array.add(pnt)
print x
print y
polyline = 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



更多相关文章

  1. python通过get方式,post方式发送http请求和接收http响应-urllib
  2. 如何用所有可能的方式将一个列表分割成对?
  3. 任何人都可以提供更多的pythonic方式来生成morris序列吗?
  4. python subprocess模块 监控子进程的2种方式 忙等待和立即返回同
  5. python 中 ? : 三元表达式 的实现方式
  6. 如何在Linux中以编程方式获取给定相对路径的绝对路径?
  7. Linux ssh(以及其他访问主机方式)登录变慢解决方法
  8. 手把手教你在ubuntu下创建桌面快捷方式
  9. PB中动态SQL处理BLOB的方式

随机推荐

  1. Android入门教程 (一) Android简介和androi
  2. 4.0.x Launcher UI
  3. [原]如何在Android用FFmpeg+SDL2.0解码图
  4. android:ellipsize属性 textview
  5. Android异步消息处理机制
  6. Android键盘系统
  7. RelativeLayout的对齐属性大全(LinearLayo
  8. Android设置item的行间距,以及去掉分割线
  9. android 风格
  10. Android入门教程(三)之------导入现有And