我有车辆的地理位置和我在城市中的点,我需要找到那些在我的点半径 5 公里内的车辆。 我可以用 S2 单元格 ID 表示车辆位置和我的点。但是我该如何查询?
我可以在数据库中存储所有用户的数据并对 S2 单元格 ID 进行查询吗? 由于 S2 小区 ID 使用的是希尔伯特曲线,我们能否知道那些具有较近 S2 小区 ID 的车辆彼此之间的距离更近。 或者我必须在此处使用任何其他方法来执行搜索操作吗?
我将这个问题分为几个步骤:
-
为您的应用程序选择合适的 S2 级别。在您的情况下,由于您按 5 KM 半径进行查询,因此我会选择平均大小为 1.27 km^2 的13 级单元格。
-
生成一个覆盖人员周围 5 KM 半径的 13 级单元。
-
从汽车的纬度/液化天然气中获取 13 级电池。
-
对汽车 S2 单元进行包含检查,以覆盖 5 KM 半径的 S2 单元。
下面是 Node.js JavaScript S2 库的示例:
const s2 = require('@radarlabs/s2');
# s2 cell level of ~1.27 km^2
const level = 13;
# cell covering of enclosure around a person
const enclosureLLs = [
[40.77933906065449, -73.96983146667479],
[40.77933906065449, -73.9634370803833],
[40.78483079505022, -73.9634370803833],
[40.78483079505022, -73.96983146667479],
].map((latlng) => {
const [lat, lng] = latlng;
return new s2.LatLng(lat, lng);
});
const enclosureCells = new Set(s2.RegionCoverer.getCoveringTokens(enclosureLLs, { min: level, max: level }));
# -> Set { '89c25894', '89c2589c' }
// arbitrary vehicle lat longs
const vehicle1 = new s2.CellId(new s2.LatLng(40.78340103809933, -73.96515369415283)).parent(level);
# -> '89c2589c'
const vehicle2 = new s2.CellId(new s2.LatLng(40.782848623761375, -73.95506858825684)).parent(level);
# -> '89c258a4'
console.log(enclosureCells.has(vehicle1.token()));
# -> true
console.log(enclosureCells.has(vehicle2.token()));
# -> false
您可以使用人行道实验室的 S2 地图工具可视化它的外观:
- 覆盖物
- 车辆 1
- 车辆 2