如何在h3-js中的h3索引的5 Km半径内找到位置(其纬度长坐标以geo-json格式存储的索引)?

时间:2019-07-16 04:58:11

标签: maps uber-api h3 s2

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

1 个答案:

答案 0 :(得分:1)

这里有一些不同的部分:

选择分辨率:选择H3分辨率进行查找。分辨率越高,意味着精度越高,但占用的内存更多。 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获取索引。