Ham verileri geopandalara okuma


14

Ham verileri a geopandas GeoDataFrame, a la a içine okumak mümkün müdür pandas DataFrame?

Örneğin, aşağıdakiler çalışır:

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))

Aşağıdakiler bunu yapmaz:

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))

Başka bir deyişle, önce verileri diske kaydetmeden bellekte olan coğrafi verileri okumak mümkün müdür?

Yanıtlar:


16

Json'u doğrudan GeoDataFrame yapıcısına iletebilirsiniz:

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

Çıktılar:

                                            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

Tek dosya biçimlerini veya sıkıştırılmış shapefiles desteklenen için kullanabilirsiniz fiona.BytesCollectionve 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())
ve sıkıştırılmış şekil dosyaları için ( fiona 1.7.2'den itibaren desteklenmektedir )
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'nın aşağıdaki formatları kullanarak hangi formatları desteklediğini öğrenebilirsiniz:

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

Ve fiona 1.7.1 veya önceki sürümlerde bellek içi sıkıştırılmış verileri okumak için hileli bir geçici çözüm:

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

Bu, soruyu cevaplayan GeoJSON için geçerlidir. Ancak bu, diğer coğrafi dosya biçimleri, şekil dosyaları veya KML veya KMZ gibi şeyler için işe yaramaz. Bu durumlar için bir geçici çözüm biliyor musunuz?
Aleksey Bilogur

Biraz açıklama yapmak gerekiyor. GeoPandas ve Fiona şekil dosyalarını ve KML'yi destekliyor, ancak New York Şehri gibi bir kerelik API'leri tam olarak destekleyemiyorlar. Ayrıca, BytesCollectiontamamen çalışır, ancak muhtemelen github.com/Toblerity/Fiona/issues/409'daki seçeneklerden biri lehine gelecekteki bir sürümde kaldırılacaktır .
sgillies

Teşekkürler. @sgillies bir özellik isteği olarak açılmalı mı geopandas, yoksa burada bahsettiğiniz değişiklikleri beklemek daha mı iyi olur ?
Aleksey Bilogur

@sgillies, Fiona'nın yukarıdaki yorumunuzda KML'yi desteklediğini belirtiyorsunuz, ancak KML'yi dikte olmadığı için (Fiona 1.7.1'i DriverError: unsupported driver: 'KML'kullanarak) açmaya çalışırken ortaya çıkıyor supported_driversve birkaç sorunu yeniden fark ettim. KML desteği eksikliği (# 23 ve # 97). Fiona KML'yi destekliyor mu?
user2856

from_featuresYöntemi tespit ettiğiniz için teşekkür ederiz . Günümü kurtardım!
jlandercy

3

Çünkü burada fiona.BytesCollectionişe yaramaz gibi görünüyor, TopoJSONherkes için işe yarayan bir çözüm 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)

İle geopandas==0.4.0, Fiona==1.8.4Python 3 ve ben olsun DriverError: unsupported driver: 'TopoJSON'.
edesz

Haklısın. En azından sürümü kadar çalışıyordu 1.7.13arasındaFiona
Mattijn

Bunun işe yaramaması talihsiz bir durumdur. Altair choropleth grafikleri için GitHub'daki örneğinizi takip etmeye çalışıyordum ama bu da aynı hatayı hatta atıyor gdf = gpd.read_file(counties, driver='TopoJSON'). Kullanmanın with fiona.Collection...işe yarayabileceğini düşündüm ama ne yazık ki işe yaramıyor.
edesz

@edesz bu bir hataydı ve Fiona 1.8.5'te
Mattijn


2

Fiona 1.8 kullanırken, bu projenin MemoryFileveyaZipMemoryFile kullanılarak yapılabilir (zorunlu?) .

Örneğin:

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

En kolay yol GeoJSON URL'sini doğrudan gpd.read () yöntemine girmektir. Ben BytesIO & zipfile kullanarak bu önce bir zip bir şekil dosyası ayıklamayı denedim ve gpd (özellikle Fiona) dosya benzeri nesneleri kabul ile ilgili sorunlar vardı.

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'u doğrudan GDF yapıcısına iletmek yerine belgesiz kullanılarak elde edilen sonucu tercih ederim :

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

Çıktı

                       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

Ortaya çıkan GeoDataFrame geometri sütun doğru ayarlanmış ve herhangi bir FeatureCollections unnest gerek kalmadan beklediğim gibi tüm sütunları vardır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.