Uber h3 能否以六边形网格覆盖整个地球?

Can Uber h3 cover the entire globe in hexagonal grid?

Uber 发布了 h3,这是一个有效处理地理空间文件中大数据的框架。使用 h3,我尝试获取如图所示的六边形网格位置的位置。 (https://eng.uber.com/h3/)

我从下面的代码中得到了六边形网格的位置。然后我把它画在二维地图上,看看它是否覆盖了整个地球。但是,我在边界(-90°、90°、-180°、180°)上没有得到有效的六边形。而且它似乎并没有覆盖整个地球。 (hexagonal grid)

    from h3 import h3
    import folium
    
    # Polyfill a Geo Json with hexagons
    geoJson1 = {'type': 'Polygon', 'coordinates': [[[90,-180],[90,0],[-90,0],[-90,-180]]]}
    geoJson2 = {'type': 'Polygon', 'coordinates': [[[90,0],[90,180],[-90,180],[-90,0]]]}
    hexagons = list(h3.polyfill(geoJson1, 1)) + list(h3.polyfill(geoJson2, 1))
    # Plot hexagons
    polylines = []
    for hex in hexagons:
        polygons = h3.h3_set_to_multi_polygon([hex], geo_json=False)
        outlines = [loop for polygon in polygons for loop in polygon]
        polyline = [outline + [outline[0]] for outline in outlines][0]
        polylines.append(polyline)
    base = folium.Map([0,0], zoom_start=2, tiles='cartodbpositron')
    for polyline in polylines:
        m = folium.PolyLine(locations=polyline, weight=1, color='black')
        base.add_child(m)
    m.save('test.html')

我想要覆盖整个地球的六边形的位置。在这种情况下,我接近使用h3,但我不在乎如何只要我能得到位置。

是的,H3 覆盖了整个地球。您在该图像中看到的是渲染伪影 - 根据您在平面投影中渲染全局网格的方式,您可能会在两极或整个反子午线上得到类似的伪影。参见例如this map H3 的投影在反子午线上正确呈现,尽管它在两极周围仍然存在一些问题。

当你填满整个地球时,你会得到穿过反子午线的 H3 多边形。这些将在东半球(经度> 0)和西半球(经度<0)都有顶点。您可以使用例如

找到这样的多边形
for line in polylines:
  if any(p[1] > 0 for p in line) and any(p[1] < 0 for p in line):
    print(line)

考虑例如此列表的一个边缘:

(-65.7243888731199, -176.62192487031285), (-66.42506103952591, 175.12130159942038)

它跨越经度 -176 到 173。H3 假设顶点与测地线(最短)路径相连,即在这种情况下是一条穿过反子午线的短路径。因此,多边形应该同时出现在地图的最左侧和最右侧。但是,当您将其提供给像 Folium 这样的平面地图绘图工具时,它对测地线边缘或反子午线一无所知,而是在整个地球上绘制一条长直线(地图上的最短线,而不是 globe) 上穿过主子午线的最短线。这是您在此处看到的所有近乎水平的长线的来源。

根据您的需要,有多种解决方案。常见的选择是固定穿过反子午线的每个多边形,将其绘制在左侧或右侧。假设您将所有这些多边形向右移动 - 然后将 360 添加到所有负经度,将 -176 替换为 184。您将得到一个 Folium 应该能够“正确”绘制的小多边形,尽管它会突出到 180 的右侧经络(虽然我没有使用 Folium 的经验,但这是典型的行为)。