Mongodb可以做地理空间的查询cuiyaonan2000@163.com,对应的数据结构是GeoJson.所以需要先了解GeoJson.
参考资料:
- GeoJSON
- https://docs.mongodb.com/manual/geospatial-queries/
- MongoDB地理空间功能简介_danpu0978的博客-CSDN博客
我们知道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 typeGeoJson可以创建的索引如下所示:
- 2d索引 :使用简单坐标(经度,纬度)。 如文档中所述: 2d索引用于MongoDB 2.2及更早版本中使用的旧坐标对 。 基于这个原因,在这篇文章中我将不做任何详细说明。 仅用于记录2d索引用于查询存储为二维平面上的点的数据
- 2d球形索引 :支持查询类似地球的球形上的任何几何图形,数据可以存储为GeoJSON和传统坐标对(经度,纬度)。 在本文的其余部分,我将使用这种类型的索引,重点介绍GeoJSON。
- Geo Haystack :用于在很小的区域进行查询。 今天它已为应用程序所用,因此在本文中不再赘述。
我们需要在GeoJson对应的属性上创建索引
具体使用参考官方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] }
}
}
}
);