将 JSON 加载到 GeoDataFrame
Posted
技术标签:
【中文标题】将 JSON 加载到 GeoDataFrame【英文标题】:Loading JSON into a GeoDataFrame 【发布时间】:2018-01-15 02:47:58 【问题描述】:我无法将以下包含 GIS 数据 (https://data.cityofnewyork.us/resource/5rqd-h5ci.json) 的 JSON 加载到 GeoDataFrame 中。
以下代码在我尝试设置几何图形时失败。
import requests
import geopandas as gpd
data = requests.get("https://data.cityofnewyork.us/resource/5rqd-h5ci.json")
gdf = gpd.GeoDataFrame(data.json())
gdf = gdf.set_geometry('the_geom')
gdf.head()
【问题讨论】:
注意以备将来参考:此 json 文件似乎不是有效的 GeoJSON。对于此类文件,您可以更轻松地使用geopandas.read_file(..)
【参考方案1】:
对于使用网络地图库的人...
如果 GeoJSON 被包裹在 FeatureCollection
中,就像当它们通过网络映射库(在我的例子中是 Leaflet)导出到 GeoJSON 字符串时通常那样,那么您需要做的就是通过 features
传递列表像这样到from_features()
:
import geopandas as gpd
study_area = json.loads("""
"type": "FeatureCollection", "features": ["type": "Feature", "properties": , "geometry": "type": "Polygon", "coordinates": [[[36.394272, -18.626726], [36.394272, -18.558391], [36.489716, -18.558391], [36.489716, -18.626726], [36.394272, -18.626726]]]]
""")
gdf = gpd.GeoDataFrame.from_features(study_area["features"])
print(gdf.head())
输出:
geometry
0 POLYGON ((36.394272 -18.626726, 36.394272 -18....
简单易懂。
【讨论】:
这是一个更好的答案,特别是对于最近升级 geopandas 并面临前 GeoDataFrame 构造函数的回归问题的人【参考方案2】:设置几何失败,因为 geopandas.GeoDataFrame
构造函数似乎没有被构建来将 JSON 对象作为 python 数据结构来处理。因此,它抱怨该参数不是有效的几何对象。您必须将其解析为geopandas.GeoDataFrame
可以理解的内容,例如shapely.geometry.shape
。这是我这边没有错误的运行,Python 3.5.4:
#!/usr/bin/env python3
import requests
import geopandas as gpd
from shapely.geometry import shape
r = requests.get("https://data.cityofnewyork.us/resource/5rqd-h5ci.json")
r.raise_for_status()
data = r.json()
for d in data:
d['the_geom'] = shape(d['the_geom'])
gdf = gpd.GeoDataFrame(data).set_geometry('the_geom')
gdf.head()
免责声明:我对 Geo 一无所知。在我安装了geopandas
来解决这个问题并阅读了一些在线文档之前,我什至不知道这些库和这种数据的存在。
【讨论】:
更干净:d['the_geom'] = d['the_geom'].apply(shape)
【参考方案3】:
结合以上答案,这对我有用。
import pandas as pd
import geopandas as gpd
from shapely.geometry import shape
nta = pd.read_json( r'https://data.cityofnewyork.us/resource/93vf-i5bz.json' )
nta['the_geom'] = nta['the_geom'].apply(shape)
nta_geo = gpd.GeoDataFrame(nta).set_geometry('geometry')
【讨论】:
【参考方案4】:使用继承自 pandas
和原生 GeoDataFrame.from_features
的常规数据帧函数的更惯用方式:
gdf = gpd.GeoDataFrame(data.json())
# features column does not need to be stored, this is just for illustration
gdf['features'] = gdf['the_geom'].apply(lambda x: 'geometry': x, 'properties': )
gdf2 = gpd.GeoDataFrame.from_features(gdf['features'])
gdf = gdf.set_geometry(gdf2.geometry)
gdf.head()
【讨论】:
以上是关于将 JSON 加载到 GeoDataFrame的主要内容,如果未能解决你的问题,请参考以下文章