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

2024-09-29 20:21:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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,但我不在乎多久,只要我能得到这个职位


Tags: inimport网格地球fortypeh3polygon
2条回答

当你们填满整个地球时,你们会得到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的经验,但这是典型的行为)

是的,H3覆盖全球。您在该图像中看到的是渲染瑕疵-取决于您在平面投影中渲染全局网格的方式,您可能会在极点或反球面上获得类似瑕疵。参见例如this map了解H3的投影,该投影正确地呈现了反梅里迪亚,尽管它在极点周围仍然存在一些问题

相关问题 更多 >

    热门问题