(七)arcpy开发&&利用arcpy解析json生成shp数据
最近项目有这样的需求,采集的是在android平台上开发的平板app的上获取的图形数据。我们采集了点(point),线(polyline),面(polygon)数据,然后利用arcgis for android的api接口将这些图形数据转为json以string类型数据存储到splite数据库中。外业采集完后,再转为相应的shapefile数据,那么现在遇到的问题是如何将json格式的数据转为shapefile数据。我们来看一下测试采集的json格式数据,如下图所示。是两个polygon类的数据。
现在利用arcpy将这些数据解析出来,我们利用了python的json类,将数据转为map类型,然后由关键字(key)一一获取我们需要的信息。在这其中我们注意到其实polygon无法就是很多点集组成,只需要遍历这些点集,拼成polygon需要的格式即可。然后,至于创建polygon还需要借助arcpy相应的api,在这里我们就不一一说明了。具体的实现可以参考一下代码。
import json
import arcpy
json_filename = 'C:/Users/qrb_PC/Desktop/fast/tb_fixRadioPolygon.json'
def readJson(fileName):
path="C:\\Users\\qrb_PC\\Desktop\\fast"
outputname="polygontest.shp"
spatRef = arcpy.SpatialReference(4326)
createFC=arcpy.CreateFeatureclass_management(path, outputname, "POLYGON","","","",spatRef)
arcpy.AddField_management(createFC, "name", "TEXT", 50)
cur = arcpy.InsertCursor(createFC)
with open(json_filename, "r") as f:
polygonGeometryList = []
s = json.load(f)
for key in s.keys():
if key == 'RECORDS':
for item in s[key]:
for field in item:
if field == "JsonObj":
value = item[field]
rings = json.loads(value)
for ringKey in rings:
if ringKey == "rings":
array = arcpy.Array()
points=[]
tmpRingValue = rings[ringKey]
for ringItems in tmpRingValue:
for ringItem in ringItems:
X = ringItem[0]
Y = ringItem[1]
pointitem=[]
point = arcpy.Point()
point.X = X
point.Y = Y
pointitem.append(X)
pointitem.append(Y)
array.add(point)
points.append(pointitem)
row = cur.newRow()
row.shape = array
#polygon = arcpy.Polygon(array)
#polygonGeometryList.append(polygon)
cur.insertRow(row)
array.removeAll()
readJson(json_filename)
最后的实现生成的polygon类型数据,将该数据加载到arcdeskop中,如下图所示。
更多内容,请关注公众号
转载自:https://blog.csdn.net/u010608964/article/details/84979982