Vous pouvez passer le json directement au constructeur 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()
Les sorties:
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
Pour les formats de fichier unique pris en charge ou les fichiers de formes zippés, vous pouvez utiliser fiona.BytesCollection
et 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())
et pour les fichiers de formes zippés (pris en charge à 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())
Vous pouvez découvrir les formats pris en charge par Fiona en utilisant quelque chose comme:
import fiona
for name, access in fiona.supported_drivers.items():
print('{}: {}'.format(name, access))
Et une solution de contournement hacky pour lire les données compressées en mémoire dans fiona 1.7.1 ou version antérieure:
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
fonctionne totalement, mais va probablement être supprimé dans une future version au profit de l'une des options de github.com/Toblerity/Fiona/issues/409 .geopandas
, ou serait-il préférable d'attendre les modifications que vous mentionnez ici ?DriverError: unsupported driver: 'KML'
est soulevé lors de la tentative d'ouverture de KML car ce n'est pas dans lesupported_drivers
dict (en utilisant Fiona 1.7.1) et j'ai remarqué quelques problèmes. manque de support KML (# 23 & # 97). Fiona prend-il en charge KML?from_features
méthode. J'ai sauvé ma journée!Puisque
fiona.BytesCollection
ne semble pas fonctionner pourTopoJSON
ici une solution qui fonctionne pour tous sans avoir besoin degdal
:la source
geopandas==0.4.0
,Fiona==1.8.4
et Python 3, je reçoisDriverError: unsupported driver: 'TopoJSON'
.1.7.13
deFiona
gdf = gpd.read_file(counties, driver='TopoJSON')
. Je pensais que l'utilisationwith fiona.Collection...
pourrait fonctionner mais malheureusement ce n'est pas le cas.Oui, c'est possible maintenant avec Fiona (voir https://github.com/Toblerity/Fiona/issues/409 ). Je ne sais pas si cette fonctionnalité est encore exposée dans Geopandas.
la source
Lorsque vous utilisez Fiona 1.8, cela peut (doit?) Être fait en utilisant le projet
MemoryFile
ouZipMemoryFile
.Par exemple:
la source
Le moyen le plus simple consiste à saisir l'URL GeoJSON directement dans gpd.read (). J'avais essayé d'extraire un fichier de formes d'un zip avant cela en utilisant BytesIO & zipfile et j'avais des problèmes avec gpd (spécifiquement Fiona) acceptant des objets de type fichier.
la source
Je préfère le résultat obtenu en utilisant le non documenté
GeoDataFrame.from_features()
plutôt que de passer directement le GeoJSON au constructeur GDF:Production
Le GeoDataFrame résultant a la colonne de géométrie correctement définie et toutes les colonnes comme je m'y attendrais, sans avoir besoin de désincorporer des FeatureCollections
la source