1

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

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

    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 接近,但我不在乎只要我能得到这个位置。

4

2 回答 2

1

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

于 2021-06-02T18:56:23.043 回答
0

当你填满整个地球时,你会得到穿过反子午线的 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 这样的平面地图绘图工具时,它对测地线或反子午线一无所知,而是在整个地球上绘制一条长直线(地图上最短的线,而不是地球上的最短线) ),穿过主经线。这是您在这里拥有的所有长的近水平线的来源。

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

于 2021-06-03T01:57:02.053 回答