本文主要是介绍Geospatial Queries On Mongodb,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
序言
Mongodb可以做地理空间的查询cuiyaonan2000@163.com,对应的数据结构是GeoJson.所以需要先了解GeoJson.
参考资料:
- GeoJSON
- https://docs.mongodb.com/manual/geospatial-queries/
- MongoDB地理空间功能简介_danpu0978的博客-CSDN博客
GeoJson
我们知道Bson是二进制数据,且是Mongodb存储数据的格式.GeoJSON是一种用于使用JSON编码各种地理数据结构的格式,并支持以下类型:Point
, LineString
, Polygon
, MultiPoint
, MultiLineString
, 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!