web-dev-qa-db-ja.com

JSONをGeoDataFrameにロードする

GISデータを含む次のJSON( https://data.cityofnewyork.us/resource/5rqd-h5ci.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()
12
blahblahblah

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をインストールするまで存在していました。

9
JoshuaRLi

Webマッピングライブラリを使用している人のために...

GeoJSONがFeatureCollectionでラップされている場合、Webマッピングライブラリ(私の場合は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....

簡単なピーシー。

2
wfgeo

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()
0
prusswan