GeoPandas - GeoData 不与 Shapefile 地图重叠

GeoPandas - GeoData not overlapping Shapefile map

我正在尝试将一些从 geopandas.GeoDataFrame 转换为 shapely.geometry.Point 对象的 lat/long 数据映射到从 here 下载的 UK shapefile。提取后有 3 个 .shp 文件,每个文件都会出现以下问题。

以下是我的代码:

import geopandas as gpd

geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])]
crs = {'init': 'epsg:4326'}
geo_df = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)

ukmap = gpd.read_file("..\gb_1km.shp")
fig, ax = plt.subplots(figsize=(6,6))
ukmap.plot(ax=ax) #check map
geo_df.plot(ax=ax, markersize=20, color='blue', marker = 'o', label = 'C')

输出如下所示:

在没有背景 shapefile 的情况下,几何图如下所示:

为什么会发生这种情况,我该如何解决?谢谢

编辑:epsg = 27700

回答得更详细一点,因为这看起来很清楚...

在生成 geo_df 的代码中,您指定了 'epsg:4326'crs,并且根据您的代码,您使用的是纬度和经度。通过查看 EPSG 4326 可以确认这一点,它将 CRS 的边界指定为 [-180, -90, 180, 90]。

我下载并阅读了您链接的文件。此代码:

uk_10km = gpd.read_file(r'/Users/brendancox/Downloads/Great_Britain_shapefile/gb_10km.shp')
uk_10km.crs

returns

{'init': 'epsg:3035'}

EPSG 3035表示其单位为米。 WGS84 范围 是 [-10.6700, 34.5000, 31.5500, 71.0500],但是 投影范围 是 [2426378.0132, 1528101.2618, 6293974.6215, 5442513]。

因此,当您将 geo_df 绘制到 UK shapefile 上时,它会与 ukmap crs 对齐,将其放在底角。

鉴于 EPSG 4326 适用于整个地球,而您关注的是英国,我建议使用 UK-specific 投影。 EPSG 3035 似乎适用于整个欧洲,因此您可能会找到一个 UK-specific 投影,使用 geopandas.GeoDataFrame.to_crs().

将您的两个形状文件转换成该投影

可重现的例子

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
world.to_crs(epsg='3035', inplace=True)
fig, ax = plt.subplots(figsize=(10,8))
world.plot(ax=ax)
cities.plot(ax=ax, color='red')
plt.show()

这显示了 re-projecting EPSG 3035 的 built-in world 形状如何增加比例,并使 cities 形状出现在 (0, 0) -- 在这种情况下,在地图的中心。