MongoDB CRUD操作:地理位置查询

news2024/10/7 0:54:48

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"
      }
   }
] )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kaggle——Deep Learning(使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络)

1.单个神经元 创建一个具有1个线性单元的网络 #线性单元 from tensorflow import keras from tensorflow.keras import layers #创建一个具有1个线性单元的网络 modelkeras.Sequential([layers.Dense(units1,input_shape[3]) ]) 2.深度神经网络 构建序列模型 #构建序列模型 …

【vue3|第6期】如何正确地更新和替换响应式对象reactive

日期&#xff1a;2024年6月5日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

【Linux取经路】守护进程

文章目录 一、前台进程和后台进程二、Linux 的进程间关系三、setsid——将当前进程设置为守护进程四、daemon——设置为守护进程五、结语 一、前台进程和后台进程 Linux 中每一次用户登录都是一个 session&#xff0c;一个 session 中只能有一个前台进程在运行&#xff0c;键盘…

AppInventor2有没有删除后的撤销功能?

问&#xff1a;不小心删除了组件&#xff0c;能撤回吗&#xff1f; 答&#xff1a;界面&#xff08;组件&#xff09;设计界面&#xff0c;没有撤销功能。代码&#xff08;逻辑&#xff09;设计视图&#xff0c;可以使用 CtrlZ 撤销&#xff0c;CtrlY 反撤销。 界面设计没有撤…

搜索与图论:树的重心

搜索与图论&#xff1a;树的重心 题目描述参考代码 题目描述 输入样例 9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6输出样例 4参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M N * 2;int n, m…

JavaWeb_SpringBootWeb案例

环境搭建&#xff1a; 开发规范 接口风格-Restful&#xff1a; 统一响应结果-Result&#xff1a; 开发流程&#xff1a; 第一步应该根据需求定义表结构和定义接口文档 注意&#xff1a; 本文代码从上往下一直添加功能&#xff0c;后面的模块下的代码包括前面的模块&#xff0c…

新能源管理系统主要包括哪些方面的功能?

随着全球对可持续发展和环境保护的日益重视&#xff0c;新能源管理系统已成为现代能源领域的核心组成部分。这一系统不仅涉及对新能源的收集、存储和管理&#xff0c;还包括对整个能源网络进行高效、智能的监控和控制。以下是新能源管理系统主要包含的几方面功能&#xff1a; 一…

ESP32 Error creating RestrictedPinnedToCore

随缘记&#xff0c;刚遇到&#xff0c;等以后就可能不想来写笔记了。 目前要使用到音频数据&#xff0c;所以去用ESP-ADF&#xff0c;但在使用例程上出现了这个API有问题&#xff0c;要去打补丁。 但是我打补丁的时候git bash里显示not apply&#xff0c;不能打上。 网上看到…

谷歌账号的注册到使用GitHub

一、浏览器扩展 浏览器扩展谷歌学术 二、注册谷歌邮箱 https://support.google.com/accounts/answer/27441?hlzh-hans 1.打开无痕模式&#xff08;ctrlshiftn&#xff09; 2.输入网址 3.选择个人账号 4.填写信息&#xff08;随便填就行&#xff09; &#xff08;以上步骤有时…

FTP

文章目录 概述主动模式和被动模式的工作过程注意事项 概述 文件传输协议 FTP&#xff08;File Transfer Protocol&#xff09;在 TCP/IP 协议族中属于应用层协议&#xff0c;是文件传输标准。主要功能是向用户提供本地和远程主机之间的文件传输&#xff0c;尤其在进行版本升级…

【YOLOV8】2.目标检测-训练自己的数据集

Yolo8出来一段时间了,包含了目标检测、实例分割、人体姿态预测、旋转目标检测、图像分类等功能,所以想花点时间总结记录一下这几个功能的使用方法和自定义数据集需要注意的一些问题,本篇是第二篇,目标检测功能,自定义数据集的训练。 YOLO(You Only Look Once)是一种流行的…

基于element ui 城市选择之间的级联选择

通过el-select实现城市的级联选择效果如图所示 代码实现 <template><div><el-form :model"ruleForminfo"><el-form-item label"居住地址" required><el-col :span"6"><el-form-item ><el-select v-mode…

tsconfig.json和tsconfig.app.json文件解析(vue3+ts+vite)

tsconfig.json {"files": [],"references": [{"path": "./tsconfig.node.json"},{"path": "./tsconfig.app.json"}] }https://www.typescriptlang.org/tsconfig/#files files: 在这个例子中&#xff0c;files 数…

表格中附件的上传、显示以及文件下载#Vue3#后端接口数据

表格中附件的上传及显示#Vue3#后端接口数据 一、图片上传并显示在表格中实现效果&#xff1a; 表格中上传附件 代码&#xff1a; <!-- 文件的上传及显示 --> <template><!-- 演示地址 --><div class"dem-add"><!-- Search start -->…

手写节流throttle

节流throttle 应用场景 滚动事件监听scroll&#xff1a;例如监听页面滚动到底部加载更多数据时&#xff0c;使用节流技术减少检查滚动位置的频率&#xff0c;提高性能。鼠标移动事件mousemove&#xff1a;例如实现一个拖拽功能&#xff0c;使用节流技术减少鼠标移动事件的处理…

PHPStudy(xp 小皮)V8.1.1 通过cmd进入MySQL命令行模式

PHPStudy是一个PHP开发环境集成包&#xff0c;可用在本地电脑或者服务器上&#xff0c;该程序包集成最新的PHP/MySql/Apache/Nginx/Redis/FTP/Composer&#xff0c;一次性安装&#xff0c;无须配置即可使用。MySQL MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL A…

MongoDB环境搭建

一.下载安装包 Download MongoDB Community Server | MongoDB 二、双击下载完成后的安装包开始安装&#xff0c;除了以下两个部分需要注意操作&#xff0c;其他直接next就行 三.可视化界面安装 下载MongoDB-compass&#xff0c;地址如下 MongoDB Compass Download (GUI) | M…

使用LeanCloud平台的即时通讯

LeanCloud 是领先的 Serverless 云服务&#xff0c;为产品开发提供强有力的后端支持&#xff0c;旨在帮助开发者降低研发、运营维护等阶段投入的精力和成本。 LeanCloud 整合了各项服务&#xff0c;让开发者能够聚焦在核心业务上&#xff0c;为客户创造更多价值。 *即时通讯 …

15、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、plot()函数默认格式画图 代码&#xff1a; x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) 2、X轴和Y轴显示范围/axis()函数 代码&#xff1a; x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) axis([0 21 -1.1 1.1])%设置范围 3、网格显示/grid on函数 代码&#xff1a; …

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

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