查找靠近或包含特定位置的 POI
Finding POIs that are near or contain a certain location
我有一个执行以下操作的应用程序:
- 接收设备的位置
- 获取分配给该设备的路线(POI 或兴趣点的集合)
- 确定设备是否靠近路线中的任何 POI
路线的兴趣点可以是一个有半径的点,在这种情况下,它应该检测设备是否在该点的半径内;或多边形,它应该检测设备是否在其中。
这里是一个有 3 个 POI 的路线示例,其中两个是不同半径的点,另一个是多边形:
https://jsonblob.com/285c86cd-61d5-11e7-ae4c-fd99f61d20b8
我当前的算法是在 PHP 中使用 MySQL 数据库编写的。当设备发送新位置时,脚本会将其路线的所有 POI 从数据库加载到内存中,然后遍历它们。对于作为点的 POI,它使用 Haversine 公式来查找设备是否在 POI 的半径内,对于作为多边形的 POI,它使用 "point in polygon" 算法来查找设备是否在其内部。
我想重写算法,目标是使用比当前算法更少的计算资源。我们每秒收到大约 100 个位置,每个位置都必须根据平均具有大约 40 个 POI 的路线进行检查。
我可以使用任何语言和数据库来执行此操作,您会推荐哪些语言和数据库以获得最佳性能?
我会使用支持空间查询的数据库(例如 Postgresql)。
这样您就可以创建一个空间索引,在每个 POI 周围放置一个边界框。您可以使用它进行初始检查以(通常)消除甚至不靠近当前位置(即当前位置不在其边界框内)的绝大多数 POI。
然后当您将范围缩小到几个 POI 时,您可以使用您现在使用的粗略算法来测试少数几个 POI——但不是每个点测试 40 个 POI,您可能只测试 2 个或 3.
具体效果如何很大程度上取决于您的 POI 与矩形的接近程度。 Circular 足够接近,它往往会给出很好的结果。
其他因素可能取决于 -- 例如,一条几乎南北走向的河流可能工作得很好。如果您有一条主要沿对角线流动的河流,可能值得将其分成多个 square/rectangular 段,而不是将整个事物视为单个特征,因为后者将创建一个带有 square/rectangular 的边界框=20=]lot of space 那离河很远。
我有一个执行以下操作的应用程序:
- 接收设备的位置
- 获取分配给该设备的路线(POI 或兴趣点的集合)
- 确定设备是否靠近路线中的任何 POI
路线的兴趣点可以是一个有半径的点,在这种情况下,它应该检测设备是否在该点的半径内;或多边形,它应该检测设备是否在其中。
这里是一个有 3 个 POI 的路线示例,其中两个是不同半径的点,另一个是多边形:
https://jsonblob.com/285c86cd-61d5-11e7-ae4c-fd99f61d20b8
我当前的算法是在 PHP 中使用 MySQL 数据库编写的。当设备发送新位置时,脚本会将其路线的所有 POI 从数据库加载到内存中,然后遍历它们。对于作为点的 POI,它使用 Haversine 公式来查找设备是否在 POI 的半径内,对于作为多边形的 POI,它使用 "point in polygon" 算法来查找设备是否在其内部。
我想重写算法,目标是使用比当前算法更少的计算资源。我们每秒收到大约 100 个位置,每个位置都必须根据平均具有大约 40 个 POI 的路线进行检查。
我可以使用任何语言和数据库来执行此操作,您会推荐哪些语言和数据库以获得最佳性能?
我会使用支持空间查询的数据库(例如 Postgresql)。
这样您就可以创建一个空间索引,在每个 POI 周围放置一个边界框。您可以使用它进行初始检查以(通常)消除甚至不靠近当前位置(即当前位置不在其边界框内)的绝大多数 POI。
然后当您将范围缩小到几个 POI 时,您可以使用您现在使用的粗略算法来测试少数几个 POI——但不是每个点测试 40 个 POI,您可能只测试 2 个或 3.
具体效果如何很大程度上取决于您的 POI 与矩形的接近程度。 Circular 足够接近,它往往会给出很好的结果。
其他因素可能取决于 -- 例如,一条几乎南北走向的河流可能工作得很好。如果您有一条主要沿对角线流动的河流,可能值得将其分成多个 square/rectangular 段,而不是将整个事物视为单个特征,因为后者将创建一个带有 square/rectangular 的边界框=20=]lot of space 那离河很远。