【问题标题】:How to find the locations (indices whose lat long co-ordinates are stored in geo-json format) within 5 Km radius of a h3 index in h3-js?如何在h3-js中查找h3索引半径5公里内的位置(经纬度坐标以geo-json格式存储的索引)?
【发布时间】:2019-11-24 18:41:06
【问题描述】:

我正在创建一个超本地交付服务应用程序。只有在距离用户 5 公里范围内有商店的情况下,我才能收到订单。我以 geojson 格式存储了商店位置。 h3-js 中是否有一个函数将获取半径、商店数组、h3 索引,然后返回距离给定 h3 索引 5 公里范围内的商店列表。或者我如何使用 h3-js 来实现这个?

【问题讨论】:

    标签: maps uber-api h3 s2


    【解决方案1】:

    这里有几个不同的部分:

    选择一个分辨率:选择一个 H3 分辨率进行查找。更精细的 res 意味着更高的准确性,但更多的内存使用。 Res 8 的大小大约是几个街区。

    索引数据:要使用 H3 进行半径查找,您需要通过 H3 索引对商店进行索引。如果您希望这样做有效,最好提前索引所有商店。你如何做到这一点取决于你; JS 中的一种简单方法可能是创建 id 数组的映射:

    const lookupIndexes = stores.features.reduce((map, feature) => {
      const [lon, lat] = feature.geometry.coordinates;
      const h3Index = h3.geoToH3(lat, lon, res);
      if (!map[h3Index]) map[h3Index] = [];
      map[h3Index].push(feature.id);
      return map;
    }, {})
    

    执行查找:要搜索,索引您的搜索位置并获取某个半径内的所有 H3 索引。您可以使用h3.edgeLength 函数获取当前分辨率下单元格的大致半径。

    const origin = h3.geoToH3(searchLocation.lat, searchLocation.lon, res);
    const radius = kmToRadius(searchRadiusKm, res);
    
    // Find all the H3 indexes to search
    const lookupIndexes = h3.kRing(origin, radius);
    
    // Find all points of interest in those indexes
    const results = lookupIndexes.reduce(
      (output, h3Index) => [...output, ...(lookupMap[h3Index] || [])], 
    []);
    

    See a working example on Observable

    注意事项:不是真正的半径搜索。 k 环是一个以原点为中心的大致六边形。这对于许多用例来说已经足够好了,而且比传统的 Haversine 半径搜索要快得多,尤其是当您有很多行要搜索时。但是,如果您关心确切的距离,H3 可能不合适(或者,在某些情况下,H3 可能没问题,但您可能希望索引位于“真实”圆圈内 - 这里的一种选择是将圆圈转换为闭合 -到圆形多边形,然后通过h3.polyfill获取索引)。

    【讨论】:

    • k 环的六边形结构不是圆形的,但实用的快速处理方法是简单地使用 k 环中的 ID 进行搜索,然后使用类似 hasrsine 的方法修剪结果或 x,y,z 形式的点积以获得更精确的距离。
    • 您可能还需要稍微增加 k 环直径,以确保在所需距离内找到所有单元格。发生这种情况有两个原因。首先,您当前的位置可能不在 k 环的原始单元格的中心。其次,根据 k 环的定义,某些角可能比您想象的更接近原点。这是因为 k 环会根据它们的中心位置为您提供所有包含的单元格。
    猜你喜欢
    • 2014-05-31
    • 2021-09-09
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多