Json是网页数据的一类重要格式,对于使用GIS的规划工作者,最常见的两类是EsriJson和GeoJson。然而,这两类Json格式的数据冗余较大,国内的极海提出了新的数据格式,虽然网络传输便捷但不能直接使用arcgis或Qgis进行转换使用。
对付非通用格式的json数据,要花一点功夫,以下是我用python编写的极海Json转换代码,希望能够帮到您。
import os,json,time,requests
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely import geometry
choose = input('转换文件夹内json选1,单个直接输入需要转shp的json名称,不带后缀名:')
def transjsontoshp(name):
try:
with open (name+'.json','r',encoding='utf8')as f:
jasondata = json.load(f)
f.close()
except Exception as Argument:
print (Argument,'\n ......try:gbk')
with open (name+'.json','r',encoding='gbk')as f:
jasondata = json.load(f)
f.close()
listdata =[]
for i in jasondata['data']['features']:
if 'geom' in i.keys() and type( i['geom'])==dict:
listdata .append( {**{'id':i['id']},**i['attrs'],**i['geom']})
elif 'geom' in i.keys() and type( i['geom'])==list:
listdata .append({**{'id':i['id']},**i['attrs'],**{'m':[i['geom']]}})
pddata = pd.DataFrame(listdata)
if 'Point' in jasondata['data']['geometryType']:
pddata['geometry']= [geometry.MultiPoint([geometry.Point(i) for i in j]) for j in pddata['m']]
elif 'Polyline' in jasondata['data']['geometryType']:
pddata['geometry']= [geometry.MultiLineString([geometry.LineString(i) for i in j]) for j in pddata['m']]
elif 'Polygon' in jasondata['data']['geometryType']:
pddata['geometry']= [geometry.MultiPolygon([geometry.Polygon(i) for j in k for i in j]) for k in pddata['m']]
pddata.drop(['m'],axis=1,inplace= True)
gpddata = gpd.GeoDataFrame(pddata)
try:
gpddata.to_file(name+'.shp',driver='ESRI Shapefile',encoding='gbk')
except:
gpddata.to_file(name+'geo.json',driver='GeoJSON',encoding='utf-8')
if choose == '1':
files = [i.split('.json')[0] for i in os.listdir() if '.json'in i]
for f in files:
transjsontoshp(f)
else:
name = choose
transjsontoshp(name)