生データをジオパンダに読み込む


12

生データをa geopandas GeoDataFrame、la a に読み込むことはできpandas DataFrameますか?

たとえば、次の作品:

import pandas as pd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
pd.read_json(io.BytesIO(r.content))

以下は行いません:

import geopandas as gpd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
gpd.read_file(io.BytesIO(r.content))

つまり、最初にディスクにデータを保存せずに、メモリにある地理空間データを読み取ることはできますか?

回答:


14

jsonを直接GeoDataFrameコンストラクターに渡すことができます。

import geopandas as gpd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
gdf = gpd.GeoDataFrame(data.json())
gdf.head()

出力:

                                            features               type
0  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
1  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
2  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
3  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
4  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection

サポートされている単一ファイル形式または圧縮されたシェープファイルの場合fiona.BytesCollection、and を使用できますGeoDataFrame.from_features

import requests
import fiona
import geopandas as gpd

url = 'http://www.geopackage.org/data/gdal_sample.gpkg'
request = requests.get(url)
b = bytes(request.content)
with fiona.BytesCollection(b) as f:
    crs = f.crs
    gdf = gpd.GeoDataFrame.from_features(f, crs=crs)
    print(gdf.head())
zip形式のシェープファイル(fiona 1.7.2以降でサポート)
url = 'https://www2.census.gov/geo/tiger/TIGER2010/STATE/2010/tl_2010_31_state10.zip'
request = requests.get(url)
b = bytes(request.content)
with fiona.BytesCollection(b) as f:
    crs = f.crs
    gdf = gpd.GeoDataFrame.from_features(f, crs=crs)
    print(gdf.head())

Fionaがサポートするフォーマットは次のようなもので確認できます。

import fiona
for name, access in fiona.supported_drivers.items():
    print('{}: {}'.format(name, access))

そして、フィオナ1.7.1以前のメモリ内のzipデータを読み取るためのハックな回避策:

import requests
import uuid
import fiona
import geopandas as gpd
from osgeo import gdal

request = requests.get('https://github.com/OSGeo/gdal/blob/trunk/autotest/ogr/data/poly.zip?raw=true')
vsiz = '/vsimem/{}.zip'.format(uuid.uuid4().hex) #gdal/ogr requires a .zip extension

gdal.FileFromMemBuffer(vsiz,bytes(request.content))
with fiona.Collection(vsiz, vsi='zip', layer ='poly') as f:
    gdf = gpd.GeoDataFrame.from_features(f, crs=f.crs)
    print(gdf.head())

これは、質問に答えるGeoJSONで機能します。ただし、これは、シェープファイル、KML、KMZなどの他の地理空間ファイル形式では機能しません。それらのケースの回避策を知っていますか?
Aleksey Bilogur 2017年

少し説明が必要です。GeoPandasとFionaはシェープファイルとKMLをサポートしていますが、City of New Yorkのような1回限りのAPIを完全にはサポートできません。また、BytesCollection完全に機能しますが、github.com/Toblerity/Fiona/issues/409のオプションの1つを採用するため、将来のバージョンでは削除される可能性があります。
sgillies 2017年

ありがとう。@sgilliesは、これをの機能リクエストとして開く必要geopandasがありますか、それともここで述べた変更を待つ方が良いでしょうか?
Aleksey Bilogur 2017年

@sgilliesあなたは、Fionaが上記のコメントでKMLをサポートしていると述べていますが、DriverError: unsupported driver: 'KML'KMLを開こうとすると、supported_drivers(Fiona 1.7.1を使用して)辞書にないため発生し、いくつかの問題に気付きました。KMLサポートの欠如(#23および#97)。FionaはKMLをサポートしていますか?
user2856 2017年

3

ここでfiona.BytesCollectionはうまくいかないようですのでTopoJSON、必要なしにすべてのために働く解決策gdal

import fiona
import geopandas as gpd
import requests

# parse the topojson file into memory
request = requests.get('https://vega.github.io/vega-datasets/data/us-10m.json')
visz = fiona.ogrext.buffer_to_virtual_file(bytes(request.content))

# read the features from a fiona collection into a GeoDataFrame
with fiona.Collection(visz, driver='TopoJSON') as f:
    gdf = gpd.GeoDataFrame.from_features(f, crs=f.crs)

ではgeopandas==0.4.0Fiona==1.8.4とPython 3、私が得ますDriverError: unsupported driver: 'TopoJSON'
edesz

あなたが正しいです。これは、少なくともバージョンまで働いていた1.7.13Fiona
Mattijn

これが機能しないのは残念です。私はGitHubでAltairコロプレスプロットの例を追おうとしましたが、これも行でまったく同じエラーをスローしますgdf = gpd.read_file(counties, driver='TopoJSON')。私は使用with fiona.Collection...することはうまくいくと思っていましたが、悲しいことにうまくいきません。
edesz

@edeszこれはバグであり、Fiona 1.8.5で修正される予定です。github.com
Toblerity


2

Fiona 1.8を使用する場合、これはそのプロジェクトのMemoryFileまたはZipMemoryFileを使用して行う必要があります(必須?)。

例えば:

import fiona.io
import geopandas as gpd
import requests

response = requests.get('http://example.com/Some_shapefile.zip')
data_bytes = response.content

with fiona.io.ZipMemoryFile(data_bytes) as zip_memory_file:
    with zip_memory_file.open('Some_shapefile.shp') as collection:
      geodf = gpd.GeoDataFrame.from_features(collection, crs=collection.crs)

0

最も簡単な方法は、GeoJSON URLを直接gpd.read()に入力することです。私はこの前にBytesIO&zipfileを使用してzipからシェープファイルを抽出しようとしましたが、ファイルのようなオブジェクトを受け入れるgpd(具体的にはFiona)に問題がありました。

import geopandas as gpd
import David.SQL_pull_by_placename as sql
import os

os.environ['PROJ_LIB'] = r'C:\Users\littlexsparkee\Anaconda3\Library\share\proj'

geojson_url = f'https://github.com/loganpowell/census-geojson/blob/master/GeoJSON/500k/2018/{sql.state}/block-group.json?raw=true'
census_tracts_gdf = gpd.read_file(geojson_url)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.