GeoPandas为点设置坐标参考系(CRS)

36

给定以下 GeoDataFrame:

h=pd.DataFrame({'zip':[19152,19047],
               'Lat':[40.058841,40.202162],
               'Lon':[-75.042164,-74.924594]})
crs='none'
geometry = [Point(xy) for xy in zip(h.Lon, h.Lat)]
hg = GeoDataFrame(h, crs=crs, geometry=geometry)
hg

       Lat          Lon     zip     geometry
0   40.058841   -75.042164  19152   POINT (-75.042164 40.058841)
1   40.202162   -74.924594  19047   POINT (-74.924594 40.202162)

我需要像设置另一个GeoDataFrame一样设置CRS(就像这样):

c=c.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")

我尝试过这个:

crs={'init': 'epsg:3857'}

和这个:

hg=hg.to_crs("+init=epsg:3857 +ellps=GRS80 +datum=GGRS87 +units=mi +no_defs")

...但没运气。

一些重要的注意事项:

  1. 另一个GeoDataFrame使用以上.to_crs方法有效的原因是它来自一个形状文件,其几何列是多边形而不是点。 应用.to_crs方法后,其 'geometry' 值如下所示:

    POLYGON ((-5973.005380655156 3399.646267693398... 而当我尝试将其应用于hg GeoDataFrame时,它们仍然看起来像常规的经纬度坐标。

  2. 如果这样行得通,我将连接这些点与多边形GeoDataFrame以便同时绘制两者(点在多边形上方)。

  3. 当我尝试先连接GeoDataFrames,然后同时对点和多边形行应用.to_crs方法时,我会出现以下错误:

    ValueError: Cannot transform naive geometries. Please set a crs on the object first.

提前感谢您!

3个回答

69

Geopandas API已经过清理,现在可以正常使用。请确保使用最新稳定版本并阅读文档

使用GeoDataFrame的EPSG代码设置CRS就像这样简单:

gdf.set_crs(epsg=4326, inplace=True)

gdf是一个geopandas.geodataframe.GeoDataFrame。要注意明确指定inplace参数!

所以在上面的例子中,应该是:

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

df = pd.DataFrame({'zip':[19152,19047],
               'Lat':[40.058841,40.202162],
               'Lon':[-75.042164,-74.924594]})

geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
gdf = GeoDataFrame(df, geometry=geometry)

gdf.set_crs(epsg=4326, inplace=True)
# ^ comment out to get a "Cannot transform naive geometries" error below

# project to merkator
gdf.to_crs(epsg=3395)

     zip        Lat        Lon                          geometry
0  19152  40.058841 -75.042164  POINT (-8353655.485 4846992.030)
1  19047  40.202162 -74.924594  POINT (-8340567.652 4867777.107)

2
GeoDataFrame(df, geometry=geometry, crs='EPSG:4326') 也可以工作。 - Ufos
@JanPisl,它可以在最新的稳定版本的geopandas(0.8.2)上运行。您所说的“不再有效”是什么意思?您使用的Python和Geopandas版本是什么? - Ufos
1
好的,抱歉我的错!我使用的是0.7版本。让我纠正一下自己:如果你遇到了*** AttributeError: 'GeoDataFrame' object has no attribute 'set_crs',请尝试 shyam 的答案。 - Jan Pisl
任何方法都只使用Shapely吗? - Cristián Vargas Acevedo

14

在这种情况下,最好建议并编辑已经被接受的答案,或者至少留下评论。我已经更新了我的答案,更改应该在有人审核后生效。 - Ufos

2

答案一直在这里

hg=hg.to_crs(c.crs)

这将hg的crs设置为与c相同。

4
答案也是错误的。to_crs 是将一个CRS转换为另一个CRS,而 .crs = {...} 则设置初始的CRS。 - Ufos
@Ufos,你说“也”,是在暗示这个帖子中的所有答案都是错误的吗? - baxx
@baxx我的另一个评论被删除了,因为答案中的链接已经修复。评论是“链接已失效”。现在,“也”就没有意义了,但我无法编辑评论。 - Ufos
1
如果您检查目前可用的链接,您会发现to_crs被用于转换坐标,而不是设置CRS。 - Ufos

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