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?

Alex Tereshenkov
la source

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.

Nxaunxau
la source
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