如何解决如何使用 uber h3-js 在具有多个数据点的多边形内以及在质心纬度/经度、半径的圆内找到位置?
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] || [])],[]);
-
我有一个以纬度/经度为中心的大圆,圆的半径以公里为单位,这些大圆分成多个带有数据点的多边形。
如何获得所有城市边界外(即大圈)的自行车?
-
如何在地图上显示所有自行车位置、多边形、大圆圈和填充六边形?这里我使用的是 MapmyIndia。
如何使用 Uber H3-js 实现上述要求,我的解决方案是正确的还是有更好的解决方案?
解决方法
这里有很多问题,我不确定我是否理解所有问题,但这是我的尝试:
K 形环查找
基于 k 环的半径查找似乎是一个合理的解决方案(看起来它基于 this answer),特别是如果自行车查找地图可以计算一次,而不是每次需要执行查找时。
自行车不在圈内
让所有不在圈内的自行车以类似的方式工作。如果您需要圆比 k 环更圆,则需要计算圆内的六边形集 - 没有用于此的 H3 函数,但合理的方法可能如下所示:
- 计算覆盖圆的 k 环单元
- 检查每个单元格中心到圆心的半正弦距离
- 如果
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 举报,一经查实,本站将立刻删除。