Geopandas to_file给出空白的prj文件

时间:2019-03-02 22:25:56

标签: projection shapefile geopandas

我正在尝试将GeoPandas用于(仅略微)更复杂的项目,但此刻我无法以投影的方式写出带有单个点的简单shapefile。

以下代码生成一个通常看起来不错的shapefile-但.prj为空:

import pandas as pd
from geopandas import GeoDataFrame
from shapely.geometry import Point

df=pd.read_csv("richmond.csv")
geometry = [Point(xy) for xy in zip(df.x, df.y)]
crs = {'init': 'epsg:4326'}
geo_df = GeoDataFrame(df, crs=crs, geometry=geometry)

geo_df.to_file("geopan.shp")

csv是2行2列(标题行,然后是lon和lat在第二行):

a really basic csv

我缺少明显的东西吗?我已经搜索了stackoverflow,geopandas文档等。所有这些似乎都暗示to_file()应该可以正常工作。

从长远来看,目标是为我的学生创建一些在实验室中使用的功能-一个功能是沿美国宽度/高度的纬度或经度绘制一条线,另一个功能是将其剪切为多边形(状态),以便学生可以轻松地了解每个状态中的最广范围,作为对处理空间数据的简要介绍。我试图避开arcpy,因为它是Python 2,并且我认为(并认为)我正在通过教他们使用Python 3的方式来做正确的事。我希望他们能够通过能够调试自己的方法来进行调试。虽然在Arc中打开了线,所以进行了此测试。

3 个答案:

答案 0 :(得分:1)

因此,在使用了此工具之后,我确定在当前版本的Anaconda下,问题出在Windows计算机上的crs = {'init': 'epsg:4326'}上。这在Mac上运行良好,但在我或我的学生的Windows系统上均不起作用。更改此行以使用proj4字符串crs = {'proj': 'latlong', 'ellps': 'WGS84', 'datum': 'WGS84', 'no_defs': True}可以正常工作。比实际的解决方案更多的是一种变通方法,但是,它似乎始终如一。

答案 1 :(得分:0)

我一直在使用fiona库中的from_epsg函数。

>>> from fiona.crs import from_epsg
>>> from_epsg(4326)
{'init': 'epsg:4326', 'no_defs': True}

我从来没有遇到任何问题。请记住,缺少一些局部预测,但这对您来说不是问题。

答案 2 :(得分:0)

Another user and I在使用fiona时也遇到了类似的问题,对我来说,问题是GDAL_DATA环境变量的设置不正确。在此重申我的答案:作为参考,我正在使用Anaconda,Spyder IDE,Fiona 1.8.4和Python 3.6.8,以及GDAL 2.3.3。

尽管Anaconda通常会在进入虚拟环境时设置GDAL_DATA变量,但使用诸如Spyder之类的其他IDE不会保留该变量,因此会导致fiona(我假设Geopandas)无法正确导出CRS的问题。

您可以通过显式设置GDAL_DATA变量之前和之后将EPSG转换为WKT转换来测试此修复程序。

未设置GDAL_DATA:

import os
print('GDAL_DATA' in os.environ)
from osgeo import osr
srs = osr.SpatialReference() # Declare a new SpatialReference 
srs.ImportFromEPSG(3413) # Import the EPSG code into the new object srs
print(srs.ExportToWkt()) # Print the result before transformation to ESRI WKT (prints nothing)

结果:

False

设置了GDAL_DATA:

import os
os.environ['GDAL_DATA'] = 'D:\\ProgramData\\Anaconda3\\envs\\cfm\\Library\\share\\gdal'
print('GDAL_DATA' in os.environ)
from osgeo import , osr
srs = osr.SpatialReference() # Declare a new SpatialReference 
srs.ImportFromEPSG(3413) # Import the EPSG code into the new object srs
print(srs.ExportToWkt()) # Print the result before transformation to ESRI WKT (prints nothing)

结果:

True
PROJCS["WGS 84 / NSIDC Sea Ice Polar Stereographic North",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",70],PARAMETER["central_meridian",-45],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","3413"]]