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

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

文章目录

  • MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅
    • 地图的扭曲
    • 搜索餐厅
      • 浏览数据
      • 查找当前邻居
      • 查找附近所有餐厅
      • 查找一定距离内的餐厅
      • 使用`$geoWithin`,不排序
      • 使用`$nearSphere`,排序

MongoDB通过对地理空间建立索引,可以对包含地理空间形状和点的集合上高效地执行空间查询,这边文章介绍了地理空间索引的的基本概念,介绍了地理空间查询的常用方法,演示了 $geoWithin$geoIntersects$nearSphere的使用。

这里以一个App为例,介绍如何来帮助用户查找纽约市的餐厅。App完成的功能有:

  • 使用$geoIntersects查询用户的邻居
  • 使用$geoWithin显示社区的餐厅数量
  • 使用$nearSphere查找用户指定距离内的餐厅

本文将使用2dsphere索引来查询有关球面几何的数据。

地图的扭曲

由于三维球体(例如地球)投影到平面上的原因,在地图上可视化时,球面几何形状会出现一定程度的扭曲。例如,采用由经纬度点 (0,0)、(80,0)、(80,80)和(0,80) 定义的球形正方形的规范。下图描绘了该区域所覆盖的区域:

地图扭曲

搜索餐厅

在进行后续的操作前,需要先准备一些数据,需要先下载邻居neighborhoods和餐厅restaurants的集合,并使用下面的命令将其导入数据库:

mongoimport restaurants.json -c=restaurants
mongoimport neighborhoods.json -c=neighborhoods

地理空间索引能在很大程度上提升$geoWithin$geoIntersects的查询性能,下面使用mongosh在对两个集合2dsphere索引:

db.restaurants.createIndex({ location: "2dsphere" })
db.neighborhoods.createIndex({ geometry: "2dsphere" })

浏览数据

查看mongosh中新创建的restaurants集合中的条目:

db.restaurants.findOne()

此查询返回下面的文档:

{location: {type: "Point",coordinates: [-73.856077, 40.848447]},name: "Morris Park Bake Shop"
}

餐厅对应的位置如下图所示:

餐厅位置

由于使用的是2dsphere索引,因此位置字段中的几何体数据必须遵循GeoJSON格式。

查看邻居neighborhoods集合中的一个条目:

db.neighborhoods.findOne()

查询将返回下面的文档:

{geometry: {type: "Polygon",coordinates: [[[ -73.99, 40.75 ],...[ -73.98, 40.76 ],[ -73.99, 40.75 ]]]},name: "Hell's Kitchen"
}

数据对应下面的图形显示的区域:

图形区域

查找当前邻居

如果用户的移动设备可以为用户提供准确的位置,那么使用$geoIntersects查找用户当前的邻居就很简单,
假设用户位于经度-73.93414657、纬度40.82302903,要查找当前的邻居,需要使用GeoJSON格式的$geometry 字段指定一个点:

db.neighborhoods.findOne({ geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } })

该查询返回以下结果:

{"_id" : ObjectId("55cb9c666c522cafdb053a68"),"geometry" : {"type" : "Polygon","coordinates" : [[[-73.93383000695911,40.81949109558767],...]]},"name" : "Central Harlem North-Polo Grounds"
}

查找附近所有餐厅

要查询给定区域中包含的所有餐厅,可以在mongosh中运行以下命令,可查询出所有餐厅,并计算该社区内的餐厅数量:

var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } } )
db.restaurants.find( { location: { $geoWithin: { $geometry: neighborhood.geometry } } } ).count()

查询显示,在所请求的社区内有127家餐厅,如下图所示:

区域内餐厅

查找一定距离内的餐厅

要查找某个位置指定距离内的餐厅,可以使用$geoWithin$centerSphere返回无序结果,或者使用$nearSphere$maxDistance(如需要按距离排序)。

使用$geoWithin,不排序

要查找圆形区域内的餐厅,可使用$geoWithin$centerSphere$centerSphere是MongoDB特有的语法,通过指定中心和半径(以弧度为单位)来表示圆形区域。

$geoWithin不会按任何特定顺序返回文档,因此它可能会先向用户显示最远的文档。下面的示例查找距离用户5英里以内的所有餐厅:

db.restaurants.find({ location:{ $geoWithin:{ $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] } } })

$centerSphere的第二个参数接受以弧度为单位的半径,因此必须除以以英里为单位的地球半径。

使用$nearSphere,排序

也可以使用$nearSphere,并指定以米为单位的$maxDistance(最大距离),将按照从最近到最远的排序方式,返回距离用户5英里范围内的所有餐厅:

var METERS_PER_MILE = 1609.34
db.restaurants.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE } } })

相关文章:

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin,不排序使用…...

从C++示例理解开闭原则

开闭原则要求我们在编写代码时,尽量不去修改原先的代码,当出现新的业务需求时,应该通过增加新代码的形式扩展业务而不是对原代码进行修改。 假如我们现在有一批产品,每个产品都具有颜色和大小,产品其定义如下&#xf…...

Java线程池execute和submit的区别

前言 ThreadPoolExecutor提供了两种方法来执行异步任务,分别是execute和submit,也是日常开发中经常使用的方法,那么它俩有什么区别呢? 语义不同 首先是语义上的不同。execute声明在Executor接口,它接受一个Runnable…...

什么是json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript编程语言的一个子集,但是由于其文本格式清晰、易于解析,并且能够以键/值对的形式表示复杂的数据结构,因此它被广泛用于不同的编程语言和…...

基于聚类和回归分析方法探究蓝莓产量影响因素与预测模型研究附录

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 目录 背景数据说明数据来源思考 附录数据预处理导入包以及数据读取数据预览数据处理 相关性分析聚类分析数据处理确定聚类数建立k均值聚类模型 …...

java类型转换

pom <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency>BeanUtils 在这里插入代码片list<Map>转换成List<bean> public static <T> L…...

Unity打包Webgl端进行 全屏幕自适应

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一&#xff1a;修改 index.html二&#xff1a;将非移动端设备&#xff0c;canvas元素的宽度和高度会设置为100%。三&#xff1a;修改style.css总结 下载地址&#x…...

36. 【Java教程】输入输出流

本小节将会介绍基本输入输出的 Java 标准类&#xff0c;通过本小节的学习&#xff0c;你将了解到什么是输入和输入&#xff0c;什么是流&#xff1b;输入输出流的应用场景&#xff0c;File类的使用&#xff0c;什么是文件&#xff0c;Java 提供的输入输出流相关 API 等内容。 1…...

Visual C++2010学习版详细安装教程(超详细图文)

Visual C 介绍 Visual C&#xff08;简称VC&#xff09;是微软公司推出的一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于开发C和C语言的应用程序。它提供了强大的编辑器、编译器、调试器、库和框架支持&#xff0c;以及丰富的工具和选项&#xff0c;使得开…...

matlab图像处理入门

matlab在学校科研&#xff0c;仿真及基于模型开发的工作中有重要作用&#xff0c;在图像处理方面由于省去了复杂的上位机开发流程&#xff0c;因此可以让用户快速开发验证算法&#xff0c;下面简要介绍其在图像处理方面的应用。 matlab开发图像处理算法的流程主要是&#xff0c…...

关于线程池面试题,使用“豆包”训练答案

我提问&#xff1a; 问题描述 下面是一个有关线程池调度的面试真题&#xff0c;来自于疯狂创客圈社群&#xff1a; 一个线程池的核心线程数为10个&#xff0c;最大线程数为20个&#xff0c;阻塞队列的容量为30。现在提交45个 任务&#xff0c;每个任务的耗时为500毫秒。 请问&…...

【WRF理论第二期】模型目录介绍

WRF理论第二期&#xff1a;模型目录介绍 1 WRF主目录2 WPS主目录3 编译后的可执行文件4 运行目录参考 了解 WRF 模型的目录结构有助于有效地管理和操作模型&#xff0c;从而确保模拟和分析工作的顺利进行。以下分解介绍WRF主目录、WPS主目录等。 Github-wrf-model/WRF 1 WRF…...

从了解到掌握 Spark 计算框架(一)Spark 简介与基础概念

文章目录 什么是 Spark&#xff1f;核心特点 Spark 对比 MapReduceSpark 编程模型RDDDataFrameDataset Spark 运行模式Spark 生态 什么是 Spark&#xff1f; Spark 是一个基于内存的分布式计算框架&#xff0c;最初由加州大学伯克利分校的 AMPLab 开发&#xff0c;后来捐赠给了…...

linux bind函数

bind函数的目的是让把客户端对应的端口(port)地址和ip地址绑定到客户端 [参考](Linux之bind 函数&#xff08;详细篇&#xff09;_linux bind函数-CSDN博客)...

Flink系列一:flink光速入门 (^_^)

引入 spark和flink的区别&#xff1a;在上一个spark专栏中我们了解了spark对数据的处理方式&#xff0c;在 Spark 生态体系中&#xff0c;对于批处理和流处理采用了不同的技术框架&#xff0c;批处理由 Spark-core,SparkSQL 实现&#xff0c;流处理由 Spark Streaming 实现&am…...

PySpark特征工程(III)--特征选择

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…...

Mongodb的数据库简介、docker部署、操作语句以及java应用

Mongodb的数据库简介、docker部署、操作语句以及java应用 本文主要介绍了mongodb的基础概念和特点&#xff0c;以及基于docker的mongodb部署方法&#xff0c;最后介绍了mongodb的常用数据库操作语句&#xff08;增删改查等&#xff09;以及java下的常用语句。 一、基础概念 …...

七大战略性新兴产业崭露头角:新能源电燃灶或将成为未来厨房新宠

近日&#xff0c;在国家发布的七大战略性新兴产业名单中&#xff0c;新能源产业赫然在列&#xff0c;作为其中的重要组成部分&#xff0c;华火新能源电燃灶凭借其独特的优势&#xff0c;正逐渐走进人们的视野&#xff0c;有望成为未来厨房的新宠。 华火新能源电燃灶作为清洁能源…...

C#进阶-用于Excel处理的程序集

在.NET开发中&#xff0c;处理Excel文件是一项常见的任务&#xff0c;而有一些优秀的Excel处理包可以帮助开发人员轻松地进行Excel文件的读写、操作和生成。本文介绍了NPOI、EPPlus和Spire.XLS这三个常用的.NET Excel处理包&#xff0c;分别详细介绍了它们的特点、示例代码以及…...

持续总结中!2024年面试必问 20 道 Kafka面试题(五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Kafka面试题&#xff08;四&#xff09;-CSDN博客 九、请解释Kafka中的Zookeeper的作用。 在Kafka中&#xff0c;ZooKeeper扮演着至关重要的角色&#xff0c;主要负责集群管理、协调和状态同步等功能。以下…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...