【问题标题】:Comparing geospatial paths with MongoDB将地理空间路径与 MongoDB 进行比较
【发布时间】:2013-02-08 04:33:46
【问题描述】:

我正在开发一款移动应用程序,该应用程序会定期跟踪用户的位置,以便让他在地图上绘制旅程路径。我们想添加一个可选功能,该功能将告诉他该应用程序的其他用户在他所查看的时间范围内进行了类似的旅程,无论是今天的通勤时间还是旅行的最后一个月。我们将其称为“路径匹配”。

数据目前以二进制格式记录到 iOS 和 Android 上应用程序的私有存储目录​​中的文件中,该二进制格式可以轻松快速地扫描以读取位置。每个文件包含一天的位置,一般运行到 80KB 左右。

为了能够实现路径匹配功能,我们显然需要开始将这些位置日志上传到我们正在运行 PHP 的服务器(当然需要用户许可)。有人建议 MongoDB 的地理空间能力 - 但我有几个问题也许人们可以帮助我:

  1. 似乎我们可以将位置记录更改为使用 BSON。第一个字段是设备或用户 ID,然后是特定日期的位置列表。然后可以将该文件上传到我们的服务器并推送到 MongoDB 存储中。然而,在线文档似乎只涉及导入由 mongodump 创建的 BSON 文件。格式是否足够稳定,任何应用程序都可以编写 MongoDB 直接读取的 BSON 文件?

  2. MongoDB 是否能够对包含多个位置的文档或在跨多个文档形成路径的位置运行地理空间查询?或者这会让您觉得这需要在数据库之外的 PHP 端进行过多的逻辑?

【问题讨论】:

  • 问题解决了吗?我有一个类似的问题,我需要通过给出一组点来找到匹配的路径。但是通过使用带有 LineString 的 $geoIntersects 我什么也没得到。

标签: mongodb geospatial bson


【解决方案1】:
  1. 格式完全稳定,但没有太多工具可以执行您描述的操作。一般来说,你会将它上传到后端,它最终会出现在$_POST['locations'] 或者是一个关联数组的数组中。对其进行清理并将其保存到数据库中,例如:

    $locs = sanitize($_POST['locations']); $doc = array('path' => array('type' => 'LineString', 'coordinates' => $locs), 'user' => $userId); $collection->insert($doc);

    在上面的示例中,我使用了一些最新的地理信息 (http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical-geometry),您需要每晚构建才能获得它,但它应该在大约一个月内进入稳定构建。如果您在此之前需要它,可以使用较旧的地理 API:http://docs.mongodb.org/manual/core/geospatial-indexes/

    MongoDB 不读取 BSON 文件,但您可以使用 mongorestore 手动加载它们。不过,我强烈建议让驱动程序为您做低级的事情!

  2. 您可以拥有一个包含一条线(在新的地理资料中)和一组点(在旧的地理资料中)的文档。我不确定您所说的“跨多个文档的路径”是什么意思。

    编辑添加:根据您的评论,您可能想尝试{path : {$near : {$geometry : userPath}}} 查找“附近”路径。您还可以尝试围绕用户的路径制作一个多边形并在多边形内查询 docs $。

【讨论】:

  • 那个“LineString”的东西看起来很适合存储路径。通过多文档路径,我的意思是 Mongo 存储最终可能会包含多个文档,每个文档都有用户在某一天的位置路径。因此,每个用户每天一份文件。我需要弄清楚的是如何在多天内将用户的路径与其他用户的路径进行比较。最终我们想告诉用户“在这段时间里,这些人往往在你附近”。看起来 Mongo 很适合这个!
  • 酷!编辑添加了有关查找附近路径的更多信息。
  • 您能否指定此查询中用户路径的格式?{path : {$near : {$geometry : userPath}}} 我有同样的要求,但我不知道如何通过用户路径
  • 我看过文档,似乎 $gemometry for $near 只接受点而不是路径,我在这方面是否正确?
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 2011-04-27
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多