查找靠近或包含特定位置的 POI

Finding POIs that are near or contain a certain location

我有一个执行以下操作的应用程序:

路线的兴趣点可以是一个有半径的点,在这种情况下,它应该检测设备是否在该点的半径内;或多边形,它应该检测设备是否在其中。

这里是一个有 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 那离河很远。