如何将ArcGIS API返回的JSON转换为结构化Pandas DataFrame
从ArcGIS API结果转换为Pandas DataFrame(按Object ID组织)
你已经成功调用ArcGIS的Viewshed服务并拿到了JSON结果,接下来只需提取要素数据并整理成DataFrame即可,核心是定位返回结果中的要素集合,再把每个要素的属性(含唯一OBJECTID)和几何信息整合到一起:
完整修改后的代码
import urllib.request as urlopen import urllib.parse as urlencode import urllib.request as request import json import pandas as pd inPts = {"geometryType" : "esriGeometryPoint", "spatialReference" : {"wkid" : 54003}, 'features':[{'geometry': {'x': -13308192.1956127, 'y': 4221903.58555983}}]} dist = {'distance':8.5,'units':'esriMiles'} data = {'Input_Observation_Point': inPts, 'Viewshed_Distance': dist, 'f': 'pjson'} URL = 'http://sampleserver6.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed/execute' req = request.Request(URL, urlencode.urlencode(data).encode('UTF-8')) response = urlopen.urlopen(req) response_bytes = response.read() data = json.loads(response_bytes.decode('UTF-8')) # ------------------- 新增转换为DataFrame的代码 ------------------- # 提取可视区域的要素集合(定位到API返回的结果层级) features = data['results'][0]['value']['features'] # 将每个要素的属性与几何信息整合为字典 feature_dicts = [] for feat in features: # 复制属性字典,避免修改原数据 item = feat['attributes'].copy() # 把几何对象转为JSON字符串(方便在DataFrame中查看,也可保留原字典格式) item['geometry'] = json.dumps(feat['geometry']) feature_dicts.append(item) # 转换为Pandas DataFrame,OBJECTID作为唯一标识列 df = pd.DataFrame(feature_dicts) # 可选:按OBJECTID排序,让表格更规整 df = df.sort_values('OBJECTID').reset_index(drop=True) # 查看结果 print(df.head())
关键步骤说明
- 定位要素数据:ArcGIS GP服务的
execute接口返回的results数组中,第一个元素对应Viewshed工具的输出要素,其value.features就是所有可视区域的要素集合。 - 整合要素信息:每个要素包含
attributes(含唯一OBJECTID)和geometry两部分,我们将两者合并为一个字典,几何信息转成JSON字符串是为了在DataFrame中更易读,若后续需要处理几何,也可以直接保留原字典格式。 - 生成DataFrame:直接用
pd.DataFrame()将字典列表转换为表格,OBJECTID会自动成为其中一列,天然作为每条记录的唯一标识,你可以用它来做筛选、索引或关联操作。
简化写法(列表推导式)
如果觉得循环太繁琐,可以用列表推导式简化整合步骤:
feature_dicts = [ {**feat['attributes'], 'geometry': json.dumps(feat['geometry'])} for feat in features ]
内容的提问来源于stack exchange,提问作者zape
相关产品推荐
相关产品推荐

