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

时间:2017-07-06 00:44:40

标签: algorithm performance architecture geolocation geospatial

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

  • 接收设备的位置
  • 获取分配给该设备的路线(POI集合或兴趣点)
  • 确定设备是否靠近路径中的任何POI

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

以下是包含3个POI的路线示例,其中两个是半径不同的点,另一个是多边形:

https://jsonblob.com/285c86cd-61d5-11e7-ae4c-fd99f61d20b8

我当前的算法在PHP中用MySQL数据库编程。当设备发送新位置时,该脚本会将其路径中的所有POI从数据库加载到内存中,然后迭代它们。对于作为点的POI,它使用Haversine公式来查找设备是否在POI的半径内,对于作为多边形的POI,它使用多边形中的"点"用于查找设备是否在其内部的算法。

我想重写算法,目标是使用比当前计算资源少的计算资源。我们每秒收到大约100个地点,每个地点都要检查平均有大约40个POI的路线。

我可以使用任何语言和数据库来执行此操作,您会推荐哪些语言和数据库以获得最佳性能?

1 个答案:

答案 0 :(得分:0)

我使用支持空间查询的数据库(例如Postgresql)。

这将允许您创建一个空间索引,在每个POI周围放置一个边界框。您可以使用它来进行初步检查(通常)消除绝大多数甚至不接近当前位置的POI(即,当前位置不在其边界框内)。 / p>

然后,当您将其缩小到几个POI时,您可以使用大概现在的算法测试少数几个 - 但不是每点测试40个POI,您可能只测试2个POI或者3。

这种效果究竟有多好将在很大程度上取决于你的POI有多接近矩形。圆形足够接近它往往会给出相当好的结果。

其他人可能会依赖 - 例如,一条几乎北上和南下的河流可能会很好地运作。如果你有一条主要沿对角线运行的河流,可能值得将其分解为多个方形/矩形线段而不是将整个事物视为单个特征,因为后者将创建一个带有的边界框很多的空间距离河流很远。