【问题标题】:Drawing a hex grid over a Geopandas map在 Geopandas 地图上绘制六角网格
【发布时间】:2026-02-10 06:45:01
【问题描述】:

我正在尝试在世界地图上绘制一个十六进制网格。后者可以通过 Geopandas 轻松完成:

import geopandas
import matplotlib.pyplot as plt

world = geopandas.read_file(geopandas.datasets.get_path("naturalearth_lowres"))
world.plot()
plt.savefig("world.png")
plt.show()

对于前者,我觉得H3应该可以做到。我已经安装了 H3 以及它的 Python 绑定,现在可以import h3,但是......好吧,我目前可能处于“第 2 步:绘制 effing owl 的其余部分”阶段,或者可能只是我缺少的一两行代码。搜索 H3 文档和教程,发现很多关于六边形优点的讨论,关于如何使用 H3 进行各种微妙计算,但我还没有找到任何指出如何绘制实际六边形网格的内容。

那么:如何使用 H3 在 Geopandas 地图上绘制六角网格? (就此而言,H3 确实是这项工作的最佳工具吗?)

【问题讨论】:

  • 以下pages 可能有用。供您参考。
  • 您也可以考虑使用H3-Pandas 方便地使用 H3 六边形并绘制它们。参见例如this answer 实际上使用相同的数据集。虽然如果您尝试绘制穿过反子午线的六边形,您可能需要考虑this problem

标签: python matplotlib geopandas h3


【解决方案1】:

H3 真的是这项工作的最佳工具吗?

这取决于您想要六角网格的用途。 H3 优于“标准”六角网格的优势在于,大多数六角网格是在投影地图上绘制的正六边形,因此每个六角单元的地理区域根据地图上单元的投影和位置而有很大差异。这对于可视化来说仍然足够了,而且它可能比 H3 更快、更容易推理。

H3 使用全局网格,其中所有单元格的面积都相等(大致 - 全球范围内的变化约为 2 倍;请参阅 this mapthis table)。根据您的用例,这可能会给您带来更好的结果。

要以特定分辨率绘制整个网格,您可以使用h3.get_res0_indexes 获取所有基本单元格,然后使用h3.h3_to_children 将它们扩展到所需的分辨率,例如

[cell for base_cell in h3.get_res0_indexes() 
  for cell in h3.h3_to_children(base_cell, res)]

然后你可以使用h3.h3_to_geo_boundary 来获取每个单元格的边界。

【讨论】: