使用 H3 获取距离地理位置最近的车辆
using H3 to get the closest vehicles to a geolocation
我正在开发一个系统,其中有一个包含 100000 个地理位置和 10000 个正在移动的汽车的地理位置的列表,每隔 X 秒,车辆的位置更新发生一次,也就是说,同时我可以接收到N 个车辆位置更新。
我的问题是,每隔 X 秒,系统需要搜索靠近位置 L 的所有车辆,目前,系统遍历地理位置列表以寻找特定半径内的所有车辆,并在此过程中应用一些搜索过滤器。
但是,我注意到计算直线距离的距离计算系统是此过滤过程中消耗最多时间的系统,并且由于系统中有多种方法可以执行这些搜索,涉及到L点和N辆车之间的距离,在一个半径内,这个过程越来越慢,因为,对于每个L点,我都需要遍历整个车辆列表。
所以,我开始寻找索引地理位置的系统,我还可以搜索这些索引,例如使用规则,获取距地理位置 X
半径 N 公里范围内的所有车辆
H3好像是我感兴趣的东西,但是,我在他们的文档中找不到它,我该怎么做,或者,如何在地图上添加N辆车的过程。
您可以在此处查看有关如何使用 H3 进行半径搜索的教程:https://observablehq.com/@nrabinowitz/h3-radius-lookup
基本步骤如下:
- 使用 H3 索引您的所有数据。根据您的系统,您可以将结果作为哈希图保存在内存中,或者保存在 K/V 存储中,其中 H3 索引是键,值是该单元格中的车辆列表。
- 要进行搜索,请从感兴趣的点计算一个 k 环
L
。 k 环的大小取决于您用于索引的 H3 分辨率和您要搜索的半径。
- 在您的索引中为 k 环中的每个单元格执行 K/V 查找,并将结果附加到某个输出数组。如果你关心的是准确的距离,而不是大概的距离,此时你可以把k-ring调的比需要的大,然后按真实距离过滤。
这应该更有效 - 您之前的方法与车辆数量成比例,其中此方法与 k 形环的大小成比例,它是恒定的。
您仍然需要在车辆移动时将其编入索引。粗略地说,每次获得车辆的新位置时,都需要检查它是否在新的单元格中,如果是,则重新索引它。这意味着您需要在每个车辆记录或单独的索引中存储每个车辆的当前单元格,以及每个单元格的车辆索引。
我正在开发一个系统,其中有一个包含 100000 个地理位置和 10000 个正在移动的汽车的地理位置的列表,每隔 X 秒,车辆的位置更新发生一次,也就是说,同时我可以接收到N 个车辆位置更新。
我的问题是,每隔 X 秒,系统需要搜索靠近位置 L 的所有车辆,目前,系统遍历地理位置列表以寻找特定半径内的所有车辆,并在此过程中应用一些搜索过滤器。
但是,我注意到计算直线距离的距离计算系统是此过滤过程中消耗最多时间的系统,并且由于系统中有多种方法可以执行这些搜索,涉及到L点和N辆车之间的距离,在一个半径内,这个过程越来越慢,因为,对于每个L点,我都需要遍历整个车辆列表。
所以,我开始寻找索引地理位置的系统,我还可以搜索这些索引,例如使用规则,获取距地理位置 X
半径 N 公里范围内的所有车辆H3好像是我感兴趣的东西,但是,我在他们的文档中找不到它,我该怎么做,或者,如何在地图上添加N辆车的过程。
您可以在此处查看有关如何使用 H3 进行半径搜索的教程:https://observablehq.com/@nrabinowitz/h3-radius-lookup
基本步骤如下:
- 使用 H3 索引您的所有数据。根据您的系统,您可以将结果作为哈希图保存在内存中,或者保存在 K/V 存储中,其中 H3 索引是键,值是该单元格中的车辆列表。
- 要进行搜索,请从感兴趣的点计算一个 k 环
L
。 k 环的大小取决于您用于索引的 H3 分辨率和您要搜索的半径。 - 在您的索引中为 k 环中的每个单元格执行 K/V 查找,并将结果附加到某个输出数组。如果你关心的是准确的距离,而不是大概的距离,此时你可以把k-ring调的比需要的大,然后按真实距离过滤。
这应该更有效 - 您之前的方法与车辆数量成比例,其中此方法与 k 形环的大小成比例,它是恒定的。
您仍然需要在车辆移动时将其编入索引。粗略地说,每次获得车辆的新位置时,都需要检查它是否在新的单元格中,如果是,则重新索引它。这意味着您需要在每个车辆记录或单独的索引中存储每个车辆的当前单元格,以及每个单元格的车辆索引。