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) -- 在这种情况下,在地图的中心。
我正在尝试将一些从 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) -- 在这种情况下,在地图的中心。