地理数据处理库 Geopandas - ValueError: 无法转换不带参考坐标系的几何体,请先在对象上设置 crs

6

请问有人可以解释一下这个为什么不起作用吗?

enter image description here

所涉及的 shapefile 文件在此处,代码中读取的方式如下:

shp=gpd.read_file("Microdatos_Censo_2017_Manzana/Microdatos_Censo_2017_Manzana.shp")
shp.crs="epsg:4326"
breakpoint()
shp=shp.to_crs(epsg=3857)## Error here

我不明白正在发生什么。我有 Python 3.8.5geopandas 0.8.1pyproj 2.6.1.post1。不确定还有哪些包的版本很重要。

谢谢!


编辑:

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

2.- 这与已发布的重复问题不同,因为如您在图像上所见, shp.crs 的打印语句返回正确的 crs 信息,而不是 None。 我定义了一个 crs,但是 to_crs 没有起作用。


这个回答解决了你的问题吗?[从点生成geopandas数据框,然后对gpd进行投影,出现错误:无法转换naive几何图形。请先在对象上设置一个crs] (https://stackoverflow.com/questions/61050942/make-geopandas-dataframe-from-points-then-project-the-gpd-got-error-cannot-tr) - sophros
2
你可以尝试使用 shp = shp.set_crs(4326) 替换第二行代码吗? - martinfleis
1
对我来说,您的代码片段可以使用链接的Shapefile,在使用相同版本的库的情况下正常工作。您能展示一个完整的复现者吗?(包括导入到回溯的完整代码)另外,您是如何安装geopandas的? - joris
是的,抱歉!我链接了错误的shapefile,我正在使用4个shapefile,所以可能混淆了哪一个是有问题的!现在已经链接了正确的shapefile。 - M.O.
使用 set_crs 而不是 .crs= 可以解决这个问题!有什么原因吗? - M.O.
2个回答

5

在您的代码中:

shp = gpd.read_file("Comunas/Comunas.shp")

让您将shp作为GeoDataFrame获得。

接下来,这行代码:

shp.crs = "epsg:4326"

仅更改了shp的属性,但不对地理数据框执行坐标转换。

然后

shp = shp.to_crs(epsg=3857)

导致错误发生。

从错误消息可以明显看出,导致错误的命令需要一个正确的对象作为输入值。根据以下方法签名,epsq=3857中的值是错误的。

.to_crs(crs=None, epsg=None, inplace=False)

这种方法的适当使用方式可以是:

.to_crs({'init': 'epsg:4326'})
.to_crs(crs={'init': 'epsg:4326'})
.to_crs(epsg='4326')

对于您的特定数据集,要将原始GeoDataFrame(epsg:3857)转换为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()

epsg3857comunas0的图片)

comunas4326 = comunas0.to_crs({'init': 'epsg:4326'})
print(comunas4326.crs)                   #{'init': 'epsg:4326'}
comunas4326.plot()

epsg4326 (comunas4326 的图片)

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

编辑

使用由OP更新的新形状文件绘制额外的图表。

epsg:3857

new3857

epsg:4326

new4326


很抱歉,这个无法运行。我链接了错误的shp文件。正确的链接是https://geoine-ine-chile.opendata.arcgis.com/datasets/54e0c40680054efaabeb9d53b09e1e7a_0。非常抱歉。 - M.O.
@M.O. 使用新的shapefile Manzana_2017_2.shp,使用我提出的步骤也可以正常工作。 - swatchai
你提出的步骤和我之前尝试过的一样,但是它们对我不起作用。但是使用 set_crs 而不是 .crs= 就可以解决问题。虽然这两个应该是等价的,但为什么这样做能够奏效并不是很清楚。 - M.O.
但是我可以获取图表。 - swatchai
1
你的回答节省了我很多时间。谢谢。 - Miss.Alpha

0
在我的情况下,我试图投影LineStrings,但不起作用。我必须先投影点,然后创建LineStrings。

这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - lprakashv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接