Geopandas - ValueError:无法转换朴素的几何图形。请先在对象上设置crs

M.O*_*.O. 6 python python-3.x geopandas

有人可以解释一下这不起作用吗?

\n

在此输入图像描述

\n

有问题的形状文件在这里,在代码中它的读作是

\n
shp=gpd.read_file("Microdatos_Censo_2017_Manzana/Microdatos_Censo_2017_Manzana.shp")\nshp.crs="epsg:4326"\nbreakpoint()\nshp=shp.to_crs(epsg=3857)##\xc2\xa0Error here\n
Run Code Online (Sandbox Code Playgroud)\n

我只是不明白发生了什么。我有Python 3.8.5geopandas 0.8.1pyproj 2.6.1.post1。不确定哪些其他软件包对于了解其版本很重要。

\n

谢谢!

\n
\n

编辑:

\n

1.- 修复我弄错的 shapefile 链接。

\n

2.- 它与作为重复项发布的问题不同,因为正如您在图像上看到的,打印语句返回shp.crs正确的 crs 信息,而不是“无”。我定义了一个 crs 但to_crs不起作用。

\n

swa*_*hai 5

在你的代码中:

shp = gpd.read_file("Comunas/Comunas.shp")
Run Code Online (Sandbox Code Playgroud)

让你得到shp作为GeoDataFrame

接下来,该行

shp.crs = "epsg:4326"
Run Code Online (Sandbox Code Playgroud)

只改变 的属性shp,但不对geodataframe进行坐标变换。

然后

shp = shp.to_crs(epsg=3857)
Run Code Online (Sandbox Code Playgroud)

导致错误。

从错误消息中可以明显看出,导致错误的命令需要正确的object输入值。epsq=3857根据方法的签名,中的值是错误的,如下所示。

.to_crs(crs=None, epsg=None, inplace=False)
Run Code Online (Sandbox Code Playgroud)

该方法的正确使用可以是:

.to_crs({'init': 'epsg:4326'})
.to_crs(crs={'init': 'epsg:4326'})
.to_crs(epsg='4326')
Run Code Online (Sandbox Code Playgroud)

对于您的特定数据集,要将原始数据集 (epsg:3857) 的 CRS 转换GeoDataFrame为 epsg:4326,然后返回原始数据集,请执行以下步骤:

shp_file = './data/comunas/comunas.shp'  #(on my machine)
comunas0 = gpd.read_file(shp_file)
print(comunas0.crs)                      #{'init': 'epsg:3857'}
comunas0.plot()
Run Code Online (Sandbox Code Playgroud)

epsg3857 (的图像comunas0

comunas4326 = comunas0.to_crs({'init': 'epsg:4326'})
print(comunas4326.crs)                   #{'init': 'epsg:4326'}
comunas4326.plot()
Run Code Online (Sandbox Code Playgroud)

epsg4326 (的图像comunas4326

comunas3857 = comunas4326.to_crs(epsg='3857')  #back to original CRS
print(comunas3857.crs)                   #{'init': 'epsg:3857', 'no_defs': True}
Run Code Online (Sandbox Code Playgroud)

编辑

使用新形状文件的附加图(由 OP 更新)。

每股收益:3857

新3857

每股收益:4326

新4326