GeoPandas to_file () guarda GeoDataFrame sin sistema de coordenadas

13

yo 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 GeoDataFrameleyendo conjuntos de datos de entrada y operar los datos, pero guardar un conjunto de datos de salida no 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')

La world_out.shpQué contiene las características y el esquema del archivo de forma fuente, pero no está definido el sistema de coordenadas ( <Unknown>). El world_out.prjarchivo tiene 0 KB y no contiene nada.

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

He probado para realizar esta operación usando Fiona puro y funciona bien, conservando la crsinformació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)

El CitiesFiona.prjarchivo contiene la información sobre el sistema de coordenadas.

Entonces, parece que GeoPandas no puede leer / escribir crsel marco de datos en el conjunto de datos de salida cuando se llama al to_file()método. He intentado llamar to_file()en GeoDataFramesconstruido a partir de varias fuentes y conjuntos de datos y la información del sistema de coordenadas no estaba presente en el conjunto de datos de salida.

¿Alguien se ha encontrado con este problema antes? ¿Alguien puede probar esto?

Alex Tereshenkov
fuente

Respuestas:

11

Me he encontrado con este comportamiento antes.

Debe pasar explícitamente la conocida cadena de texto (crs_wkt) al to_file()método. La cadena se pasará a fiona.open(), que escribe el archivo .prj.

Usando su código de muestra, 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: ingrese la descripción de la imagen aquí

Las funciones read_file()y to_file()simplemente sirven como funciones de contenedor. Llaman fiona.open(), cuya firma se muestra a continuación:

ingrese la descripción de la imagen aquí

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

Nxaunxau
fuente
1
Gracias por publicar esto. Sorprendentemente, no puedo reproducir el problema por más tiempo. Cuando ejecuto el código que publiqué anteriormente, obtengo el .prjarchivo con la información sobre crs. Podría ser porque me actualicé fionaa fiona 1.7.0 np110py27_2.
Alex Tereshenkov
Desafortunadamente, todavía existe el problema en las versiones más recientes. Tengo geopandas 0.4.1 y fiona 1.8.4.
Vaiaro