Geospatial Queries On Mongodb

2023-11-04 10:10
文章标签 mongodb queries geospatial

本文主要是介绍Geospatial Queries On Mongodb,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

Mongodb可以做地理空间的查询cuiyaonan2000@163.com,对应的数据结构是GeoJson.所以需要先了解GeoJson.

参考资料:

  1. GeoJSON
  2. https://docs.mongodb.com/manual/geospatial-queries/
  3. MongoDB地理空间功能简介_danpu0978的博客-CSDN博客

GeoJson

我们知道Bson是二进制数据,且是Mongodb存储数据的格式.GeoJSON是一种用于使用JSON编码各种地理数据结构的格式,并支持以下类型:PointLineStringPolygonMultiPointMultiLineString, and MultiPolygon.。 

GeoJson在Mongodb的使用其实很简单,GeoJson在Mongodb的文档中就是一个属性,但是该属性是个对象.该对象只有2个属性type和coordinates. 即geojson在mongodb就是一个嵌入式文档且只有type和coordinates两个属性.

一个实例如下所示:(其中loaction对象为GeoJson对象)

db.集合名称.insert({"name" : "cuiyaonan2000@163.com","age" : "18","code" : "god","location" : {"type" : "Point","coordinates" : [ -73.778889, 40.639722 ]}
}

GeoJson Type 

使用Monodb的地理信息系统,还有有条件的具体可以查看官网的要求如下所示. 主要的就是关注该Mongodb是基于WGS 84 (度,分,秒)系统的纬度和经度的一点。 

Point

{ type: "Point", coordinates: [ 40, 5 ] }

LineString

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

Polygons with a Single Ring

闭合的范围,开始经纬度与结束经纬度必须一样

{type: "Polygon",coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
}

Polygons with Multiple Rings

闭合的范围,开始经纬度与结束经纬度必须一样

{type : "Polygon",coordinates : [[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ],[ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]]
}

上图对应的格式如下:

MultiPoint

{type: "MultiPoint",coordinates: [[ -73.9580, 40.8003 ],[ -73.9498, 40.7968 ],[ -73.9737, 40.7648 ],[ -73.9814, 40.7681 ]]
}

MultiLineString

{type: "MultiLineString",coordinates: [[ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],[ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],[ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],[ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]]
}

MultiPolygon

闭合的范围,开始经纬度与结束经纬度必须一样

{type: "MultiPolygon",coordinates: [[ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ], [ -73.958, 40.8003 ] ] ],[ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.958, 40.8003 ] ] ]]
}

GeometryCollection

闭合的范围,开始经纬度与结束经纬度必须一样

{type: "GeometryCollection",geometries: [{type: "MultiPoint",coordinates: [[ -73.9580, 40.8003 ],[ -73.9498, 40.7968 ],[ -73.9737, 40.7648 ],[ -73.9814, 40.7681 ]]},{type: "MultiLineString",coordinates: [[ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],[ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],[ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],[ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]]}]
}

Mongodb查询

如上我们存储了坐标,那么怎么使用mongodb来进行查询判断目标点是否在指定的范围内呢?

除了按照GeoJson来存储数据外,还需要在GeoJson上建立指定的索引才能进行查询cuiyaonan2000@163.com

Index type

GeoJson可以创建的索引如下所示:

  • 2d索引 :使用简单坐标(经度,纬度)。 如文档中所述: 2d索引用于MongoDB 2.2及更早版本中使用的旧坐标对 。 基于这个原因,在这篇文章中我将不做任何详细说明。 仅用于记录2d索引用于查询存储为二维平面上的点的数据
  • 2d球形索引 :支持查询类似地球的球形上的任何几何图形,数据可以存储为GeoJSON和传统坐标对(经度,纬度)。 在本文的其余部分,我将使用这种类型的索引,重点介绍GeoJSON。
  • Geo Haystack :用于在很小的区域进行查询。 今天它已为应用程序所用,因此在本文中不再赘述。

创建2dsphere索引

我们需要在GeoJson对应的属性上创建索引

Mongodb提供的查询方法

具体使用参考官方api:https://docs.mongodb.com/manual/geospatial-queries/

示例:


//创建索引
db.集合名称.ensureIndex( { polygons: "2dsphere" } 
);//插入记录
db.集合名称.insert({polygons:{type:"Polygon",coordinates:[[[113.314882,23.163055],[113.355845,23.167042],[113.370289,23.149564],[113.356779,23.129758],[113.338238,23.13913],[113.330979,23.124706],[113.313588,23.140858],[113.323865,23.158204],[113.314882,23.163055],]]}}
);//查询该店是否在电子围栏内
//在的话就返回电子围栏的点,不在的话就返回空
db.集合名称.find({polygons:{$geoIntersects:{$geometry:{ "type" : "Point","coordinates" : [113.330908,23.155678] }}}}
);

这篇关于Geospatial Queries On Mongodb的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo

mongodb简单入门

一篇较好的mongodb常用操作命令:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html mongodb的java操作:http://www.cnblogs.com/cyhe/p/5451421.html

mongodb自启动脚本.md

可粘贴文本(不全): #!/bin/sh##chkconfig: 2345 80 90#description:mongodb#processname:mongodbif test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/e

MongoDB学习—(6)MongoDB的find查询比较符

首先,先通过以下函数向BookList集合中插入10000条数据 function insertN(obj,n){var i=0;while(i<n){obj.insert({id:i,name:"bookNumber"+i,publishTime:i+2000})i++;}}var BookList=db.getCollection("BookList")调用函数,这样,BookList

MongoDB学习—(5)修改器$inc,$unset,$push,$pushAll,$allToSet,$pop,$pull,$pullAll

通过db.help()可以查询到关于数据库的操作,一查询发现有很多方法 其中有一个方法为db.getCollection(cname),即通过这一个函数,传入数据库中的一个集合的名称来获取到该集合的一个对象,我们可以编写函数   function insertTenRecord(obj){ var i=0; while(i++<10){ obj.insert({id:i+1,a

MongoDB学习—(4)文档的插入,删除与更新

一,文档的插入 插入命令有两个一个为insert,另一个为save,两者的区别为 db.[documentName].insert({..})插入的数据不允许重复,即_id不可相同 db.[docuemntName].save({..})插入的数据允许重复,如果整条数据内容相同,则不发生替换,如果数据有做不同,则将原数据替换 二,删除文档数据 db.[docuementName].r

MongoDB学习—(3)shell的基本操作

一,删除数据库中的集合文档 命令为 db.[documentName].drop() 二,删除数据库 命令为 db.dropDatabase() 执行该命令时,应该先进入想要删除的数据库中,如 三,shell中的help 我们可以运用shell中的help来查询相关的操作,查询数据库相关的就用db.help(),查询集合相关的就用db.[documentName].help

MongoDB学习—(2)shell的基本操作

一,创建一个数据库 使用use关键字,格式为 use [databasename] 当你这样创建一个数据库时,该数据库只是创建于内存中,只有你对数据库执行一些操作后,数据库才真正的创建,否则如果直接关掉mongodb,数据库在内存中会被删除掉。 二,查看所有数据库 命令为 show dbs Mysql中的命令为show databases,两者有所不同。 三,查看数据库中的现有的文