Você pode passar o json diretamente para o construtor 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()
Saídas:
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 arquivo único suportados ou shapefiles compactados, você pode usar fiona.BytesCollection
e 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())
e para shapefiles compactados (suportado a partir da
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())
Você pode descobrir quais formatos o Fiona suporta usando algo como:
import fiona
for name, access in fiona.supported_drivers.items():
print('{}: {}'.format(name, access))
E uma solução alternativa hacky para ler dados compactados na memória no fiona 1.7.1 ou 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, mas provavelmente será removido em uma versão futura em favor de uma das opções do github.com/Toblerity/Fiona/issues/409 .geopandas
ou seria melhor aguardar as alterações mencionadas aqui ?DriverError: unsupported driver: 'KML'
é criada ao tentar abrir o KML, pois não está nosupported_drivers
ditado (usando o Fiona 1.7.1) e notei alguns problemas. falta de suporte KML (# 23 e # 97). Fiona suporta KML?from_features
método. Salvou o meu dia!Como
fiona.BytesCollection
não parece funcionarTopoJSON
aqui, uma solução que funciona para todos sem a necessidade degdal
:fonte
geopandas==0.4.0
,Fiona==1.8.4
e Python 3, receboDriverError: unsupported driver: 'TopoJSON'
.1.7.13
deFiona
gdf = gpd.read_file(counties, driver='TopoJSON')
. Eu pensei que o usowith fiona.Collection...
poderia funcionar, mas infelizmente não.Sim, agora é possível com o Fiona (consulte https://github.com/Toblerity/Fiona/issues/409 ). Não tenho certeza se esse recurso ainda está exposto no Geopandas.
fonte
Ao usar o Fiona 1.8, isso pode (deve?) Ser feito usando o projeto
MemoryFile
ouZipMemoryFile
.Por exemplo:
fonte
A maneira mais fácil é inserir a URL do GeoJSON diretamente em gpd.read (). Eu tentei extrair um shapefile de um zip antes disso usando o BytesIO & zipfile e tive problemas com o gpd (especificamente Fiona) aceitando objetos semelhantes a arquivos.
fonte
Prefiro o resultado obtido usando o não documentado, em
GeoDataFrame.from_features()
vez de passar o GeoJSON para o construtor GDF diretamente:Resultado
O GeoDataFrame resultante tem a coluna de geometria definida corretamente e todas as colunas como eu esperaria, sem a necessidade de desnaturar nenhuma FeatureCollections
fonte