GeoPandas to_file () salva GeoDataFrame sem sistema de coordenadas

13

eu tenho

  • GeoPandas 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

instalado no ambiente Anaconda 2-4.1.1-Windows-x86. Eu sou capaz de construir GeoDataFramelendo conjuntos de dados de entrada e operar os dados, mas salvar um conjunto de dados de saída não preserva o 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')

Ele world_out.shpcontém os recursos e o esquema do shapefile de origem, mas o sistema de coordenadas é indefinido ( <Unknown>). O world_out.prjarquivo tem 0 KB e não contém nada.

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

Eu testei para executar esta operação usando Fiona puro e funciona bem, preservando as crsinformações:

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)

O CitiesFiona.prjarquivo contém as informações sobre o sistema de coordenadas.

Portanto, parece que o GeoPandas não é capaz de ler / gravar crso quadro de dados no conjunto de dados de saída ao chamar o to_file()método. Eu tentei chamada to_file()on GeoDataFramesconstruída a partir de várias fontes e conjuntos de dados e as informações de coordenadas sistema nunca esteve presente no conjunto de dados de saída.

Alguém já encontrou esse problema antes? Alguém pode testar isso?

Alex Tereshenkov
fonte

Respostas:

11

Eu já me deparei com esse comportamento antes.

Você precisa passar explicitamente a sequência de texto conhecida (crs_wkt) para o to_file()método A sequência será passada para fiona.open(), que grava o arquivo .prj.

Usando seu código de exemplo, faça algo assim:

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)

deve produzir: insira a descrição da imagem aqui

As funções read_file()e to_file()simplesmente servem como funções de invólucro. Eles chamam fiona.open(), cuja assinatura é mostrada abaixo:

insira a descrição da imagem aqui

Você precisa transmitir explicitamente um valor crs_wkt ao ler / gravar arquivos com geopandas.

Nxaunxau
fonte
1
Obrigado por postar isso. Surpreendentemente, não posso mais reproduzir o problema. Ao executar o código que publiquei acima, recebo o .prjarquivo com as informações sobre o arquivo crs. Pode ser porque eu atualizei fionapara fiona 1.7.0 np110py27_2.
Alex Tereshenkov
Infelizmente ainda existe o problema nas versões mais recentes. Eu tenho geopandas 0.4.1 e fiona 1.8.4.
Vaiaro 6/11/19