geopandas로 원시 데이터 읽기


14

원시 데이터를 a geopandas GeoDataFrame, a a 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))

다시 말해, 데이터를 디스크에 먼저 저장하지 않고 메모리에있는 지리 공간 데이터를 읽을 수 있습니까?

답변:


16

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

단일 파일 형식 또는 압축 된 shape 파일을 지원하는 경우, 당신은 사용할 수 있습니다 fiona.BytesCollectionGeoDataFrame.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())
압축 모양 파일의 경우 ( 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))

그리고 fiona 1.7.1 또는 이전 버전에서 메모리 내 압축 데이터를 읽는 해킹 방법 :

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에서 작동하며 질문에 대답합니다. 그러나 다른 지형 공간 파일 형식, shapefile 또는 KML 또는 KMZ와 같은 경우에는 작동하지 않습니다. 이러한 경우에 대한 해결 방법을 알고 있습니까?
Aleksey Bilogur

약간의 설명이 필요합니다. GeoPanda와 Fiona는 쉐이프 파일과 KML을 지원하지만 뉴욕시와 같은 일회용 API를 완전히 지원할 수는 없습니다. 또한 BytesCollection완전히 작동하지만 github.com/Toblerity/Fiona/issues/409 의 옵션 중 하나를 위해 향후 버전에서 제거 될 것 입니다.
sgillies

감사. @sgillies에서 기능 요청으로 열어야 합니까 아니면 여기에서geopandas 언급 한 변경 사항을 기다리는 것이 더 좋 습니까?
Aleksey Bilogur

@sgillies는 Fiona가 위의 의견에서 KML을 지원한다고 말하지만 KML DriverError: unsupported driver: 'KML'supported_driversdict에 있지 않기 때문에 (Fiona 1.7.1 사용) KML을 열려고 할 때 발생 하며 몇 가지 문제가 있음을 알았습니다. KML 지원 부족 (# 23 & # 97) Fiona는 KML을 지원합니까?
user2856

from_features방법 을 찾아 주셔서 감사합니다 . 내 하루를 구했다!
jlandercy

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.0, Fiona==1.8.4Python 3을 사용하면을 얻습니다 DriverError: unsupported driver: 'TopoJSON'.
edesz

네 말이 맞아 그것은 적어도 버전까지 일하고 1.7.13Fiona
Mattijn

이것이 작동하지 않는 것은 불행합니다. Altair choropleth plots에 대한 GitHub의 예제 를 따르려고 했지만 라인에서도 똑같은 오류가 발생합니다 gdf = gpd.read_file(counties, driver='TopoJSON'). 나는 사용 with fiona.Collection...이 효과가 있다고 생각 했지만 슬프게도 그렇지 않습니다.
edesz

@edesz 버그이며 Fiona 1.8.5에서 수정 될 예정입니다 : github.com/Toblerity/Fiona/issues/721
Mattijn


2

피오나 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에서 shapefile을 추출하려고 시도했으며 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)

0

GeoDataFrame.from_features()GeoJSON을 GDF 생성자에 직접 전달하는 대신 문서화되지 않은 것을 사용하여 얻은 결과를 선호합니다 .

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

산출

                       geometry                         name                                url           line objectid                                              notes
0    POINT (-73.99107 40.73005)                     Astor Pl  http://web.mta.info/nyct/service/  4-6-6 Express        1  4 nights, 6-all times, 6 Express-weekdays AM s...
1    POINT (-74.00019 40.71880)                     Canal St  http://web.mta.info/nyct/service/  4-6-6 Express        2  4 nights, 6-all times, 6 Express-weekdays AM s...
2    POINT (-73.98385 40.76173)                      50th St  http://web.mta.info/nyct/service/            1-2        3                              1-all times, 2-nights
3    POINT (-73.97500 40.68086)                    Bergen St  http://web.mta.info/nyct/service/          2-3-4        4           4-nights, 3-all other times, 2-all times
4    POINT (-73.89489 40.66471)             Pennsylvania Ave  http://web.mta.info/nyct/service/            3-4        5                        4-nights, 3-all other times

결과 GeoDataFrame에는 FeatureCollection을 숨길 필요없이 지오메트리 열이 올바르게 설정되고 모든 열이 올바르게 설정됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.