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不包含的特征和源shape文件的模式,但坐标系是未定义的(<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从各种来源和数据集构造和坐标系信息是从来没有出现在输出数据集。

有人遇到过这个问题吗?有人可以测试吗?

Answers:


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(),其签名如下所示:

在此处输入图片说明

使用geopandas读取/写入文件时,您需要显式传递crs_wkt值。


1
感谢您发布此信息。令人惊讶的是,我再也无法重现该问题。运行上面发布的代码时,我确实获得了.prj有关的信息的文件crs。可能是因为我已升级fionafiona 1.7.0 np110py27_2
Alex Tereshenkov

不幸的是,新版本中仍然存在该问题。我有geopandas 0.4.1和fiona 1.8.4。
Vaiaro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.