当前位置: 首页 > 知识库问答 >
问题:

在Geopandas中更改df CRS后向点添加坐标

齐昆
2023-03-14

基本上,这个想法是在不使用Qgis的情况下自动化一些工作流。

我无法获得与Geopandas中Qgis功能“向点添加坐标”类似的结果,该功能允许您在当前投影中获取点的x、y坐标,并为表创建新属性。

所以我有一套我玩过的积分。原始形状文件的CRS为epsg 2154(Lambert 93)。我需要以与谷歌地图兼容的格式获取纬度和经度。

谷歌使用epsg 3857谷歌地图。

points=pd.DataFrame({'Id':['001','002','003','geometry':['POINT(909149.3986619939 6881986.232659903)','POINT(909649.3986619939 6882486.232659903)','POINT(909149.3986619939 6882486.232659903)')

这个想法是切换到epsg 3857(wgs84),并从那里创建lat/long列,这些列将填充wgs84坐标,例如47.357955,1.7317783。

因此,我所做的是明显地改变CRS:pointswgs84=points.to_CRS(espg=3857)

然后

pointswgs84['lon']=pointswgs84.geometry.x

pointswgs84['lat']=pointswgs84.geometry.y

但是我的lat/long列会被对应于原始点数据框的坐标填充:

points=pd.DataFrame({'Id':['001','002','003','geometry':['POINT(909149.3986619939 6881986.232659903)','POINT(909649.3986619939 6882486.232659903)','long':['689149.3986619939 6882486.232659903','6882486.232659903','lat':['909149.3986619999','909649.3986619999','909149.3986619999']})

看起来我在这里遗漏了一些东西,但因为我是Python新手

谢谢你的帮助。

共有2个答案

相俊迈
2023-03-14

好了,问题解决了。这是一个简单的espg问题。如果这能帮助像我这样的新手,下面是一个解决方案:

即使谷歌使用espg 3857,如果你需要将你的点的X,Y转换为可以利用的东西(如网址参数),你也需要使用espg 4326。

然后你会得到你的长lat正确的方式。如5.859162,49.003710.

因此:

步骤1:将您的原始shapefile转换为espg 4326

points.to_crs({'init':'epsg: 4326'})

步骤2:只需提取x和y并将它们添加到新列中

pointswgs84['lon']=pointswgs84.geometry.x

pointswgs84['lat']=pointswgs84.geometry.y

漆雕奇
2023-03-14

您可以尝试:

import geopandas as gpd
from shapely.geometry import Point

points = pd.DataFrame({'Id': ['001', '002', '003'],
                       'geometry': [Point(909149.3986619939, 6881986.232659903), Point(909649.3986619939, 6882486.232659903), Point(909149.3986619939, 6882486.232659903)]})

gdf = gpd.GeoDataFrame(points, crs={'init': 'epsg:2154'}, geometry=points.geometry) # https://epsg.io/2154
gdf.geometry = gdf.geometry.to_crs({'init': 'epsg:3857'}) # https://epsg.io/3857

print(gdf)

结果:

    Id                                     geometry
0  001   POINT (652238.9846394559 6275490.88115861)
1  002  POINT (653026.8173626668 6276225.689838496)
2  003  POINT (652266.5262486706 6276253.346635176)
 类似资料:
  • 我有一个gejson文件,它由覆盖着六边形多边形的纽约市组成,我把它读进了geopandas数据框。我希望在数据框的图中添加Stmen TonerLite底图。但是,我无法复制与这里的工作示例相同的结果-https://geopandas.org/gallery/plotting_basemap_background.html 我在下面给出了相关数据帧的代码和crs的一个小示例: 我得到了一个没有

  • 我正在尝试更改geopandas数据帧的CRS。目前的CRS是: 当我尝试dfTrans.to_crs('epsg:4326')时,我得到以下错误: 对于pyproj中的一个简单命令,pyproj.CRS.from_epsg(4326),我得到了相同的错误: 我不知道发生了什么,但似乎有一个底层函数调用一个不存在的列。有没有办法解决这个问题?

  • 问题内容: LibGDX具有一个坐标系统,其中(0,0)在左下角。(就像这张图片: http //i.stack.imgur.com/jVrJ0.png) 这让我无法自拔,主要是因为我要移植使用常规坐标系(其中0,0位于左上角)制作的游戏。 我的问题: 有没有简单的方法可以更改此坐标系? 问题答案: 如果您使用相机(应使用),则更改坐标系非常简单: 如果您使用TextureRegions和/或Te

  • 我试图绘制一个形状文件作为点Folium地图,但拉我的头发试图得到正确的投影。该数据是在EPSG: 28992系统,RD新坐标系。这是一个投影坐标系,因此它给出了米的坐标。要在folium贴图上绘制此图,我需要将其转换为EPSG: 3857,如果我是正确的,它可以与度数一起工作。不幸的是,我得到了完整的废话后,转换它与函数。 首先,我加载数据: 显示以下内容: 这是正确的。它还具有正确的CRS,如

  • 问题内容: 我的问题是,将一行添加到DataFrame会更改列的dtype: 我将dtype特别指定为int32(即’i4’),可以看出: 但是,添加一行会将dtype更改为float64: 我尝试指定添加的值的dtype: 但这也不起作用。有没有不使用返回新对象的函数的解决方案? 问题答案: 放大分为两个阶段,首先将a放在该列中,然后将其分配,这就是为什么要强制它的原因。我将其放在错误/增强列表

  • 我试图向ArrayList对象添加构造函数有3个参数(int,int,hashset)的对象。当我添加一个新对象时,哈希集中的值会发生某种变化,所以我添加了错误的值。例如,我创建3个对象,添加这3组整数: 但object会收到这些: 我不明白为什么集合会改变其值。这是函数代码: 在这段代码中我: > 获取对象的ArrayListallIndexedItems,描述文本中的单词(文本在mysql表中