0

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

  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 实现上述要求,并且我的解决方案是正确的,或者是否有更好的解决方案?

4

1 回答 1

0

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

K环查找

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

自行车不在圈内

让所有不在圈内的自行车以类似的方式工作。如果您需要圆比 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,自行车或电池。

于 2021-06-28T16:33:08.757 回答