15 votos

GeoPandas to_file() guarda GeoDataFrame sin sistema de coordenadas

Tengo

  • GeoPandas 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

instalado en el entorno Anaconda 2-4.1.1-Windows-x86. Puedo construir GeoDataFrame leyendo conjuntos de datos de entrada y operando los datos, pero al guardar un conjunto de datos de salida no se conserva el sistema de coordenadas.

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')

En world_out.shp contiene las características y el esquema del archivo shape de origen, pero el sistema de coordenadas no está definido ( <Unknown> ). En world_out.prj es 0 KB y no contiene nada.

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

He probado a realizar esta operación utilizando Fiona pura y funciona correctamente, conservando el crs información:

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)

En CitiesFiona.prj contiene información sobre el sistema de coordenadas.

Por lo tanto, parece como GeoPandas no es capaz de leer / escribir crs del marco de datos en el conjunto de datos de salida al llamar a la función to_file() método. He intentado llamar a to_file() en GeoDataFrames construidos a partir de diversas fuentes y conjuntos de datos, y la información del sistema de coordenadas nunca estaba presente en el conjunto de datos de salida.

¿Alguien se ha encontrado antes con este problema? ¿Puede alguien probarlo?

13voto

pd. Puntos 755

Ya me he encontrado antes con este comportamiento.

Es necesario pasar explícitamente la conocida cadena de texto (crs_wkt) a la función to_file() método. La cadena se pasará entonces a fiona.open() que escribe el archivo .prj.

Usando tu código de ejemplo, haciendo algo como esto:

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)

debe producir: enter image description here

En read_file() y to_file() sirven simplemente como funciones envoltorio. Llaman a fiona.open() cuya firma figura a continuación:

enter image description here

Es necesario pasar explícitamente un valor crs_wkt al leer/escribir archivos con geopandas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X