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

标签 maps uber-api h3 s2

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

最佳答案

这里有几个不同的部分:

选择一个分辨率:选择 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 形环是一个以原点为中心的大致六边形形状。这对于许多用例来说已经足够了,并且比传统的半正弦半径搜索快得多,尤其是当您有很多行要搜索时。但是,如果您关心确切的距离 H3 可能不合适(或者,在某些情况下,H3 可能没问题,但您可能希望索引位于“真实”圆圈内 - 此处的一个选择是将您的圆圈转换为近距离 -到圆形多边形,然后通过 h3.polyfill 获取索引)。

关于maps - 如何在h3-js中的h3索引的5公里半径内找到位置(其经纬度坐标以geo-json格式存储的索引)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57050286/

相关文章:

uber-api - Uber Eats 优食 API 范围

node.js - 计算任何给定分辨率下 h3 的地理空间索引

python - H3 六边形不匹配

plot - 使用 -nodisplay -nodesktop -nosplash 打印 Matlab 图

post - 优步API |为 Ride 请求请求访问 token 返回 'invalid_grant' 错误

api - Google Directions API 的替代品

ios - 我应该如何处理 iOS 中的 Uber 激增确认网址?

c - 将 C 绑定(bind)添加到 H3 Rust 库

android自定义位图覆盖与mapsforge

go - 具有对象映射的Avro模式?