Вы можете передать 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
Для поддерживаемых однофайловых форматов или сжатых шейп-файлов вы можете использовать fiona.BytesCollection
и 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())
и для архивированных шейп-файлов (поддерживается с
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))
И хакерский обходной путь для чтения сжатых данных в памяти в Фионе 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())
BytesCollection
полностью работает, но, вероятно, будет удален в будущей версии в пользу одного из вариантов в github.com/Toblerity/Fiona/issues/409 .geopandas
или лучше подождать изменений, о которых вы здесь упомянули ?DriverError: unsupported driver: 'KML'
возникает при попытке открыть KML, так как он не является обязательнымsupported_drivers
(используется Fiona 1.7.1), и я заметил несколько проблем, связанных с. отсутствие поддержки KML (# 23 и # 97). Fiona поддерживает KML?from_features
метод. Спас мой день!Поскольку
fiona.BytesCollection
, кажется,TopoJSON
здесь не работает решение, которое работает для всех без необходимостиgdal
:источник
geopandas==0.4.0
,Fiona==1.8.4
и Python 3, я получаюDriverError: unsupported driver: 'TopoJSON'
.1.7.13
изFiona
gdf = gpd.read_file(counties, driver='TopoJSON')
. Я думал, что использованиеwith fiona.Collection...
может работать, но, к сожалению, это не так.Да, теперь это возможно с помощью Fiona (см. Https://github.com/Toblerity/Fiona/issues/409 ). Я не уверен, что эта функция выставлена еще в Geopandas.
источник
При использовании Fiona 1.8 это можно (нужно?) Сделать с помощью этого проекта
MemoryFile
илиZipMemoryFile
.Например:
источник
Самый простой способ - ввести URL-адрес GeoJSON непосредственно в gpd.read (). Я пытался извлечь шейп-файл из zip-файла до этого, используя BytesIO & zipfile, и у меня были проблемы с gpd (особенно Fiona), принимающим файловые объекты.
источник
Я предпочитаю результат, полученный с помощью недокументированного,
GeoDataFrame.from_features()
а не передачи GeoJSON в конструктор GDF напрямую:Вывод
Получившийся GeoDataFrame имеет правильно настроенный столбец геометрии и все столбцы, как и следовало ожидать, без необходимости удалять вложенные FeatureCollections
источник