GeoPandas to_file () сохраняет GeoDataFrame без системы координат

13

я имею

  • GeoPandas 0.2.1 py27_0
  • Фиона 1.7.0 np110py27_1
  • Python 2.7.10

установлен в среде Anaconda 2-4.1.1-Windows-x86. Я могу построить GeoDataFrame, читая входные наборы данных и работать с данными, но сохранение выходного набора данных не сохраняет систему координат.

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

Он world_out.shpсодержит объекты и схему исходного шейп-файла, но система координат не определена ( <Unknown>). world_out.prjФайл 0 KB и не содержит ничего.

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

Я проверил, чтобы выполнить эту операцию с использованием чистой Fiona, и она отлично работает, сохраняя crsинформацию:

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)

CitiesFiona.prjФайл действительно содержит информацию о системе координат.

Таким образом, похоже, что GeoPandas не может читать / записывать crsфрейм данных в выходной набор данных при вызове to_file()метода. Я пытался дозвониться to_file()на GeoDataFramesпостроенном из различных источников и наборов данных и информация о системе координат никогда не присутствует в выходном наборе данных.

Кто-нибудь сталкивался с этим вопросом раньше? Кто-нибудь может это проверить?

Алекс Терешенков
источник

Ответы:

11

Я сталкивался с таким поведением раньше.

Вам необходимо явно передать хорошо известную текстовую строку (crs_wkt) в to_file()метод. Затем будет передана строка fiona.open(), которая записывает файл .prj.

Используя ваш пример кода, сделайте что-то вроде этого:

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)

должен производить: введите описание изображения здесь

Функции read_file()и to_file()просто служат функциями оболочки. Они называют fiona.open(), чья подпись показана ниже:

введите описание изображения здесь

Вам нужно явно передать значение crs_wkt при чтении / записи файлов с геопандами.

Nxaunxau
источник
1
Спасибо за публикацию этого. Удивительно, но я больше не могу воспроизвести проблему. При запуске кода, который я разместил выше, я получаю .prjфайл с информацией о crs. Это может быть потому, что я обновился fionaдо fiona 1.7.0 np110py27_2.
Алексей Терешенков
К сожалению, в новых версиях все еще есть проблема. У меня есть геопанда 0.4.1 и Фиона 1.8.4.
Вайаро