如何在h3-js中找到h3索引半径5公里内的位置(其最新长坐标以geo-json格式存储的索引)? [英] 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?

查看:43
本文介绍了如何在h3-js中找到h3索引半径5公里内的位置(其最新长坐标以geo-json格式存储的索引)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

推荐答案

这里有几个不同的部分:

选择分辨率:选择要查找的H3分辨率。更精细的分辨率意味着更高的精确度,但也意味着更多的内存使用。RES8的大小大约是几个城市街区。

索引数据:要使用H3进行RADIUS查找,您需要按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

警告:这是而不是真正的RADIUS搜索。k环是以原点为中心的大致六边形。这对于许多用例来说已经足够好了,而且比传统的Haverine半径搜索要快得多,特别是当您有很多行要搜索的时候。但是,如果您关心H3可能不合适的确切距离(或者,在某些情况下,H3可能是合适的,但是您可能想要"真"圆内的索引-这里的一个选项是将圆转换为接近圆形的多边形,然后通过h3.polyfill获取索引)。

这篇关于如何在h3-js中找到h3索引半径5公里内的位置(其最新长坐标以geo-json格式存储的索引)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆