我有一个应用程序执行以下操作:
路线的POI可以是具有半径的点,在这种情况下,它应该检测设备是否在该点的半径内;或多边形,它应检测设备是否在其内部。
以下是包含3个POI的路线示例,其中两个是半径不同的点,另一个是多边形:
https://jsonblob.com/285c86cd-61d5-11e7-ae4c-fd99f61d20b8
我当前的算法在PHP中用MySQL数据库编程。当设备发送新位置时,该脚本会将其路径中的所有POI从数据库加载到内存中,然后迭代它们。对于作为点的POI,它使用Haversine公式来查找设备是否在POI的半径内,对于作为多边形的POI,它使用多边形中的"点"用于查找设备是否在其内部的算法。
我想重写算法,目标是使用比当前计算资源少的计算资源。我们每秒收到大约100个地点,每个地点都要检查平均有大约40个POI的路线。
我可以使用任何语言和数据库来执行此操作,您会推荐哪些语言和数据库以获得最佳性能?
答案 0 :(得分:0)
我使用支持空间查询的数据库(例如Postgresql)。
这将允许您创建一个空间索引,在每个POI周围放置一个边界框。您可以使用它来进行初步检查(通常)消除绝大多数甚至不接近当前位置的POI(即,当前位置不在其边界框内)。 / p>
然后,当您将其缩小到几个POI时,您可以使用大概现在的算法测试少数几个 - 但不是每点测试40个POI,您可能只测试2个POI或者3。
这种效果究竟有多好将在很大程度上取决于你的POI有多接近矩形。圆形足够接近它往往会给出相当好的结果。
其他人可能会依赖 - 例如,一条几乎北上和南下的河流可能会很好地运作。如果你有一条主要沿对角线运行的河流,可能值得将其分解为多个方形/矩形线段而不是将整个事物视为单个特征,因为后者将创建一个带有的边界框很多的空间距离河流很远。