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

本文主要是介绍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操作:地理位置应用——通过地理空间查询查找餐厅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031780

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.