当前位置: 首页 > news >正文

MongoDB CRUD操作:地理位置查询

MongoDB CRUD操作:地理位置查询

文章目录

  • MongoDB CRUD操作:地理位置查询
    • 地理空间数据
      • GeoJSON对象
      • 传统坐标对
        • 通过数组指定(首选)
        • 通过嵌入文档指定
    • 地理空间索引
      • 2dsphere
      • 2d
    • 地理空间查询
      • 地理空间查询运算符
      • 地理空间聚合阶段
    • 地理空间模型
    • 举例

MongoDB支持地理空间数据的查询,这是MongoDB数据库有别于其它数据库的特色之一,在进行GIS相关系统开发的时候会比较有帮助。本文重点介绍MongoDB的地理空间功能。

gis search

地理空间数据

在MongoDB中,可以将地理空间数据存储为GeoJSON对象或传统坐标对。

GeoJSON对象

要计算类地球体上的几何形状,可将位置数据存储为GeoJSON对象,GeoJSON对象是一个内嵌文档:

  • 名为 type 的字段,指定 GeoJSON对象类型
  • 名为坐标的字段,用于指定对象的坐标。
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

注意:

经纬度坐标的第一个元素是经度第二个元素是纬度。其中经度值介于-180和180之间(含)。有效的纬度值介于-90和90之间(含)。

例如,一个GeoJSON的点:

location: {type: "Point",coordinates: [-73.856077, 40.848447]
}

关于对GeoJSON对象的地理空间查询在球体上计算,MongoDB 使用WGS84参考系统对GeoJSON对象进行地理空间查询。

传统坐标对

要计算欧几里得平面上的距离,需将位置数据存储为传统坐标对并使用2d索引。如果手动将数据转换为GeoJSON点类型,MongoDB将通过使用2dsphere索引支持传统坐标对上的球面计算。

要将数据指定为传统坐标对,可以使用数组(首选)或嵌入式文档。

通过数组指定(首选)
<field>: [ <x>, <y> ]

指定经纬度坐标时,则指定经度,再指定纬度。

<field>: [<longitude>, <latitude> ]
  • 有效的经度值介于 -180 和 180 之间(包含)。
  • 有效的纬度值介于 -90 和 90 之间(包含)。
通过嵌入文档指定
<field>: { <field1>: <x>, <field2>: <y> }

如果指定纬度和经度坐标,则无论字段名称如何,第一个字段都必须包含经度值,第二个字段必须包含纬度值,即:

<field>: { <field1>: <longitude>, <field2>: <latitude> }
  • 有效的经度值介于 -180 和 180 之间(包含)。
  • 有效的纬度值介于 -90 和 90 之间(包含)。

指定旧坐标对,数组优于嵌入文档,因为某些语言不保证关联映射顺序。

地理空间索引

MongoDB 提供以下地理空间索引类型来支持地理空间查询:

2dsphere

2dsphere 索引支持计算类地球体几何图形的查询。

可使用db.collection.createIndex()创建2dsphere索引,并指定字符串"2dsphere"作为索引类型:

db.collection.createIndex( { <location field> : "2dsphere" } )

其中,<location field>是一个字段,其值为GeoJSON对象或传统坐标对。

**注意:**在包含geoJSON点数组的字段上创建索引,将失败并返回错误信息:MongoServerError:索引构建失败

2d

2d索引支持在二维平面几何图形的查询,虽然2d索引可以支持在球面上的$nearSphere查询,但还是建议尽量使用2dsphere索引进行球面查询。

可使用db.collection.createIndex()创建2dsphere索引,并指定字符串"2d"作为索引类型:

db.collection.createIndex( { <location field> : "2d" } )

<location field>字段的值是一个传统坐标对。

地理空间查询

注意:使用二维索引查询球形数据可能会返回不正确的结果或错误。例如,二维索引不支持围绕极点的球形查询。

地理空间查询运算符

MongoDB 提供以下地理空间查询操作符:

运算符描述
$geoIntersects选择与GeoJSON几何图形相交的几何图形。2dsphere索引支持 $geoIntersects
$geoWithin在边界 GeoJSON 几何图形中选择几何图形。2dsphere 和 2d 索引都支持 $geoWithin
$near返回靠近某个点的地理空间对象。需要地理空间索引。 2dsphere 和 2d 索引都支持$near
$nearSphere返回球体上某个点附近的地理空间对象。需要地理空间索引。 2dsphere 和 2d 索引都支持 $nearSphere

地理空间聚合阶段

MongoDB支持$geoNear地理空间聚合管道阶段,可根据与地理空间点的接近程度返回有序的文档流,合并了地理空间数据的$match$sort$limit 的功能,输出文档包括附加距离字段,并且可以包括位置标识符字段。$geoNear要求地理空间索引。

地理空间模型

MongoDB 地理空间查询可解释平面或球面上的几何图形,2dsphere索引只支持球面查询(即解释球面上几何图形的查询),2d索引支持平面查询(即解释平面上几何图形的查询)和部分球面查询,虽然 2d 索引支持某些球面查询,但在这些球面查询中使用2d索引可能会导致错误。所以,建议尽量使用 2dsphere 索引进行球形查询。

下表列出了每个地理空间操作使用的地理空间查询操作符、支持的查询:

操作球形/平面查询说明
$near(本行和下一行的GeoJSON质心点,2dsphere索引)球形参考$nearSphere运算符,它在与 GeoJSON 和 2dsphere 索引一起使用时提供相同的功能
$near(传统坐标,2D 索引)平面
$nearSphere(GeoJSON 点,2dsphere 索引)球形提供与使用 GeoJSON点和2dsphere索引的$near操作相同的功能。对于球形查询,最好使用$nearSphere,在名称中显式指定球形查询,而不是$near运算符
$nearSphere(传统坐标,2d索引)球面使用GeoJSON替代
$geoWithin : { $geometry: ... }球面
$geoWithin : { $box: ... }平面
$geoWithin : { $polygon: ... }平面
$geoWithin : { $center: ... }平面
$geoWithin : { $centerSphere: ... }球面
$geoIntersects球面
$geoNear聚合阶段(2dsphere索引)球面
$geoNear聚合阶段(2d索引))平面

举例

使用下面的脚本创建places集合:

db.places.insertMany( [{name: "Central Park",location: { type: "Point", coordinates: [ -73.97, 40.77 ] },category: "Parks"},{name: "Sara D. Roosevelt Park",location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },category: "Parks"},{name: "Polo Grounds",location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },category: "Stadiums"}
] )

先在location字段上创建2dsphere索引:

db.places.createIndex( { location: "2dsphere" } )

下面的查询使用$near运算符返回距离指定GeoJSON点至少1000米、最多 5000米的文档,并按从最近到最远的顺序排序:

db.places.find({location:{ $near:{$geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },$minDistance: 1000,$maxDistance: 5000}}}
)

下面的操作使用$geoNear聚合操作返回与查询过滤器{category: "Parks" }匹配的文档,并按照距指定GeoJSON点从最近到最远的顺序排序:

db.places.aggregate( [{$geoNear: {near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },spherical: true,query: { category: "Parks" },distanceField: "calcDistance"}}
] )

相关文章:

MongoDB CRUD操作:地理位置查询

MongoDB CRUD操作&#xff1a;地理位置查询 文章目录 MongoDB CRUD操作&#xff1a;地理位置查询地理空间数据GeoJSON对象传统坐标对通过数组指定&#xff08;首选&#xff09;通过嵌入文档指定 地理空间索引2dsphere2d 地理空间查询地理空间查询运算符地理空间聚合阶段 地理空…...

mysql启动出现Error: 2 (No such file or directory)

查看mydql状态 systemctl status mysqlThe designated data directory /var/lib/mysql/ is unusable 查看mysql日志 tail -f /var/log/mysql/error.logtail: cannot open ‘/var/log/mysql/error.log’ for reading: No such file or directory tail: no files remaining 第…...

上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和soc相比较&#xff0c;mcu的项目规模一般不算大。因为&#xff0c;soc项目中&#xff0c;从规划、硬件开发、驱动、应用端、服务器端到测试&…...

插入排序—Java

插入排序 基本思想 &#xff1a;代码实现 基本思想 &#xff1a; 实现数组从小到大排从第二个数开始跟前面的数比较 找到合适的位置插入 后面的数往后推移 但推移不会超过原来插入的数的下标 代码实现 public static void InsertSort(int[] arr) {for(int i 1;i<arr.len…...

c语言速成系列指针上篇

那么这一篇文章带大家学习一下c语言的指针的概念、使用、以及一些注意事项。 指针的概念 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。就像其他变量或常量一样&#xff0c;您必须在使用指针存储其他变量地址之前&#xff0c;对其进行声明。 大白话讲解…...

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…...

网鼎杯 2020 玄武组 SSRFMe

复习一下常见的redis主从复制 主要是redis伪服务器的选择和一些小坑点 <?php function check_inner_ip($url) { $match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url); if (!$match_result) { die(url fomat error); } try { …...

纪念日文章:我的博客技术之路——两年回望

两年前的今天&#xff0c;我怀揣着对技术的热情和对知识的渴望&#xff0c;在CSDN这片技术的沃土上&#xff0c;播下了属于我自己的种子——“技术之路”https://jiubana1.blog.csdn.net/ 这个博客不仅是我个人技术成长的见证&#xff0c;更是我与广大技术爱好者交流、学习的桥…...

course-nlp——6-rnn-english-numbers

本文参考自https://github.com/fastai/course-nlp。 使用 RNN 预测数字的英文单词版本 在上一课中&#xff0c;我们将 RNN 用作语言模型的一部分。今天&#xff0c;我们将深入了解 RNN 是什么以及它们如何工作。我们将使用尝试预测数字的英文单词版本的问题来实现这一点。 让…...

qnx 查看cpu使用

http://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/h/hogs.html 【QNX】Hogs命令使用总结-CSDN博客 hogs hogs -S c #按照cpu排序 hogs -S m #按照内存排序 hogs -s 2 869113958 查看某一进程 hogs -% 10c 只看cpu超过…...

设备上CCD功能增加(从接线到程序)

今天终于完成了一个上面交给我的一个小项目&#xff0c;给设备增加一个CCD拍照功能&#xff0c;首先先说明一下本次使用基恩士的CCD相机&#xff0c;控制器&#xff0c;还有软件&#xff08;三菱程序与基恩士程序&#xff09;。如果对你有帮助&#xff0c;欢迎评论收藏&#xf…...

QT C++ QTableWidget 表格合并 setSpan 简单例子

这里说的合并指的是单元格&#xff0c;不是表头。span的意思是跨度、宽度、范围。 setSpan函数需要设定行、列、行跨几格&#xff0c;列跨几格。 //函数原型如下 void QTableView::setSpan(int row, i nt column, 、 int rowSpanCount,/*行跨过的格数*/ int columnSpanCount…...

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:医疗健康智能服务

北京天星医疗股份有限公司(简称“天星医疗”)作为国产运动医学的领导者&#xff0c;致力于提供运动医学的整体临床解决方案&#xff0c;公司坐落于北京经济技术开发区。应用于肩关节、膝关节、足/踝关节、髋关节、肘关节、手/腕关节的运动医学设备、植入物和手术器械共计300多个…...

Oracle 误删数据后回滚

使用闪回查询 使用闪回查询&#xff0c;可以回滚到指定时间点的数据&#xff0c;可以通过系统时间(YYYY-MM-DD HH24:MI:SS)或SCN回滚数据。 SQL> select * from tableName as of timestamp(sysdate-1/24); SQL> select * from tableName as of scn(123456); 3、闪回事务或…...

【RAG提升技巧】查询改写HyDE

简介 提高 RAG 推理能力的一个好方法是添加查询理解层 ——在实际查询向量存储之前添加查询转换。以下是四种不同的查询转换&#xff1a; 路由&#xff1a;保留初始查询&#xff0c;同时查明其所属的适当工具子集。然后&#xff0c;将这些工具指定为合适的选项。查询重写&…...

前端面试题日常练-day56 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. PHP中的预定义变量$_SERVER用于存储什么类型的数据&#xff1f; a) 用户的输入数据 b) 浏览器发送的请求信息 c) 服务器的配置信息 d) PHP脚本中定义的变量 2. 在PHP中&#xff0c;以下哪个函数…...

【frp】frpc客户端在ubuntu服务器上的配置

FRP简单配置内网穿透 官方仓库 ,说明比较简单 复杂一点要付费加入星球了。 而且frp还支持插件,目前还不清楚具体使用。 幸好,这位大神给出的非常详细 而且客户端与服务端都是部署在ubuntu的: 【frp】服务端配置与systemd启动 进行了frps的简单配置。 局域网内的机器是ubunt…...

构建LangChain应用程序的示例代码:20、使用LangChain的SQLDatabase包装器连接到Databricks运行时并执行查询操作教程

Databricks SQL 数据库连接 概述 这个笔记本介绍了如何使用LangChain的SQLDatabase包装器连接到Databricks运行时和Databricks SQL。 内容分为三个部分&#xff1a;安装和设置、连接到Databricks以及示例。 安装和设置 !pip install databricks-sql-connector # 安装Datab…...

PHP Standards Recommendations(PSR)

以下是 PHP Standards Recommendations&#xff08;PSR&#xff09;的全部内容&#xff1a; PSR-1&#xff1a;基础编码标准&#xff1a;规定了 PHP 代码的基本格式和要求&#xff0c;包括文件的编码、标签的使用、代码的组织等。PSR-2&#xff1a;编码风格指南&#xff1a;是对…...

[word] word2019中制表符的妙用 #媒体#笔记#知识分享

word2019中制表符的妙用 word2019表格功能是非常强大的&#xff0c;很多朋友都认为以前的制表符已经没有什么用途了&#xff0c;其实不然&#xff0c;在一切特殊的场合&#xff0c;word2019制表符还是非常有用的&#xff0c;下面就为大家介绍word2019中制表符的妙用。 步骤1、…...

探索Univer:构建企业级文档协作系统的全栈框架

探索Univer&#xff1a;构建企业级文档协作系统的全栈框架 【免费下载链接】univer Build AI-native spreadsheets. Univer is a full-stack framework for creating and editing spreadsheets on both web and server. With Univer Platform, Univer Spreadsheets is driven d…...

3步实现HTML到Word的智能转换:html-to-docx技术深度解析

3步实现HTML到Word的智能转换&#xff1a;html-to-docx技术深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 你是否曾遇到过这样的场景&#xff1f;精心设计的网页报告需要转换为Word文档进行…...

抖音a_bogus逆向实战:手把手教你用Node.js补全缺失的window环境

抖音a_bogus逆向实战&#xff1a;Node.js环境补全指南 在JavaScript逆向工程领域&#xff0c;浏览器环境与服务端环境的差异一直是开发者面临的棘手问题。当我们尝试将抖音网页端的加密逻辑&#xff08;如a_bogus生成算法&#xff09;移植到Node.js环境时&#xff0c;经常会遇到…...

思源宋体实战指南:7种字重构建与多语言字体优化技巧

思源宋体实战指南&#xff1a;7种字重构建与多语言字体优化技巧 【免费下载链接】source-han-serif Source Han Serif | 思源宋体 | 思源宋體 | 思源宋體 香港 | 源ノ明朝 | 본명조 项目地址: https://gitcode.com/gh_mirrors/sou/source-han-serif 思源宋体作为Adobe推…...

10分钟掌握Deep-Live-Cam:从零搭建实时AI换脸系统的完整指南

10分钟掌握Deep-Live-Cam&#xff1a;从零搭建实时AI换脸系统的完整指南 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-Live-Cam是…...

w3x2lni:魔兽地图跨版本兼容解决方案技术指南

w3x2lni&#xff1a;魔兽地图跨版本兼容解决方案技术指南 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 价值定位&#xff1a;破解魔兽地图版本壁垒 当你尝试在1.32.8版本魔兽争霸III中运行经典的1.24.4地图时&…...

Llama-3.2V-11B-cotGPU算力优化:双卡4090自动拆分模型实测报告

Llama-3.2V-11B-cot GPU算力优化&#xff1a;双卡4090自动拆分模型实测报告 1. 项目概述 Llama-3.2V-11B-cot是基于Meta最新多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡RTX 4090环境深度优化。作为一款11B参数规模的视觉推理工具&#xff0c;它解决了传统大模…...

利用快马ai快速构建基于jdk 17的spring boot web应用原型

最近在尝试快速搭建一个基于JDK 17的Spring Boot Web应用原型&#xff0c;发现用传统方式从零开始配置环境、搭建框架特别耗时。特别是JDK版本兼容性问题和依赖配置&#xff0c;经常要折腾半天。后来尝试了InsCode(快马)平台&#xff0c;整个过程变得异常简单&#xff0c;分享下…...

软件测试之压力测试总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是压力测试软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件…...

Stable Diffusion v1.5功能体验:Guidance Scale参数实测,教你调出最佳效果

Stable Diffusion v1.5功能体验&#xff1a;Guidance Scale参数实测&#xff0c;教你调出最佳效果 1. 引言&#xff1a;为什么Guidance Scale如此重要&#xff1f; 如果你用过Stable Diffusion生成图片&#xff0c;一定遇到过这样的情况&#xff1a;同样的提示词&#xff0c;…...