Możesz przekazać json bezpośrednio do konstruktora 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()
Wyjścia:
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
W przypadku obsługiwanych formatów jednego pliku lub spakowanych plików kształtów możesz użyć fiona.BytesCollection
i 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())
i dla spakowanych plików kształtów (obsługiwane od wersji
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())
Możesz dowiedzieć się, jakie formaty obsługuje Fiona, używając czegoś takiego:
import fiona
for name, access in fiona.supported_drivers.items():
print('{}: {}'.format(name, access))
I hacky obejście do odczytu spakowanych danych w pamięci w Fiona 1.7.1 lub wcześniejszej:
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())
BytesCollection
całkowicie działa, ale prawdopodobnie zostanie usunięty w przyszłej wersji na korzyść jednej z opcji w github.com/Toblerity/Fiona/issues/409 .geopandas
, czy lepiej byłoby poczekać na zmiany, o których tu wspominasz ?DriverError: unsupported driver: 'KML'
jest podnoszona podczas próby otwarcia KML, ponieważ nie ma go wsupported_drivers
dykcie (za pomocą Fiona 1.7.1) i zauważyłem kilka problemów. brak obsługi KML (# 23 i # 97). Czy Fiona obsługuje KML?from_features
metody. Uratowałem mój dzień!Ponieważ
fiona.BytesCollection
wydaje się, że nie działaTopoJSON
tutaj rozwiązanie, które działa dla wszystkich bez potrzebygdal
:źródło
geopandas==0.4.0
,Fiona==1.8.4
i Pythonie 3, otrzymujęDriverError: unsupported driver: 'TopoJSON'
.1.7.13
zFiona
gdf = gpd.read_file(counties, driver='TopoJSON')
. Myślałem, że używaniewith fiona.Collection...
może działać, ale niestety nie.Tak, teraz jest to możliwe dzięki Fiona (patrz https://github.com/Toblerity/Fiona/issues/409 ). Nie jestem pewien, czy ta funkcja jest jeszcze ujawniona w Geopandzie.
źródło
W przypadku korzystania z Fiona 1.8 można to (musi?) Wykonać przy użyciu tego projektu
MemoryFile
lubZipMemoryFile
.Na przykład:
źródło
Najłatwiejszym sposobem jest wprowadzenie adresu URL GeoJSON bezpośrednio w gpd.read (). Próbowałem wcześniej wyodrębnić plik kształtu z pliku zip za pomocą BytesIO i pliku zip i miałem problemy z tym, że gpd (konkretnie Fiona) akceptuje obiekty podobne do plików.
źródło
Wolę wynik uzyskany przy użyciu nieudokumentowanego
GeoDataFrame.from_features()
zamiast bezpośredniego przekazywania GeoJSON do konstruktora GDF:Wynik
Wynikowa GeoDataFrame ma poprawnie ustawioną kolumnę geometrii i wszystkie kolumny, jak bym się spodziewał, bez potrzeby cofania jakichkolwiek operacji FeatureCollections
źródło