GeoPandas to_file () enregistre GeoDataFrame sans système de coordonnées


13

j'ai

  • GeoPandas 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

installé dans l'environnement Anaconda 2-4.1.1-Windows-x86. Je suis capable de construire GeoDataFrameen lisant des jeux de données d'entrée et d'exploiter les données, mais l'enregistrement d'un jeu de données de sortie ne préserve pas le système de coordonnées.

import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.to_file(driver='ESRI Shapefile',filename=r'C:\GIS\Temp\world_out.shp')

Le world_out.shpcontient les fonctionnalités et le schéma du fichier de formes source, mais le système de coordonnées n'est pas défini ( <Unknown>). Le world_out.prjfichier est de 0 Ko et ne contient rien.

out = gpd.read_file(r'C:\GIS\Temp\world_out.shp')
print out.crs
>>> {}

J'ai testé pour effectuer cette opération en utilisant du Fiona pur et cela fonctionne très bien, en préservant les crsinformations:

import fiona

datasrc_path = r'C:\Program Files (x86)\ArcGIS\Desktop10.4\TemplateData\TemplateData.gdb'

with fiona.drivers():
    with fiona.open(datasrc_path,layer='cities') as source:
        meta = source.meta
        meta['driver'] = 'ESRI Shapefile'
        meta['layer'] = source.name

        with fiona.open(r'C:\GIS\CitiesFiona.shp', 'w', **meta) as sink:
            for f in source:
                sink.write(f)

Le CitiesFiona.prjfichier contient les informations sur le système de coordonnées.

Il semble donc que GeoPandas ne puisse pas lire / écrire crsla trame de données dans le jeu de données de sortie lors de l'appel de la to_file()méthode. Je l' ai essayé d' appeler to_file()le GeoDataFramesconstruit à partir de diverses sources et des ensembles de données et les informations du système de coordonnées n'a jamais été présent dans l'ensemble de données de sortie.

Quelqu'un a-t-il déjà rencontré ce problème? Quelqu'un peut-il tester cela?

Réponses:


11

J'ai déjà rencontré ce comportement auparavant.

Vous devez passer explicitement la chaîne de texte bien connue (crs_wkt) à la to_file()méthode. La chaîne sera ensuite transmise à fiona.open(), qui écrit le fichier .prj.

En utilisant votre exemple de code, faites quelque chose comme ceci:

ws = r"D:\temp_se"
prj_file = gpd.datasets.get_path('naturalearth_lowres').replace(".shp",".prj")
prj = [l.strip() for l in open(prj_file,'r')][0]
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
temp_shp = os.path.join(ws,"world_out.shp")
world.to_file(filename=temp_shp,driver='ESRI Shapefile',crs_wkt=prj)

devrait produire: entrez la description de l'image ici

Les fonctions read_file()et to_file()servent simplement de fonctions wrapper. Ils appellent fiona.open(), dont la signature est montrée ci-dessous:

entrez la description de l'image ici

Vous devez explicitement passer une valeur crs_wkt lors de la lecture / écriture de fichiers avec des géopandas.


1
Merci d'avoir posté ça. Étonnamment, je ne peux plus reproduire le problème. Lors de l'exécution du code que j'ai publié ci-dessus, j'obtiens le .prjfichier avec les informations sur le crs. C'est peut-être parce que je suis passé fionaà fiona 1.7.0 np110py27_2.
Alex Tereshenkov

Malheureusement, le problème persiste dans les versions plus récentes. J'ai des géopandas 0.4.1 et fiona 1.8.4.
Vaiaro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.