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

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

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

相关文章

拿笔记下来!产品采购制造类合同怎样写比较稳妥?

拿笔记下来&#xff01;产品采购制造类合同怎样写比较稳妥&#xff1f; 近日&#xff0c;几经波折&#xff0c;泰中两国终于完成了潜艇采购谈判&#xff01;你知道吗&#xff1f;产品制造类合同或协议在起草前如果没有充分考虑各种因素&#xff0c;可能会导致一系列问题和不利…

C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

无人监控视频输出卡顿状态

设计思路&#xff0c;如下&#xff1a; 1.通过采集卡将视频信号输出到个人PC中 2.PC按设置好的时间&#xff0c;视频属性分片保存 3.将步骤2中的视频&#xff0c;按预处理要求&#xff0c;得到待计算的视频片段 4.使用SSIM算法计算预处理后的视频&#xff0c;将计算得到的数据存…

聊天机器人的实践过程

一、语聊机器人 OpenAI 的爆火&#xff0c;到如今也才一年多的时间&#xff0c;然而在过去的一年中&#xff0c;生成式AI的落地场景几乎 80%都是 ChatBot 的形式&#xff0c;那么今天这篇文章我们就来聊一下&#xff0c;生成式AI和IM能擦出怎么样的火花&#xff1f;以及各种场…

p13idea的其他操作

1 导入模块 错误示范&#xff1a; 正确示范&#xff1a; 2 删除模块 必须用delete才能删除干净&#xff0c;用remove删了之后还要回到文件里面把它删除掉

有钱还系统源码 人人还众筹还钱模式还贷系统源码

盈利模式&#xff1a; 1.系统里直推400 2.间推得200 3.升级是隔代匹配200 4.漏单直接设置归系统 5.九级匹配不到直接归平台 有钱还平台新注册会员&#xff0c;即新入的负债者要分9次分别资助先来的11名负债者每人200元&#xff0c;这笔资助不是一次性给到对方&#xff0c…

Mybatis的一级缓存

缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。 Mybatis和Hibernate一样&#xff0c;也有一级和二级缓存&#xff0c;同样默认开启的只有一级缓存&#xff0c;二级缓…

脑部磁共振成像肿瘤分割方法(MATLAB 2018)

近年脑肿瘤发病率呈上升趋势&#xff0c;约占全身肿瘤的5%&#xff0c;占儿童肿瘤的70%。CT、MRI等多种影像检查方法可用于检测脑肿瘤&#xff0c;其中MRI应用于脑肿瘤成像效果最佳。精准的脑肿瘤分割是病情诊断、手术规划及后期治疗的必备条件&#xff0c;既往研究者对脑部肿瘤…

Python知识点12---Python的I/O操作

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的流(I/O)操作&#xff0c;最简单的其实就是输入和输出&#x…

工厂的精益生产如此重要

什么是工厂的精益生产 精益生产&#xff08;Lean Manufacturing&#xff09;是一种起源于20世纪50年代日本丰田汽车公司的生产管理哲学。它的核心理念是通过消除生产过程中的浪费&#xff0c;优化流程&#xff0c;提高效率&#xff0c;从而实现成本降低和质量提升。精益生产不仅…

VRTK4.0学习——(二)

手柄绑定以及显示 1.导入CameraRigs.UnityXRPluginFramework 和 CameraRigs.TrackedAlias 预设&#xff0c;将CameraRigs.UnityXRPluginFramework拖入CameraRigs.TrackedAlias的Elements中即可&#xff0c;运行软件后即可看到手柄了 注&#xff1a;如果无法看到手柄&#xff…

MySQL:MySQL执行一条SQL查询语句的执行过程

当多个客户端同时连接到MySQL,用SQL语句去增删改查数据,针对查询场景,MySQL要保证尽可能快地返回客户端结果。 了解了这些需求场景,我们可能会对MySQL进行如下设计: 其中,连接器管理客户端的连接,负责管理连接、认证鉴权等;查询缓存则是为了加速查询,命中则直接返回结…

系统介绍在线直线度测量仪的测量原理

测头的测量原理 蓝鹏光电测头采用的是CCD成像法测量&#xff0c;CCD成像法是指将被测物放置在物方远心光路系统中进行成像&#xff0c;并利用成像位置的CCD芯片接收成像信息进行尺寸测量的方法。该测量方法的优点主要有两个&#xff1a;一是成像边界清晰&#xff0c;光电信号可…

从墙的功能出发 -分析欧特克Revit和广联达数维的差别

欧特克&#xff08;Autodesk&#xff09;在三维建模软件领域的影响力是有目共睹的&#xff0c;它是行业的头部产商&#xff0c;拥有众多的高质量的三维设计软件&#xff0c;涵盖了建筑设计、机械设计与制造和电影文娱行业。Revit是其发布的建筑三维建模软件&#xff0c;也是BIM…

如何用个人电脑搭建一台本地服务器,并部署项目到服务器详细教程(Ubuntu镜像)

前言 VirtualBox虚拟机软件是一款强大、免费且开源的虚拟化工具&#xff0c;它允许用户在单一物理机器上同时运行多个操作系统。他对比VMware就是更轻量级的虚拟机软件&#xff0c;而且操作更简单。 下载地址&#xff1a;Download_Old_Builds_7_0 – Oracle VM VirtualBox …

SpringMVC日期格式处理 分页条件查询

实现日期格式处理 实现分页条件查询&#xff1a; 分页条件查询 和 查询所有 是两个不同的方法&#xff0c;使用同一个mapper的查询功能&#xff0c;但是两个不同的业务方法 ​​​​​​​

24年西藏事业单位报名详细流程

✨各位姐妹们注意啦&#xff01;24西藏事业单位公告已出&#xff0c;本次计划公开招聘8⃣9⃣9⃣人即日起开始报名&#xff0c;想要上岸的姐妹们要抓紧了哦✊趁着还有时间赶紧开卷&#xff01;&#xff01;&#xff01; &#x1f308;24西藏事业单位招聘考试&#xff1a; &…

k8s练习--StorageClass详细解释与应用

文章目录 前言StorageClass是什么 一、实验目的配置过程 二、实验环境实验步骤一、配置网络存储NFS&#xff1a;1.主机基础配置2.配置 NFS: 二、开启rbac权限:三、创建nfs-deployment.yaml四、创建storageclass资源五、验证&#xff1a;1&#xff0e;创建PVC验证2.创建一个pod验…

C++青少年简明教程:数组

C青少年简明教程&#xff1a;数组 C数组是一种存储固定大小连续元素的数据结构。数组中的每个元素都有一个索引&#xff0c;通过索引可以访问或修改数组中的元素。 在C中&#xff0c;数组中的元素数据类型必须一致。数组是一个连续的内存区域&#xff0c;用于存储相同类型的元…

期权懂带你懂50etf认沽期权和认购期权有什么区别?

今天带你了解期权懂带你懂50etf认沽期权和认购期权有什么区别&#xff1f;在金融市场中&#xff0c;期权是一种允许持有者在未来某个时间以特定价格买入或卖出基础资产的金融衍生品。 50etf认沽期权和认购期权有什么区别&#xff1f; 50ETF认沽期权和认购期权的主要区别在于它…