Python 如何正确地重新投影具有多个几何柱的geodataframe?

Python 如何正确地重新投影具有多个几何柱的geodataframe?,python,geopandas,reprojection-error,Python,Geopandas,Reprojection Error,里面说 GeoDataFrame也可能包含其他带有几何(形状)对象的列,但一次只能有一列是活动几何体。要更改哪个列是活动几何图形列,请使用set\u geometry方法 如果目标是灵活地将这些不同列中的几何数据重新投影到一个或多个其他坐标参考系,我想知道如何使用这样的地理数据框。这是我试过的 初试 到目前为止,一切顺利。如果我想将geom2设置为geometry列,并重新投影该列,则会出现问题: #Not working: setting geometry and reprojecting f

里面说

GeoDataFrame
也可能包含其他带有几何(形状)对象的列,但一次只能有一列是活动几何体。要更改哪个列是活动几何图形列,请使用
set\u geometry
方法

如果目标是灵活地将这些不同列中的几何数据重新投影到一个或多个其他坐标参考系,我想知道如何使用这样的地理数据框。这是我试过的

初试 到目前为止,一切顺利。如果我想将
geom2
设置为geometry列,并重新投影该列,则会出现问题:

#Not working: setting geometry and reprojecting for second time.
gdf = gdf.set_geometry('geom2')     #still in crs_lonlat...
gdf.crs                             #...but this still says crs_new...
Out: 'epsg:3395'

gdf = gdf.to_crs(crs_new)           #...so this doesn't do anything! (geom2 unchanged)
gdf
Out: 
                             geom1                      geom2
0  POINT (1001875.417 6948849.385)  POINT (8.00000 63.00000)
1  POINT (1001875.417 7135562.568)  POINT (8.00000 64.00000)
好的,显然,
gdf
.crs
属性在更改用作几何体的列时没有重置为其原始值-似乎没有为单个列存储crs。如果是这种情况,我认为对该数据帧使用重投影的唯一方法是回溯:开始-->选择列作为几何体-->将gdf重投影到crs_new-->使用/可视化/…-->将gdf重新投影回crs_lonlat-->转到启动。如果我想在一个图中同时显示两列,这是不可用的

第二次尝试 我的第二次尝试是,通过将上面脚本中的相应行更改为:

gdf = gpd.GeoDataFrame()
gdf['geom1'] = gpd.GeoSeries([Point(9,53), Point(9,54)], crs=crs_lonlat)
gdf['geom2'] = gpd.GeoSeries([Point(8,63), Point(8,64)], crs=crs_lonlat)
然而,很快就清楚了,尽管初始化为
GeoSeries
,但这些列是普通的
pandas
系列
,没有
。crs
属性,与
GeoSeries
的做法相同:

gdf['geom1'].crs
AttributeError: 'Series' object has no attribute 'crs'

s = gpd.GeoSeries([Point(9,53), Point(9,54)], crs=crs_lonlat)
s.crs
Out: 'epsg:4326'
这里有我遗漏的东西吗?

唯一的解决方案是,事先决定“最终”crs,并在添加列之前进行所有重投影吗?就像这样

gdf = gpd.GeoDataFrame(crs=crs_new)
gdf['geom1'] = gpd.GeoSeries([Point(9,53), Point(9,54)], crs=crs_lonlat).to_crs(crs_new)
gdf['geom2'] = gpd.GeoSeries([Point(8,63), Point(8,64)], crs=crs_lonlat).to_crs(crs_new)
#no more reprojecting done/necessary/possible! :/

…然后,当需要另一个crs时,从头开始重建整个
gdf
?这不可能是预期的使用方式。

不幸的是,目前无法实现预期的行为。由于包中的限制,
geopandas
目前不适用于此用例,如中所示

我的解决方法是根本不使用
GeoDataFrame
,而是将一个普通的
pandas
DataFrame
与几个单独的
geopandas
GeoSeries
组合起来,用于非形状数据。
GeoSeries
每个都有自己的crs,可以在必要时正确地重新投影

gdf = gpd.GeoDataFrame(crs=crs_new)
gdf['geom1'] = gpd.GeoSeries([Point(9,53), Point(9,54)], crs=crs_lonlat).to_crs(crs_new)
gdf['geom2'] = gpd.GeoSeries([Point(8,63), Point(8,64)], crs=crs_lonlat).to_crs(crs_new)
#no more reprojecting done/necessary/possible! :/