Puede pasar el json directamente al constructor 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()
Salidas:
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
Para formatos de archivo único compatibles o archivos de forma comprimidos, puede usar fiona.BytesCollection
y 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())
y para archivos de forma comprimidos (admitidos a partir de
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())
Puede averiguar qué formatos admite Fiona utilizando algo como:
import fiona
for name, access in fiona.supported_drivers.items():
print('{}: {}'.format(name, access))
Y una solución alternativa para leer datos comprimidos en memoria en fiona 1.7.1 o anterior:
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
funciona totalmente, pero probablemente se eliminará en una versión futura a favor de una de las opciones en github.com/Toblerity/Fiona/issues/409 .geopandas
o sería mejor esperar los cambios que menciona aquí ?DriverError: unsupported driver: 'KML'
aparece cuando intentas abrir KML ya que no está en elsupported_drivers
dict (usando Fiona 1.7.1) y noté un par de problemas. falta de soporte KML (# 23 y # 97). ¿Fiona admite KML?from_features
método. Me salvó el día!Dado
fiona.BytesCollection
que no parece funcionarTopoJSON
aquí, una solución que funciona para todos sin la necesidad degdal
:fuente
geopandas==0.4.0
,Fiona==1.8.4
y Python 3, entiendoDriverError: unsupported driver: 'TopoJSON'
.1.7.13
deFiona
gdf = gpd.read_file(counties, driver='TopoJSON')
. Pensé que usarwith fiona.Collection...
podría funcionar, pero lamentablemente no.Sí, ahora es posible con Fiona (consulte https://github.com/Toblerity/Fiona/issues/409 ). No estoy seguro si esta característica aún está expuesta en Geopandas.
fuente
Cuando se usa Fiona 1.8, esto se puede (¿debe hacer?) Usando el proyecto
MemoryFile
oZipMemoryFile
.Por ejemplo:
fuente
La forma más fácil es ingresar la URL de GeoJSON directamente en gpd.read (). Intenté extraer un shapefile de un zip antes de esto usando BytesIO y zipfile y tuve problemas con gpd (específicamente Fiona) que aceptaba objetos similares a archivos.
fuente
Prefiero el resultado obtenido al usar el indocumentado en
GeoDataFrame.from_features()
lugar de pasar el GeoJSON al constructor GDF directamente:Salida
El GeoDataFrame resultante tiene la columna de geometría configurada correctamente y todas las columnas como yo esperaría, sin necesidad de anular ninguna FeatureCollections
fuente