MonogDB -索引 (三) GIS

mongodb GIS做电子围栏 思路 mongodb本身适合存地理数据,自带了函数 先将电子围栏存入mongodb中 每次点位是否在电子围栏外时向mongodb发送空间查询 资料: GeoJson数据详见:http://geojson.io/ SpringBoot+mongodb实现代码: /** * 电子围栏 */ @Data @AllArgsConstructor @NoArgsConstructor @Document(collection = "geographicalRegion") public class Geogr 阅读详情

一 2d Index

如下图的平面左边系,在其中有四个点A,B,C,D

 



1.使用mongo插入四个点
C:\dev\bin\mongodb-2.0.2\bin]]
>
mongo
MongoDB shell version: 2.0.2
connecting to: test
> db.createCollection("location"){ "ok" : 1 }
> db.location.save( {_id: "A", position: [0.001, -0.002]} )
> db.location.save( {_id: "B", position: [1.0, 1.0]} )
> db.location.save( {_id: "C", position: [0.5, 0.5]} )
> db.location.save( {_id: "D", position: [-0.5, -0.5]} )

2.创建2d索引
> db.location.ensureIndex( {position: "2d"} )


3.执行查询
查询距离圆心0.75范围内的点(毗邻关系)
> db.location.find( {position: 
                        { $near: [0,0], $maxDistance: 0.75  } 
                     } )
{ "_id" : "A", "position" : [ 0.001, -0.002 ] }
{ "_id" : "D", "position" : [ -0.5, -0.5 ] }
{ "_id" : "C", "position" : [ 0.5, 0.5 ] }

查询位于矩形[0.25,0.25],[1.0,1.0]为顶点的矩形内的点(包含关系)
> db.location.find( {position:
                       { $within: 
                          { $box: [ [0.25, 0.25], [1.0,1.0] ] } 
                       } 
                     } ) 
{ "_id" : "C", "position" : [ 0.5, 0.5 ] }
{ "_id" : "B", "position" : [ 1, 1 ] }

二  2sphere Index

1.准备数据 数据格式为GeoJSON 对象 
> db.baidugis.find()
{ "_id" : ObjectId("528ecd42b8ff14e242ac3129"), "id" : 1, "loc" : { "type" : "Point", "coordinates" : [  73.5,  39.31 ] }, "xoffset" : 0.009962485610003569, "yoffset" : 0.005924861040000451 }
{ "_id" : ObjectId("528ecd42b8ff14e242ac312a"), "id" : 2, "loc" : { "type" : "Point", "coordinates" : [  73.5,  39.32 ] }, "xoffset" : 0.009956379369995716, "yoffset" : 0.005926044680002462 }
{ "_id" : ObjectId("528ecd42b8ff14e242ac312b"), "id" : 3, "loc" : { "type" : "Point", "coordinates" : [  73.5,  39.33 ] }, "xoffset" : 0.009954659179996384, "yoffset" : 0.005929157739998914 }
{ "_id" : ObjectId("528ecd42b8ff14e242ac312c"), "id" : 4, "loc" : { "type" : "Point", "coordinates" : [  73.5,  39.34 ] }, "xoffset" : 0.009957397069996432, "yoffset" : 0.00593507193999443 }

2.创建2sphere Index
> db.baidugis.ensureIndex({loc:”2dsphere"})
注意:2dphere索引可以是一个复合索引,而且也不要求位置字段为第一索引 

3.查看索引
> db.baidugis.getIndexes()
[
     {
          "v" : 1,
          "key" : {
               "_id" : 1
          },
          "ns" : "GISNew.baidugis",
          "name" : "_id_"
     },
     {
          "v" : 1,
          "key" : {
               "loc" : "2dsphere"
          },
          "ns" : "GISNew.baidugis",
          "name" : "loc_2dsphere"
     }
] 

4.查询操作
在纠偏数据库中分别查询以经纬度[116.86,40.40]为中心,最大距离为20公里、200公里和2000公里的点的个数
> db.baidugis.find( {loc:
                                {$near:
                                          {$geometry:
                                                  {type:"Point", coordinates:  [116.86,40.40]},                       
                                                    $maxDistance:20000
                                          }
                                 }
                              }).count()
1325

> db.baidugis.find({loc:{$near:{$geometry:{type:"Point", coordinates:[116.86,40.40]},$maxDistance:200000}}}).count()
133158

> db.baidugis.find({loc:{$near:{$geometry:{type:"Point", coordinates:[116.86,40.40]},$maxDistance:2000000}}}).count()
6239311 


上面使用的$near的语法:

将查询出的经纬度点在地图上显示的效果图


三 总结
      
        通过在实际项目中使用MongoDB的地理位置索引发现其效果还是很不错的,将查询出的结果显示在地图上后基本是一个圆形,例如上图的显示效果,说明其计算是精确的。
        在大概拥有一千万个点的纠偏数据库中,单机情况下,查询20公里范围内的点的速度大概是1-2秒,查询200公里的点大概需要6-10秒,查询2000公里(小半个中国)的点大概需要二十分钟,  其查询性能还是可以接受的, 。


 参考:
      http://geojson.org/geojson-spec.html#id2      GeoJSON对象介绍
mongodb地理信息应用 1. 二维空间索引      MongoDB支持二维空间索引,这是设计时考虑到基于位置的查询。例如“找到离目标位置最近的N条记录”。并且可以有效地作为附加条件过滤。      如果需要使用这种索引,应确定对象中存储的字段是子对象或数组,前两个元素为X,Y坐标。 在文件中,存储的地理位置结构为: { loc : [ 50 , 30 ] }   { loc : { x : 50 , y : 阅读详情

相关推荐

MongoDB地理空间检索

在Mongodb种,想要运用它的地理空间检索,必须给相应字段建立索引,主要有2d、2dsphere这两种索引, 建立的语法分别为: db.集合名.createIndex({"字段1": "2d"}) db.集合名.createIndex({"字段2": "2dsphere"}) $near、$nearSphere是Mongodb中用来获取某一基准点的邻近点、并且由近至远排好序的操作。他们都...

tb_0840297的专栏 1001

基于Springboot使用MongoDB进行简单Gis操作

MongoDB使用json数据结构进行数据存储和组织,并提供了对gis的操作支持。mongoDB中基于GeoJson数据格式存储地理信息,并提供了一组函数对地理信息进行操作。因为项目需要,需要进行简单gis操作。在此就简单应用详述一二。GeoJson数据格式  GeoJson数据本质是一个json字符串,保存地理位置信息。 关于GeoJson数据的详细形式,及说明可参见官网。 下面列举项目中一个

南熏门前一只喵 5450

MongoDB在煤炭行业GIS数据存储方面的应用

GIS在煤炭行业拥有广泛的应用,是提高煤炭生产效率的有效保障。GIS数据具有数据量大,数据类型多样,结构复杂等特点,这些特点给GIS数据的存储带来了难题。MongoDB是一种文档型数据库,主要解决的是海量数据的访问效率问题。文章详细介绍MongoDB在存储GIS数据方面的应用。

【GIS】——mongodb

占位

To Begin,Begin   910

STM32CubeMx搭建LWIP程序

  使用STM32CubeMx5.21,在stm32f745平台上搭建ethernet通信程序,PHY选用KSZ8081RNB。(LAN8742/DP83848使用一样) 1、系统时钟设置   RCC设置,勾选外部高速时钟源。   系统时钟配置。写入外部晶振频率、HSE提供PLCCLK、HCLK,其他参数自动生成。 2、ETH设置   勾选设置NVIC。   根据硬件设置对应GPIO引脚。   参数设置默认   根据硬件设置PHY地址,其他参数默认。 3、LWIP设置   勾选使能,通用参数设置

Gandalf94的博客 3238

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南)

本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。

weixin_28419039的博客 252

《MongoDB权威指南》学习整理----MongoDB对GIS应用的支持

地理空间索引 地理空间索引是MongoDB专门为当前热门的GIS应用提供的特殊索引支持。这种索引和普通的索引创建、删除方式相同,不同的是这种索引的在创建时候的值: 创建方法 db.collection.ensureIndex({keyName:"2d"},{'min':-1000,max:1000}) 注意,这里使用的是"2d"而不是表示排序的1或-1。同时对key的值当然也有比较严格要求

学习空间 4006

解题报告-美团点评2017秋招笔试编程题--常见动态规划问题

晚上就要美团笔试了,在牛客上刷套美团的题练练手,四道题目全都是典型题目,经典的连题面都懒得改那种,也都不难,很基础的动态规划问题。[编程题] 大富翁游戏时间限制:1秒空间限制:32768K大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。 输...

聂小白的专栏 1719

MongoDB 空间地理 教程1

MongoDB 空间地理 教程1

lizhengyu891231的博客 1012

WPF插件架构-如何动态加载封装好的第三方DLL的界面

插件架构中如何自动加载第三方DLL中的UI界面

lg24k的博客 1882

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3415

MongoDB的GeoSpatial索引

最近一直在做基于LBS的项目,地标的坐标索引和基于坐标查询,一直没找到一种简单方便的方法,在做mongo索引优化的时发现竟然有Geo的索引 1. 创建字段 建议使用方式:{ loc : [ longitude , latitude] } 也可以:{ loc : { lon :longitude, lat:latitude } } Loc自己决定,我用poi的 2. 建立索引,注...

weixin_30760895的博客 147

079、LVGL基础控件:消息框(Msgbox)

《LVGL消息框控件深度解析与避坑指南》 文章深入剖析了LVGL消息框控件的核心特性和使用技巧。消息框本质是带按钮的模态容器,而非独立窗口。作者分享了创建消息框的正确姿势、标题/内容设置方法、安全的按钮事件处理方式(避免直接调用close函数导致栈溢出),并详细介绍了模态/非模态实现、样式自定义、动态更新等实用技巧。针对常见问题如内存管理、按钮数量限制、动画效果等给出了专业建议,特别强调了消息框作为用户交互关键环节的优化重要性,建议通过异步删除、合理父对象选择等方式提升稳定性。文章包含大量实际项目经验总结,

m0_50546716的博客 153

ArcGIS支持MongoDB数据源

自从NoSQL推出之后,MongoDB就作为比较杰出的代表受到广大用户的推崇,当然,与之而来的大数据的讨论也非常激烈,GIS数据源向来都是以海量来计算,所以,GIS与大数据、GIS与NoSQL,ArcGIS与NoSQL就不谋而合了,其实在去年的Esri全球用户大会也有关于ArcGIS与MongoDB的相关PPT讲座。在2012年5月份的Esri官方博客也提到了ArcGIS支持Plugin方式的Mo

积思园 1万+

(考研湖科大教书匠计算机网络)第四章网络层-第三节3、4:划分子网的IPv4地址和无分类IP地址

子网掩码: 32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号子网掩码使用连续的比特1来对应网络号和子网号子网掩码使用连续的比特0来对应主机号将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址如下图。

快乐江湖的博客 1348

【电容/电感】电路板会“滋滋”的响,我们称它为啸叫

一、啸叫的起源 大部分硬件工程师应该都遇到过,PCBA上电后出现“滋滋滋”的叫声,其声响或大或小,或时有时无,或深沉或刺耳,或变化无常者皆有。该现象我们称为“啸叫”,一般分为电感啸叫和电容啸叫。

云轩阁 6万+

经纬度100w数据快速排序elasticSearch、postgis、mongodb对比

环境:elasticSearch2.4.6版本 安装 head插件 ik中文分词器    条件:1000000 条数据 距离排序加上id排序. 耗时 0.096 秒环境:postgresql10 最新版 插件postgis   条件:100w 数据不做优化排序需要两秒(这种方式需要计算出距离再排序)环境:mongodb3.6   1000w数据创建索引加分页需要2920毫秒...

lei278975868的专栏 2705

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mongodb 数据库应用

mongodb 数据库应用

GIS摆渡人 626

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MongoDB的地埋空间数据存储、空间索引以及空间查询

【本文原始链接:http://blog.3sdn.net/320.html,转载时请完整保留】 一、关于MongoDB 在众多NoSQL数据库,MongoDB是一个优秀的产品。其官方介绍如下:  MongoDB (from "humongous") is a scalable, high-performance, open source, document-oriented

秋水之城 6842

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

利用Mongodb做地理空间查询

MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 前言 在移动开发中,经常会用到定位的功能,例如美团、饿了么、猫眼电影等的app,都是使用了移动端定位,然后查找出自己地理位置附近的一些服务、信息。 所以本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。 分析 举个例子,我们需要做一个app,商家可以把...

weixin_30474613的博客 340

mongodb 索引详解(一)

原文链接:https://docs.mongodb.com/manual/indexes/ 默认_id 索引 创建索引 索引类型 索引属性 索引使用 索引及排序规则 覆盖查询 交叉索引 约束 其他考量 其他资源 索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个...

jing_flower的博客 2405

MongoDB的JavaScript驱动使用示例

MongoDB的JavaScript驱动使用示例,供大家参考!

gisxy的专栏 1737

Mongodb GeoJSON 地理数据处理 其实我也很厉害

相信如果提起地理数据的处理,首先想起的数据库就是postgis, 对大名鼎鼎的postgresql +插件的方式来将POSTGRESQL 变成纯纯的地理数据处理的数据库,这是人尽皆知和...

sql server的专栏 2024

MongoDB: 构造百万级数据(八)

索引的性能提现必须要有大量数据才能看出来,你说你有10条20条数据,这是根本看不出来效果的,这次就通过随机数的方法,创造出一个百万级数据的数据库出来。 安装Node 为了调试代码方便,我们安装Node,用来在终端中执行js,查看结果。 Node下载地址:https://nodejs.org/en/ (直接下载LTS版本就可以了) 安装非常简单,只要会安装QQ,就应该可以安装上,一直下一步也...

何建的博客 2569

MongoDB导入Shapefile数据

两种解决方案: 一、将整个shapefile转为GeoJSON然后直接导入mongoDB数据库中 首先,将shapefile数据转为WGS84地理坐标,然后使用GDAL的命令行工具ogr2ogr进行格式的转换,转换命令如下: ogr2ogr -f geoJSON continents.json continents.shp 删除生成JSON文件的前两行{ "type": "FeatureCo

给永远比拿愉快 3752
上一篇: MongoDB - 索引 (二)使用
下一篇: MonogDB -索引(一)概述
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值