Mongodb地理信息数据查询

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第78篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。

通过阅读文档,了解Mongodb除了支持文档查询外,还支持地理信息坐标及临近查询。本文就对Mongodb对地理信息查询的支持进行介绍。

地理信息数据

在Mongodb数据库中,用户可以使用GeoJSON对象或者经纬坐标对的形式来保存地理信息数据。

GeoJSON对象

Mongodb使用GeoJSON对象保存数据以便于在地理空间中进行计算。用户使用嵌入文档的形式定义GeoJSON对象的数据,包括

  • 一个名为type的字段,定义了GeoJSON对象的类型
  • 一个名为coordinates的字段,指定了对象的坐标信息
<field>: { type: <GeoJSON type>, coordinates: <coordinates>}

如定义一个GeoJSON类型的点

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

当然,Mongodb也支持定义GeoJSON列表,具体可以参考本系列的其他文章。

Mongodb计算地理信息数据时,使用WGS84坐标系。

经纬坐标对

为了计算欧式距离,除了定义GeoJSON对象外,用户还可以将数据保存为经纬坐标对的形式,并建立一个平面二维索引。当用户将经纬坐标对转换成GeoJSON点类型的数据后,利用空间二维索引,Mongodb可以支持曲面空间数据计算。

用户可以使用数组或嵌入文档的形式,来保存坐标对数据。mongodb推荐用户使用数组的形式来保存数据。

<field>: [<x>, <y>]

或者使用经纬度坐标

<field>:[<经度坐标>, <纬度坐标>]

其中经度坐标范围在-180到180之间,包含-180和180. 而纬度坐标是-90到90之间,同样包含-90和90.

使用嵌入式文档的形式来定义坐标对

<field>: {<field1>: <x>, <field2>: <y>}

或者使用经纬度坐标来定义位置信息。

<field>: { <field1>: <longitude>, <field2>: <latitude>}

与使用数组定义一致,经度定义在-180到180之间,包含-180和180两个数值。纬度在-90到90之间,同样包含两个边界。

地理信息索引

为了提高地理信息查询的性能,mongodb允许用户添加地理信息索引来时间数据的快速查询和计算。

二维空间索引

二维空间索引,支持曲面地理信息计算

用户使用db.collection.createIndex建立二维空间索引. 其中<location field>可以是一个坐标对或者GeoJSON类型的对象。

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

二维平面索引

二维平面支持在两个维度的平面地理信息查询。尽管二维平面索引支持使用$nearSphere的空间查询,但用户在进行空间地理信息查询时,尽量使用二维空间索引。

用户使用db.collection.createIndex()方法,来创建二维平面索引。

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

其中,<location field>字段是坐标对。

地理信息查询

用户使用二维平面索引查询时,mongdb可能会返回错误的数据或者报错。例如二维平面索引不支持跨越极点的查询 。

地理信息查询操作符

mongodb提供了4个操作符 ,用于查询地理信息。

操作符

描述

$geoIntersects

查询相交的地理信息数据

$geoWithin

查询包含的地理信息数据

$near

查询临近的平面地理对象

$nearSphere

查询临近的空间地理对象

聚合管道中的地理信息操作符

mongodb同样提供了一个应用在聚合管道中的地理信息操作符

操作符

描述

$geoNear

查询临近指定点的空间数据文档, 与$match, $sort, $limit配合使用。输出文档包含了一个额外的距离字段。

地理信息模型

mongodb的地理信息查询可以在平面坐标系当中执行,也可以应用在空间查询当中。

使用二维空间索引时,只能进行空间当中的地理信息查询。而使用二维平面索引时,既可以进行平面空间查询,也可以进行部分空间查询。用户使用二维平面索引查询时,mongdb可能会返回错误的数据或者报错。下面的表格,列出了空间查询操作符所支持的查询空间类型和备注信息。

操作符

支持查询空间类型

$near(使用GeoJSON对象进行查询,集合中包含2d空间索引)

空间

$near(使用坐标对象进行查询,集合中包含2d平面索引)

平面

$nearSphere(GeoJSON点,二维空间索引)

空间

$nearSphere(坐标点,二维平面索引)

空间

$geoWithin: {$geometry:...}

空间

$geoWithin: {$box:...}

平面

$geoWithin: {$polygon:...}

平面

$geoWithin: {$center:...}

平面

$geoWithin: {$centerSphere:...}

空间

$geoIntersects

空间

聚合管道中的$geoNear, 带有二维空间索引

空间

聚合管道中的$geoNear, 带有二维平面索引

平面

应用

创建集合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.8308] },category: "Stadiums"}
]);

创建二维空间索引

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

编写查询语句,要求查询出距离点{ type: "Point", coordinates: [-73.9667, 40.78]一公里到五公里范围内的兴趣点。

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

构建管道查询,查询出点{ type: "Point", coordinates: [ -73.9667, 40.78 ] }附近的公园信息

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

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

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

相关文章

K8s部署一个nginx的应用

我们在mster节点上主要有两种部署应用的方式&#xff0c;一个是通过命令行的形式&#xff0c;一个是通过编写yaml文件的形式&#xff0c;类似linux中脚本一样。以下是部署nginx的例子&#xff1a; 一、通过命令行的方式 &#xff1a; 1、部署应用kubectl create deployment ngi…

IDEA中使用leetcode 刷题

目录 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 1.IDEA下载leetcode插件 2.侧边点开插件 3.打开网页版登录找到cookie复制 4.回到IDEA登录 5.刷题 6.共勉 算法题来了不畏惧&#xff0c; 挑战前行是成长的舞台…

qmt量化交易策略小白学习笔记第51期【qmt编程之期货列表--国债期货合约表】

qmt编程之获取期货列表 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 期货列表 #金融期货列表 提供当前时间段内有效的金融期货合约数据&#xff08;如行情数据等&#xff09;&#xff0c;…

AI实战案例!如何运用SD完成运营设计海报?玩转Stable Diffusion必知的3大绝技

大家好我是安琪&#xff01; Satble Diffusion 给视觉设计带来了前所未有的可能性和机会&#xff0c;它为设计师提供了更多选择和工具的同时&#xff0c;也改变了设计师的角色和设计流程。然而&#xff0c;设计师与人工智能软件的协作和创新能力仍然是不可或缺的。接下来我将从…

【LinuxC语言】UDP数据收发

文章目录 前言udp流程图udp函数介绍bind函数recvfrom函数sendto函数示例代码总结前言 在计算机网络中,UDP(用户数据报协议)是一种无连接的传输层协议,它允许应用程序快速地发送短的消息或数据报。由于UDP不需要建立和断开连接,因此它的传输速度往往比其他协议更快,但它也…

EfficientNet-V2论文阅读笔记

目录 EfficientNetV2: Smaller Models and Faster Training摘要Introduction—简介Related work—相关工作EfficientNetV2 Architecture Design—高效EfficientNetV2架构设计Understanding Training Efficiency—了解训练效率Training-Aware NAS and Scaling—训练感知NAS和缩放…

1、Python编程入门:从硬件基础到解释器类型

Python是一种免费、开源、跨平台、动态、面向对象的编程语言。它以其简洁易读的语法和强大的功能而闻名&#xff0c;广泛应用于各种领域&#xff0c;如Web开发、数据分析、人工智能等。本文将介绍Python的基本概念、执行方式以及常用的Linux命令&#xff0c;帮助初学者快速入门…

DHT11

第一个传感----DHT11 通过前面的学习&#xff0c;你已经学会了控制IO口、延时函数、串口的收发。接下来&#xff0c;你就可以借助以上的知识点完成自己的第一个传感器--DHT11啦&#xff01; DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。应用非常广…

【ai】tx2 nx : fix pip升级警告

jetson 环境同样出现:【原创】pip3 使用报警问题在对 Ubuntu 18.04 上的 pip3 9.0.1 版本使用 pip install -U pip 的方式进行升级后,再使用 pip 就会出现一堆警告信息。这个警告信息目前不影响使用,但从警告信息来看,会在未来版本中出现失败风险。 当前系统中存在了两个不…

【浅学】大模型(科普向_持续更新中)

【读者福利】大模型全套教程&#xff0c;微信扫码领取~ 1. 大模型概述 大模型是指具有数千万甚至数亿参数的深度学习模型。 当我们提及大模型时&#xff0c;通常指的是大语言模型&#xff08;Large Language Model&#xff0c;简称LLM&#xff09;&#xff0c;即文字问答模型…

RAID详解及配置实战

目录 一、RAID磁盘阵列及详解 1.1 了解RAID 1.1.1 简单理解 1.1.2 对比了解 1.2 RAID磁盘阵列介绍 1.3 RAID功能实现 1.4 RAID实现的方式 1.5 RAID级别详解 1.5.1 RAID -0 1.5.2 RAID -1 1.5.3 RAID -5 1.5.4 RAID -10&#xff08;RAID 10&#xff09; 1.6 阵列卡…

Vue的组件通信

前言 今天讲讲Vue的组件通信的几种方式 正文 父子通讯 – 父给子 父组件将值 v-bind 绑定传给子组件&#xff0c;子组件通过 degineProps 接收 接下来用一个代码示例讲解一下 父组件 value 是使用 ref 创建的响应式变量&#xff0c;用于绑定输入框的值。to 也是使用 ref 创…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.06.10-2024.06.15

文章目录~ 1.MIND: Multimodal Shopping Intention Distillation from Large Vision-language Models for E-commerce Purchase Understanding2.MDA: An Interpretable Multi-Modal Fusion with Missing Modalities and Intrinsic Noise3.VEGA: Learning Interleaved Image-Tex…

数据驭王: PostgreSQL教程指南解密

PostgreSQL教程大纲 一、介绍1.1 什么是PostgreSQL&#xff1f;1.2 PostgreSQL的历史和发展1.3 为什么选择PostgreSQL&#xff1f; 二、安装和设置2.1 下载和安装PostgreSQL2.2 配置PostgreSQL2.3 测试PostgreSQL 三、基本操作3.1 连接到PostgreSQL数据库步骤一&#xff1a;安装…

如何实现灌区闸门控制自动化?宏电“灌区哨兵”为灌区闸门控制添“智慧”动能

闸门控制站是节水灌溉工程中的重要组成部分。随着科技的不断进步和农田水利现代化的发展&#xff0c;传统的闸门控制和管理手段已经不能满足现代农业的发展要求。以宏电“灌区哨兵”为核心的闸门自动化控制系统&#xff0c;能有效解决灌区闸门距离远、数量多、不易操作、不好监…

PB12.5用DataWindow保存数据非法操作问题解析

在做一个WebService项目时&#xff0c;遇到个问题&#xff1a;在模拟请求WebService服务时&#xff0c;出现列机现象。经排查日志发现是在DataWindow的update时&#xff0c;死掉了。 排查分析&#xff1a; 1、在PB的数据库面板中&#xff0c;选中数据库表&#xff0c;点Grid显…

这次让我们隆重的介绍一下

深思熟虑之后&#xff0c;我诚挚地想要全面的介绍自己。若你的需求与我的专长恰好契合&#xff0c;我将以满心的热枕和真诚与你并肩作战&#xff0c;携手解决难题&#xff0c;一同追求卓越&#xff0c;实现我们的垂直成长。我是一名经验丰富且充满热情的技术人员。我热爱编程&a…

ApolloClient GraphQL 与 ReactNative

要在 React Native 应用程序中设置使用 GraphQL 的简单示例&#xff0c;您需要遵循以下步骤&#xff1a; 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器&#xff08;或使用公共 GraphQL 端点&#xff09;。从 React Native 应用中的…

CST软件中滤波器中外部耦合偏小怎么办

在电磁仿真领域&#xff0c;CST Studio Suite&#xff08;CST 工作室套装&#xff09;软件以其强大的功能和易用性而广受工程师和科研人员的青睐。然而&#xff0c;在使用CST软件进行滤波器设计时&#xff0c;有时会遇到外部耦合偏小的问题&#xff0c;这可能导致滤波器的性能不…

避开常见的坑,快速制作一个免费、交互式景区导游地图

目录 1 前言 2 注册登录 3 增加景区&#xff0c;注意设置地图中心点和级别 3.1 确定地图位置和缩放级别 3.2 新增景区&#xff0c;输入几个文本项目 3.3 可以继续调整地图位置和级别 4 增加景点 4.1 点击景点跳转错误 5 新增景区和景点介绍帖子&#xff0c;需要催一下…