【问题标题】:Finding POIs that are near or contain a certain location查找靠近或包含某个位置的 POI
【发布时间】:2017-12-09 19:44:27
【问题描述】:

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

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

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

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

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

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

我想重写算法,目标是使用比当前更少的计算资源。我们每秒接收大约 100 个位置,每个位置都必须对照平均有大约 40 个 POI 的路线进行检查。

我可以使用任何语言和数据库来做到这一点,您会推荐哪些以获得最佳性能?

【问题讨论】:

    标签: algorithm performance architecture geolocation geospatial


    【解决方案1】:

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

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

    然后,当您将范围缩小到几个 POI 时,您可以使用您现在大致使用的算法来测试少数几个 POI,但您可能只测试 2 或 3 个 POI,而不是每个点测试 40 个 POI .

    这将在很大程度上取决于您的兴趣点接近矩形的程度。圆形足够接近,它往往会产生相当好的结果。

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

    【讨论】:

    • 谢谢,这是个好主意。我绝对可以限制多边形的半径或面积,因为 POI 代表送货地点。
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多