在mongodb中查找按距离排序的LineString附近的点

2024-04-02

我有一组代表街道(黑线)的点和代表地图上某个地点的点(红点)。我想找到指定街道附近的所有点,按距离排序。我还需要能够指定最大距离(蓝色和绿色区域)。这是一个简单的例子:

我想用$near运算符,但它只接受Point作为输入,而不是LineString.

mongodb 如何处理这种类型的查询?


正如您提到的,Mongo 目前不支持除Point。您是否遇到过路线拳击手的概念?1 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html几年前,它在谷歌地图上非常流行。根据您绘制的线,找到范围内的停靠点dist(x)。这是通过在线中每个点周围创建一系列边界框并搜索落在桶内的点来完成的。

在我刚刚意识到 Mongo 只适用于点之后,我偶然发现了你的问题,我认为这是合理的。

我已经有一些如何做到这一点的选项(它们扩展了 @mnemosyn 在评论中所说的内容)。对于我正在处理的数据集,它全部位于客户端,因此我可以使用路由箱,但出于性能原因我想在服务器端实现它。以下是我的建议:

  1. 打破LineString深入到其单独的坐标集,并查询$near使用其中每一个,组合结果并提取唯一的集合。有一些算法可以通过减少点数来简化复杂的直线,但简单的算法很容易编写。

  2. 与上面相同,但作为存储过程/函数。我还没有使用过 Mongo 的存储函数,而且我不知道它们与驱动程序的配合情况如何,但这可能比上面的第一个选项更快,因为您不必进行往返,并且取决于所使用的机器如果您托管了 Mongo 实例,计算速度可能会快几微秒。

  3. 在服务器端实现routeboxer方法(已在PHP中完成),然后使用上述两种方法之一来查找$within由此产生的边界框。哎呀,由于routeboxer方法返回矩形,因此可以将所有这些矩形合并成一个覆盖您路线的多边形,然后只需执行$within关于这一点。 (@mnemosyn 建议的)。

  4. EDIT:我想到了这一点,但忘记了,但使用聚合框架也许可以实现上述一些功能。

这是我很快就会做的事情(希望如此),我将根据我最终的结果开源我的结果。

EDIT:我必须提到,虽然 1 和 2 有一个缺陷,如果你在一条线上有 2 个相距 2 公里的点,并且你想要距离你的线 1.8 公里以内的点,那么你显然会错过该部分之间的所有点你的线路。解决方案是在简化线时将点注入到线上(我知道,这比添加新点时减少点的目标要好)。

3 的缺陷是它并不总是准确的,因为多边形内的某些点的距离可能大于您的限制,尽管差异不会占限制的很大百分比。

[1 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html] 谷歌地图 utils 路线箱 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在mongodb中查找按距离排序的LineString附近的点 的相关文章

随机推荐

  • Chrome 23 中的 Vibration API 隐藏在哪里?

    根据一个post http peter sh 2012 08 key bindings for extensions and media streams for the web audio api 在 Peter Beverloo 的博客上
  • 使用 Swift 和 Cocoa 创建 nswindow 的正确方法

    通常我会使用此方法通过窗口控制器打开一个新窗口 class WindowTestController interface AppDelegate NSObject
  • 替换

    以前有人问过这个问题 但我从未见过足够的答案 是否有有效的替代品
  • 如何将数据库与微服务(以及新的)同步?

    我正在开发一个采用微服务架构的网站 每个服务都拥有一个数据库 数据库存储微服务所需的数据 Post Video服务需要用户信息 因此订阅的两个服务NEW USER EVENT The NEW USER EVENT当有新用户注册时将被触发 一
  • vi 退出后如何恢复终端内容?

    像 vi 或 man 或任何其他程序这样的程序如何用程序自己的内容替换终端内容 然后在退出这些程序后它们会带回旧的终端内容 Vi 翻转到终端支持的备用屏幕缓冲区 这是通过使用转义序列来实现的 看这个链接 http invisible isl
  • 从链表中删除最小值[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要从链表中删除最小的元素值 喜欢
  • 在地图周围绘制各州省份,并用德国邮政编码着色

    我正在尝试创建一张地图 在其中按德国邮政编码进行着色 并且我想添加德国各州作为边界 for loading our data library raster library readr library readxl library sf li
  • 如何从 GAC 加载程序集?

    我正在尝试使用 Assembly Load 加载 GAC 中的程序集 例如 假设我想列出存在于的所有类型演示核心 dll 我该如何加载演示核心 dll 当我尝试这个时 Assembly a Assembly Load Presentatio
  • MUI:如何以编程方式删除 DataGrid 中选定的行?

    我正在使用 MUI 创建文件列表DataGrid 用户可以选中复选框DataGrid做出他们的选择 我希望在用户执行某些操作 例如删除所选文件 后重置该复选框 我面临的问题是在执行删除操作后 该复选框仍然在同一位置被选中 例如 在我按下删除
  • 更改搜索栏拇指的大小

    我正在使用可绘制的搜索栏拇指 android thumb drawable thumb 我怎样才能设置这个拇指的大小dip单元 因为我使用类似搜索栏的样式 我想要拇指12dip高度和宽度 对我来说设置拇指大小的最灵
  • org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“scriptDataSourceInitializer”的bean时出错?

    我是学习 Spring Boot Web 的新手 我已经开始学习 spring jpa 数据 我使用 h2 数据库 我想使用插入测试数据 org springframework beans factory BeanCreationExcep
  • 仅显示 SQL 查询的前 N ​​行输出

    有没有办法只显示前 N 行输出SQL query 如果查询停止运行一次 则奖励积分N输出行 我最感兴趣的是找到适用于的东西Oracle 如果您指定您的目标数据库将会很有帮助 不同的数据库有不同的语法和技术来实现这一点 例如 在 Oracle
  • Git:如何排除存储库中的子文件夹?

    我已经在我的项目的文件夹中创建了一个存储库 你知道 git init 我有Webstorm文件夹 idea另一个与此无关的文件夹 我对保留在存储库中不感兴趣 并且我不希望此文件夹显示为要添加的新文件 我想忘记这些子文件夹 如何在提交整个存储
  • vertx 内的多线程

    我是 vert x 的新手 我正在尝试 vert x NetServer 功能 http vertx io core manual java html writing tcp servers and clients http vertx i
  • 下载 Fuchsia 源代码 - Jiri 钩子由于更新项目或包时出现致命错误而未运行

    Per 获取紫红色源代码 https fuchsia dev fuchsia src development source code echo PATH media cwh 32GB swdev fuchsia jiri root bin
  • 如何在 SQLite 中拥有自动时间戳?

    我有一个 SQLite 数据库版本 3 我正在使用 C 创建一个使用该数据库的应用程序 我想在表中使用时间戳字段来实现并发 但我注意到当我插入新记录时 该字段未设置 并且为空 例如 在 MS SQL Server 中 如果我使用时间戳字段
  • OpenCV 使用 k 均值对图像进行色调分离

    我想在 C 接口 cv 命名空间 中使用 k means 和 OpenCV 对图像进行色调分离 但得到了奇怪的结果 我需要它来减少一些噪音 这是我的代码 include cv h include highgui h using namesp
  • 在 AngularJS 中下载 zip 文件

    尝试在 AngularJS 中下载 zip 文件 我查看了AngularJS 从服务器下载pdf文件 https stackoverflow com questions 25490007 angularjs download pdf fil
  • 按时间间隔分组

    我需要将我的表分组为 15 分钟的间隔 我可以这样做 select dateadd minute datediff minute 0 ts 15 15 0 sum goodpieces from StationCount Group by
  • 在mongodb中查找按距离排序的LineString附近的点

    我有一组代表街道 黑线 的点和代表地图上某个地点的点 红点 我想找到指定街道附近的所有点 按距离排序 我还需要能够指定最大距离 蓝色和绿色区域 这是一个简单的例子 我想用 near运算符 但它只接受Point作为输入 而不是LineStri