微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 uber h3-js 在具有多个数据点的多边形内以及在质心纬度/经度、半径的圆内找到位置?

如何解决如何使用 uber h3-js 在具有多个数据点的多边形内以及在质心纬度/经度、半径的圆内找到位置?

我正在开发一个共享单车应用程序,我有以下要求。

  1. 显示用户位置附近一定半径范围内的所有自行车。

    为此,我提出了一种获取自行车所有索引的方法 特定分辨率上的位置并从用户位置获取所有索引 使用 kRing 函数确定半径,然后找到所有自行车位置 在 kRing 索引中。

const res = 8;
//get hexagon index of all locations
const lookupMap = bike_locations.reduce((map,bike) => {
    const {latitude,longitude} = bike;
    const h3Index = h3.geoToH3(latitude,longitude,res);
    if (!map[h3Index]) map[h3Index] = [];
    map[h3Index].push(bike.id);
    return map;
},{});

//hexagon index of user location
const origin = h3.geoToH3(user_lat,user_logn,res);
const radius = Math.floor(distance_in_km / (h3.edgeLength(res,h3.UNITS.km) * 2));
const lookupIndexes = h3.kRing(origin,radius);

// Find all points of bikes in those indexes
const results = lookupIndexes.reduce(
    (output,h3Index) => [...output,...(lookupMap[h3Index] || [])],[]);
  1. 我有一个以纬度/经度为中心的大圆,圆的半径以公里为单位,这些大圆分成多个带有数据点的多边形。

    如何获得所有城市边界外(即大圈)的自行车?

    如何使用 polyfill 获取存在多少辆自行车的多边形以及如何获取存在给定自行车位置的多边形?

  2. 如何在地图上显示所有自行车位置、多边形、大圆圈和填充六边形?这里我使用的是 MapmyIndi​​a。

如何使用 Uber H3-js 实现上述要求,我的解决方案是正确的还是有更好的解决方案?

解决方法

这里有很多问题,我不确定我是否理解所有问题,但这是我的尝试:

K 形环查找

基于 k 环的半径查找似乎是一个合理的解决方案(看起来它基于 this answer),特别是如果自行车查找地图可以计算一次,而不是每次需要执行查找时。

自行车不在圈内

让所有不在圈内的自行车以类似的方式工作。如果您需要圆比 k 环更圆,则需要计算圆内的六边形集 - 没有用于此的 H3 函数,但合理的方法可能如下所示:

  1. 计算覆盖圆的 k 环单元
  2. 检查每个单元格中心到圆心的半正弦距离
  3. 如果 distance <= radius 将单元格添加到圆圈集

现在您有一组代表圆圈的单元格,过滤掉所有单元格在该组中的自行车。剩下的自行车在圈外。

多边形中的自行车

要获取一组多边形并将其用于查找,您需要一个反向索引(单元格 => 多边形)。您可以像这样创建它(未经测试):

const lookup = {};
for (const poly of polygons) {
  for (const cell of h3.polyfill(poly,res)) {
    lookup[cell] = polygon; // or polygon id,or whatever
  } 
}

现在您可以使用索引轻松查找特定自行车的多边形。要计算多边形中的自行车数,您可以遍历所有自行车并计算里面有哪些自行车,或者遍历多边形中的所有单元格并确定哪些有自行车 - 这些都是 O(n),所以更好的选择取决于哪个 n 较小,是自行车还是电池。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。