我正在开发一款移动应用程序,该应用程序可以定期跟踪用户的位置,让他能够在 map 上绘制旅行路径。我们想添加一个可选功能,告诉他该应用程序的其他用户在他查看的时间范围内有哪些类似的旅程,无论是今天的通勤还是上个月的旅行。我们将此称为“路径匹配”。
数据目前以二进制格式记录到 iOS 和 Android 上应用程序的私有(private)存储目录中的文件中,可以轻松快速地扫描以读取位置。每个文件包含一天的位置,一般大小为 80KB 左右。
为了能够实现路径匹配功能,我们显然需要开始将这些位置日志上传到我们运行 PHP 的服务器(当然需要用户许可)。有人推荐 MongoDB 是因为它的地理空间能力 - 但我有几个问题,也许人们可以帮助我解决:
看来我们可以更改位置记录以改用 BSON。第一个字段是设备或用户 ID,然后是特定日期的位置列表。然后可以将该文件上传到我们的服务器并推送到 MongoDB 存储中。然而,在线文档似乎只提到导入由 mongodump 创建的 BSON 文件。格式是否足够稳定,任何应用程序都可以编写 MongoDB 可直接读取的 BSON 文件?
MongoDB 是否能够对包含多个位置的文档或形成跨多个文档的路径的位置运行地理空间查询?或者这是否让您觉得在 PHP 端需要数据库外部的过多逻辑?
最佳答案
格式完全稳定,但没有太多工具可以执行您描述的操作。通常,您会将它上传到后端,它最终会出现在 $_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 手动加载它们。不过,我强烈建议让驱动程序为您做一些低级的事情!
您可以有一个文档,其中包含一条线(在新的地理信息中)和一组点(在旧的地理信息中)。我不确定“跨多个文档的路径”是什么意思。
编辑添加:根据您的评论,您可能想尝试 {path : {$near : {$geometry : userPath}}} 来查找“附近”路径。您还可以尝试围绕用户的路径创建一个多边形并在该多边形内查询文档 $。
关于mongodb - 比较地理空间路径与 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14670729/
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa
方法应返回-1,0或1分别表示“小于”、“等于”和“大于”。对于某些类型的可排序对象,通常将排序顺序基于多个属性。以下是可行的,但我认为它看起来很笨拙:classLeagueStatsattr_accessor:points,:goal_diffdefinitializepts,gd@points=pts@goal_diff=gdenddefothercompare_pts=pointsother.pointsreturncompare_ptsunlesscompare_pts==0goal_diffother.goal_diffendend尝试一下:[LeagueStats.new(
Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i
我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我正在运行这样的代码:ifvalid_from>Date.today当我运行它时,我得到一个错误提示comparisonofDatewithnilfailed我假设它正在发生,因为在某些情况下valid_from是nil。有没有办法避免出现此错误? 最佳答案 你可以这样做:ifvalid_fromandvalid_from>Date.today...end这将在第一个子句上短路,因为valid_from为nil,因此为false。 关于ruby-Date与nil的比较失败-ruby,我们
我安装了ruby、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom