2

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

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

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

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

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

4

1 回答 1

3
  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 $。

于 2013-02-06T04:15:43.060 回答