It is pretty simple actually, you just need to iterate through the features
of the geojson structure once you have got it in a dictionary format (like from the json.load()
function). I don't work with GeoServer WFS services, but I did find a json
example online. The first shows just how to iterate through the json and get an arcpy.Geometry
object back.
import arcpy
import os
arcpy.env.overwriteOutput = True
geojson = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"Name": "aoi",
"Source": "google"
}
}, {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0],
[103.0, 1.0],
[104.0, 0.0],
[105.0, 1.0]
]
},
"properties": {
"Name": "centerline",
"Source": "bing"
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
},
"properties": {
"Name": "parking lot",
"Source": "esri"
}
}]
}
# print type from arcpy.Geometry objects
for ft in geojson['features']:
geom = arcpy.AsShape(ft['geometry'], False)
print geom.type
This example should print the following:
point
line
polygon
Taking a similar json structure for polygon features, you can easily convert it to a feature class by first creating a feature class, adding the necessary fields, then using an Insert Cursor to feed in the values.
import arcpy
import os
arcpy.env.overwriteOutput = True
geojson2 = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[300.0, 200.0],
[301.0, 200.0],
[301.0, 201.0],
[300.0, 201.0],
[300.0, 200.0]
]
]
},
"properties": {
"Name": "aoi",
"Source": "google"
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
},
"properties": {
"Name": "centerline",
"Source": "bing"
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[400.0, 300.0],
[401.0, 300.0],
[401.0, 301.0],
[400.0, 301.0],
[400.0, 300.0]
]
]
},
"properties": {
"Name": "parking lot",
"Source": "esri"
}
}]
}
# we are working with polygons, so make new polygon fc
fc = r'C:\TEMP\testing.gdb\geojson_test'
sr = arcpy.SpatialReference(26915) # utm 15N
path, name = os.path.split(fc)
arcpy.management.CreateFeatureclass(path, name, 'POLYGON', spatial_reference=sr)
# add fields as listed from the properties of each feature
fields = ['Name', 'Source']
for field in fields:
arcpy.management.AddField(fc, field, 'TEXT')
# insert rows
with arcpy.da.InsertCursor(fc, ['SHAPE@'] + fields) as irows:
for feature in geojson2['features']:
geom = arcpy.AsShape(feature['geometry'], False)
irows.insertRow([geom] + [feature['properties'][f] for f in fields])
print 'done'
I would also recommend having a look at the requests module instead of pycurl, you can get format back as raw json and do not have to worry about working with intermediate .json
files. It also supports all kinds of authorization types and passing in arguments is very elegant.