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

前端之家收集整理的这篇文章主要介绍了Arcpy基础入门-5、读取自定义格式xml前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

j


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


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

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

  1. #coding=utf-8
  2. import arcpy,os,time
  3. import xml.dom.minidom
  4. import random
  5. from arcpy import env
  6. arcpy.env.overwriteOutput = True
  7.  
  8. #inGPXFile = arcpy.GetParameterAsText(0)
  9. inpath = 'F:\\gpx\\航迹-settingDB-20150605031316.gpx'
  10. uipath = unicode(inpath,"utf8")
  11.  
  12. #outputFC = arcpy.GetParameterAsText(1)
  13. outputFC = r'F:\gpx\20150605031316.shp'
  14. uoutputFC = unicode(outputFC,"utf8")
  15.  
  16. # 打开xml文档
  17. dom = xml.dom.minidom.parse(uipath)
  18. #得到文档元素对象
  19. root = dom.documentElement
  20.  
  21. def get_attrvalue(node,attrname):
  22. return node.getAttribute(attrname) if node else ''
  23.  
  24. def get_nodevalue(node,index = 0):
  25. if node:
  26. if node.childNodes:
  27. return node.childNodes[index].nodeValue
  28. else:
  29. return None
  30.  
  31. def get_xmlnode(node,name):
  32. return node.getElementsByTagName(name) if node else []
  33.  
  34. trk_nodes = get_xmlnode(root,'trk')
  35. #获得节点测试
  36. print trk_nodes
  37.  
  38. #创建shp
  39. path = os.path.split(outputFC)[0]
  40. name = os.path.split(outputFC)[1]
  41. print path
  42. print name
  43. arcpy.CreateFeatureclass_management(path,name,"POLYLINE")
  44.  
  45. fieldName1 = "name"
  46. fieldAlias = "轨迹名称"
  47. fieldLength = 50
  48. arcpy.AddField_management(outputFC,fieldName1,"TEXT","",fieldLength,fieldAlias,"NULLABLE")
  49.  
  50. fieldName2 = "time"
  51. fieldAlias = "时间"
  52. fieldLength = 50
  53. arcpy.AddField_management(outputFC,fieldName2,"NULLABLE")
  54.  
  55. fieldName3 = "length"
  56. fieldPrecision = 9
  57. fieldAlias = "长度"
  58. arcpy.AddField_management(outputFC,fieldName3,"DOUBLE",fieldPrecision,"NULLABLE")
  59.  
  60. fieldName4 = "jiange"
  61. fieldAlias = "间隔"
  62. arcpy.AddField_management(outputFC,fieldName4,"LONG","NULLABLE")
  63.  
  64. fieldName5 = "tpkname"
  65. fieldAlias = "图幅名字"
  66. fieldLength = 50
  67. arcpy.AddField_management(outputFC,fieldName5,"NULLABLE")
  68.  
  69. fieldName6 = "daino"
  70. fieldAlias = "带号"
  71. arcpy.AddField_management(outputFC,fieldName6,"NULLABLE")
  72.  
  73. cur=arcpy.InsertCursor(outputFC)
  74. for trk_node in trk_nodes:
  75.  
  76. trk_node_time = get_xmlnode(trk_node,'time')
  77. trk_node_length = get_xmlnode(trk_node,'length')
  78. trk_node_jiange = get_xmlnode(trk_node,'jiange')
  79. trk_node_name = get_xmlnode(trk_node,'name')
  80. trk_node_daino = get_xmlnode(trk_node,'daino')
  81. trk_node_tpkname = get_xmlnode(trk_node,'tpkname')
  82.  
  83. trk_time =get_nodevalue(trk_node_time[0]).encode('utf-8','ignore')
  84. trk_length =get_nodevalue(trk_node_length[0]).encode('utf-8','ignore')
  85. trk_jiange =get_nodevalue(trk_node_jiange[0]).encode('utf-8','ignore')
  86. trk_name =get_nodevalue(trk_node_name[0]).encode('utf-8','ignore')
  87. trk_daino =get_nodevalue(trk_node_daino[0]).encode('utf-8','ignore')
  88. trk_tpkname =get_nodevalue(trk_node_tpkname[0]).encode('utf-8','ignore')
  89.  
  90.  
  91. array = arcpy.Array()
  92. trkseg_node = get_xmlnode(trk_node,'trkseg')
  93. print trkseg_node
  94. trkpt_nodes = get_xmlnode(trkseg_node[0],'trkpt')
  95. print trkpt_nodes
  96. for trkpt_node in trkpt_nodes:
  97. trkpt_node_x = get_xmlnode(trkpt_node,'X')
  98. trkpt_node_y = get_xmlnode(trkpt_node,'Y')
  99. trkpt_x =get_nodevalue(trkpt_node_x[0]).encode('utf-8','ignore')
  100. trkpt_y =get_nodevalue(trkpt_node_y[0]).encode('utf-8','ignore')
  101. x=float(trkpt_x)
  102. y=float(trkpt_y)
  103. pnt=arcpy.Point()
  104. pnt.X = trkpt_y
  105. pnt.Y = trkpt_x
  106. array.add(pnt)
  107. print x
  108. print y
  109. polyline = arcpy.Polyline(array)
  110. array.removeAll()
  111. feat= cur.newRow()
  112. feat.shape = polyline
  113. feat.setValue("shape",polyline)
  114. feat.setValue("time",trk_time)
  115. feat.setValue("length",float(trk_length))
  116. feat.setValue("jiange",int(trk_jiange))
  117. feat.setValue("name",trk_name)
  118. feat.setValue("daino",int(trk_daino))
  119. feat.setValue("tpkname",trk_tpkname)
  120. cur.insertRow(feat)
  121. del feat
  122. del cur
  123.  
  124.  
  125.  
还有另外一种方式使用arcpy.da模块下面的插入游标,根据arcgis的帮助文档,这种方式速度会更快, 详情见这里代码如下:
  1. #coding=utf-8
  2. import arcpy,time
  3. import xml.dom.minidom
  4. import random
  5. from arcpy import env
  6. arcpy.env.overwriteOutput = True
  7.  
  8. inGPXFile = arcpy.GetParameterAsText(0)
  9. #inpath = 'F:\\gpx\\航迹-settingDB-20150605031316.gpx'
  10. #uipath = unicode(inpath,"utf8")
  11.  
  12. outputFC = arcpy.GetParameterAsText(1)
  13. #outputFC = r'F:\gpx\20150605031316.shp'
  14. #uoutputFC = unicode(outputFC,"utf8")
  15.  
  16. # 打开xml文档
  17. dom = xml.dom.minidom.parse(inGPXFile)
  18. #得到文档元素对象
  19. root = dom.documentElement
  20.  
  21. def get_attrvalue(node,"NULLABLE")
  22. cur = arcpy.da.InsertCursor(outputFC,("time","length","jiange","name","daino","tpkname","SHAPE@"))
  23. for trk_node in trk_nodes:
  24.  
  25. trk_node_time = get_xmlnode(trk_node,'ignore')
  26.  
  27. array = arcpy.Array()
  28. trkseg_node = get_xmlnode(trk_node,'ignore')
  29. x=float(trkpt_x)
  30. y=float(trkpt_y)
  31. pnt=arcpy.Point()
  32. pnt.X = trkpt_y
  33. pnt.Y = trkpt_x
  34. array.add(pnt)
  35. print x
  36. print y
  37. polyline = arcpy.Polyline(array)
  38. row =[trk_time,float(trk_length),int(trk_jiange),trk_name,int(trk_daino),trk_tpkname,polyline]
  39. cur.insertRow(row)
  40.  
  41.  
  42.  
  43.  
至于如何根据脚本创建模型工具,可以去看下基础入门之3和4

猜你在找的XML相关文章