如何将 MULTIPOLYGON xy 几何转换为纬度和经度?

How to convert MULTIPOLYGON xy geometry to latitude and longitude?

我正在使用 python 模块 arcgis 下载 shapefile,位于此处:https://www.arcgis.com/home/item.html?id=2d5c785555aa4b0b946f1aa61c56274f

我已经按照文档将其提取到 pandas 数据框中:

from arcgis import GIS
import pandas as pd
gis = GIS(verify_cert=False,api_key=your_key)

# search for file by name which is National_LHO
search_result = gis.content.search(query="title:National_LHO", item_type="Feature Layer")

# get layer
layer = search_result[0].layers[0]

# dataframe from layer
df= pd.DataFrame.spatial.from_layer(layer)

# check it out
print(df.head())


   FID              LHO   Shape__Area  Shape__Length  \
0    1  Carlow/Kilkenny  7.053876e+09   5.924032e+05   
1    2   Cavan/Monaghan  8.858580e+09   7.801971e+05   
2    3            Clare  9.055446e+09   8.005301e+05   
3    4          Donegal  1.467971e+10   2.135710e+06   
4    5     Dublin North  1.076876e+09   3.327819e+05   

                                               SHAPE  
0  {"rings": [[[-747212.35980769, 6967909.5066712...  
1  {"rings": [[[-781459.713316924, 7249668.124932...  
2  {"rings": [[[-1083308.07544972, 6918940.329570...  
3  {"rings": [[[-912809.697847961, 7265617.367554...  
4  {"rings": [[[-674539.041086896, 7057323.867987...  

然后我将其转换为 geopandas 数据框:

import geopandas as gpd

gdf = gpd.GeoDataFrame(dc_df)


但是 CRS 信息看起来很奇怪。它说边界是 (-180.0, -90.0, 180.0, 90.0) 但几何坐标比那个高得多。

print(gdf.crs)

<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
print(gdf.head())

   FID              LHO   Shape__Area  Shape__Length  \
0    1  Carlow/Kilkenny  7.053876e+09   5.924032e+05   
1    2   Cavan/Monaghan  8.858580e+09   7.801971e+05   
2    3            Clare  9.055446e+09   8.005301e+05   
3    4          Donegal  1.467971e+10   2.135710e+06   
4    5     Dublin North  1.076876e+09   3.327819e+05   

                                            geometry  
0  MULTIPOLYGON (((-747212.360 6967909.507, -7459...  
1  MULTIPOLYGON (((-781459.713 7249668.125, -7813...  
2  MULTIPOLYGON (((-1083308.075 6918940.330, -108...  
3  MULTIPOLYGON (((-912809.698 7265617.368, -9127...  
4  MULTIPOLYGON (((-674539.041 7057323.868, -6748...  

有人告诉我,只需使用 to_crs('EPSG:4326') 即可将所有内容转换为纬度和经度,但这不起作用。

gdf.to_crs('EPSG:4326').head()

如您所见,它们仍在 xy 坐标中,而不是经度/纬度。

我想不通。我只想要经度和纬度多边形。

有没有人知道这样做?我正在失去理智,并为此花了几天时间。我不是地理专家pandas。

也许是一些有用的信息。我下载的数据有这个空间参考:Spatial Reference: 102100 (3857)

我在转换为地理数据框时尝试使用 3857,但出现错误。

gdf = gpd.GeoDataFrame(dc_df,crs='3857')

FutureWarning: CRS mismatch between CRS of the passed geometries and 'crs'. Use 'GeoDataFrame.set_crs(crs, allow_override=True)' to overwrite CRS or 'GeoDataFrame.to_crs(crs)' to reproject geometries. CRS mismatch will raise an error in the future versions of GeoPandas.

它没有转换,因为当您将普通 pandas 数据帧读入 geopandas 数据帧时,crs 信息丢失了

from arcgis import GIS
import pandas as pd
gis = GIS(verify_cert=False)

# search for file by name which is National_LHO
search_result = gis.content.search(query="title:National_LHO", item_type="Feature Layer")

# get layer
layer = search_result[0].layers[0]

# dataframe from layer
df= pd.DataFrame.spatial.from_layer(layer)

# check it out
# print(df.head())

import geopandas as gpd

gdf = gpd.GeoDataFrame(df)

如果你这样做 gdf.crs 它 returns 空的。

所以crs信息必须手动设置。如您所述,将其设置为 epsg 3857

gdf = gdf.set_geometry('SHAPE')
gdf = gdf.set_crs(epsg='3857')

现在你可以做到了

gdf.to_crs(epsg='4326').head()