【问题标题】:GeoPandas - GeoData not overlapping Shapefile mapGeoPandas - GeoData 不与 Shapefile 地图重叠
【发布时间】:2019-07-02 20:11:27
【问题描述】:

我正在尝试将一些从 geopandas.GeoDataFrame 转换为 shapely.geometry.Point 对象的纬度/经度数据映射到从 here 下载的英国 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_dfukmapcrs 是否相同?根据您的情节,似乎它们可能不是。

标签: python-3.x pandas gis shapefile geopandas


【解决方案1】:

回答得更详细一点,因为这似乎很清楚......

在生成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

返回

{'init': 'epsg:3035'}

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

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

鉴于 EPSG 4326 是针对全球的,并且您关注的是英国,我建议使用英国特定的投影。 EPSG 3035 似乎适用于整个欧洲,因此您可能会使用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()

这显示了如何将内置的 world 形状重新投影到 EPSG 3035 来增加比例,并使 cities 形状出现在 (0, 0) 附近的一个小簇中——在这种情况下,在地图中心。

【讨论】:

  • EPSG:27700 是首选的 GB 投影
  • 感谢您的回复和 cmets。对 UK 使用 epsg = 27700,一些进展如 OP 中的第三张图表所示 - UK shapefile 现在居中,但 Point 对象仍被压缩到一个点。我怀疑这是因为坐标尚未对齐。第二个图形,OP,轴以黑白方式运行 -8 和 0 (X),50 到 58 (Y),而第三个图形,OP,轴以黑白方式运行 -250000 和 750000 (X),-250000 到 150000 (Y) .任何想法如何同步它们?
  • @shanlodh 看起来是同一个问题:由于坐标系不同,点对象都聚集在 (0,0) 周围,而整体 UK 形状是针对较大的值绘制的。您是否将 both 形状文件转换为相同的 CRS?如果您还没有,请阅读 geopandas 页面Managing Projections
  • 是的,我执行了以下操作并检查了 crs:geo_df = gpd.GeoDataFrame(df, crs={'init': 'epsg:27700'}, geometry=geometry) geo_df.crs #prints {'init': 'epsg:27700'} 但输出与 OP 中的图 3 保持不变。我还注意到 geo_df 中 type(Point) 列中的值没有改变,我认为我们希望这些值在英国 shapefile 轴值的范围内?
  • 很高兴你已经成功了。回复:速度:您可能想尝试使用不太详细的形状文件,同时让代码正常工作,然后在其他所有内容都排序后切换到更详细的形状文件。例如,链接中的 10km 形状文件约为 200 kb,而 1km 形状文件约为 19 MB——我认为,使用 10km 文件应该可以显着加快代码速度,但这也可能取决于信息量在您的 geo_df 数据框中。
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多