一.MongoDb介绍(http://docs.mongoing.com/manual/applications/geospatial-indexes.html)html
MongoDB提供了一系列的索引和查询机制来处理地理空间信息。这一节会介绍MongoDB的地理索引特性。您能够阅读 地理索引教程 来了解关于MongoDB中地理查询的完整示例。git
在您存储地理数据和编写查询条件前,首先,您必须选择表面类型,这将被用在计算中。您所选择的类型将会影响您的数据如何被存储,创建的索引的类型,以及您的查询的语法形式。spring
MongoDB提供了两种表面类型:mongodb
若是须要计算地理数据就像在一个相似于地球的球形表面上,您能够选择球形表面来存储数据,这样就可使用 2dsphere 索引。shell
您能够按照坐标轴:经度,纬度 的方式把位置数据存储为GeoJSON对象。GeoJSON的坐标参考系使用的是 WGS84 数据。json
若是须要计算距离,就像在一个欧几里德平面上,您能够按照正常坐标对的形式存储位置数据并使用 2d索引。app
若是您选择球形表面来计算,您能够选择把位置数据存储为以下两种格式之一:性能
对 GeoJSON 的查询老是基于球形表面。GeoJSON的默认坐标参考系使用的是 WGS84 数据。优化
2.4 新版功能: 在版本2.4新引入了对GeoJSON的存储和查询支持。在版本2.4之前,全部的地理数据使用坐标对的形式。spa
在 2.6 版更改: 支持更多GeoJSON类型:多点, 多线段, MultiPolygon, 几何体集合。
MongoDB支持以下GeoJSON对象:
单点
线段
多边形
多点
多线段
几何体集合
MongoDB支持对使用 2dsphere 索引的 legacy coordinate pairs (普通坐标对)数据进行球面计算,方式是把数据转换成GeoJSON Point类型。
若是您选择的是平面计算且使用 2d 索引,那么您能够把数据存储为仅 :term:`legacy coordinate pairs`格式。
MongoDB地理空间查询操做容许您查询:
MongoDB能够查询被彻底包含于一个指定多边形区域中的位置。包含查询使用的是 $geoWithin 操做符。
两种索引 2d 和 2dsphere 索引都支持包含查询。在版本2.2.3以后,对于包含查询,MongoDB再也不要求有索引。可是,这些索引能够提高查询性能。
MongoDB能够查询位置和一个指定几何图形的交叉。这些查询仅能够被用于查询存储在球形平面上的数据。这些查询使用 $geoIntersects 操做符。
只有 2dsphere 索引才支持交叉。
MongoDB提供了以下的地理索引类型来支持地理查询。
2dsphere 索引能够支持以下特性:
在球形平面上的计算
GeoJSON对象和对普通坐标对的向后兼容。
复合索引。这个复合索引能够包含一个 2dsphere 索引字段以及一些按升序或降序创建的普通索引字段(做为 2dsphere 索引的前缀或者后缀)。
2.4 新版功能: 在版本2.4以前``2dsphere`` 索引是不可用的。
您 不能 使用地理索引来做为 shard key 索引。
您能够在一个被分片的集合上建立并维护一个一个地理空间索引,使用的不能是分片键。
对于被分片的几何,使用了 $near 操做的查询是不被支持的。做为替代,您可使用 geoNear 命令或者$geoNear 在聚合阶段的时候。
您还可使用 $geoWithin 来查询地理空间数据。
如下页面提供了关于地理空间索引和查询的完整文档
MongoDB的 2dsphere 索引支持查询在一个类地球的球面上进行几何计算。 索引支持以GeoJSON对象或者普通坐标对的方式存储数据。
MongoDB的 2d 索引支持以普通坐标对的方式存储数据,用于MongoDB2.2版及之前
haystack索引是一个被特殊优化过的索引,用于返回小区域结果。对于那些使用球面几何的查询而言, 2dsphere 会是一个更好的选择。
提供了对地理索引更深层次本质的阐释。这份材料对于普通操做者不是必须的,可是对于正在排除障碍或者想要更深刻理解的用户也许有点帮助。
参见
Geospatial Query Compatibility
二.示例
创建places集合,来存放地点, loc字段用来存放地区数据GeoJSON Point。
db.places.insert( { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" } ) db.places.insert( { loc : { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category : "Airport" } )
创建索引
db.places.ensureIndex( { loc : "2dsphere" } )
参数不是1或-1,为2dsphere。还能够创建组合索引。
db.places.ensureIndex( { loc : "2dsphere" , category : -1, name: 1 } )
$geometry表示查询的几何图片.
type表示类型:polygon 多边形
db.places.find( { loc : { $geoWithin : { $geometry : { type : "Polygon" , coordinates : [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ] } } } } )
使用$near来查询附近的地点。
db.places.find( { loc : { $near : { $geometry : { type : "Point" , coordinates : [ <longitude> , <latitude> ] } , $maxDistance : <distance in meters> } } } )
查询圆时,须要指定圆心, 半径。
db.places.find( { loc : { $geoWithin : { $centerSphere : [ [ -88 , 30 ] , 10 ] } } } )
[-88, 30] 为经纬度, 10为半径。
地址:http://blog.csdn.net/yonggang7/article/details/28109463
二.项目中springMVC中是用mongoDb查询范围得点
2.1创建索引
//deliver数据 deliver:{ "deliverArea": [ { "area": [ { "district": "丛台区", "location": { "lat": 36.613143702791, "lng": 114.50521301419 }, "street": "朝阳路", "street_number": "5号" }, { "district": "丛台区", "location": { "lat": 36.612694686043, "lng": 114.50516800908 }, "street": "朝阳路", "street_number": "5号" }, { "district": "丛台区", "location": { "lat": 36.612744657392, "lng": 114.50573403138 }, "street": "朝阳路", "street_number": "5号" }, { "district": "丛台区", "location": { "lat": 36.61310669522, "lng": 114.50577903649 }, "street": "朝阳路", "street_number": "14号" } ] } ], "deliverId": "D011122" }
db.deliver.ensureIndex({"deliverArea.area.location":"2dsphere"})
2.2查询命令
//mongoDB shell
db.deliver.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ 114.495539 , 36.597626 ] }, distanceField: "deliverArea.area.location", maxDistance: 10, num: 5, spherical: true } } ])
//spingMvc 使用Aggregation
Point location = new Point(114.495539 , 36.597626);
NearQuery query = NearQuery.near(location).maxDistance(new Distance(distance, Metrics.MILES)).num(5).spherical(true);
Aggregation aggregation = newAggregation( geoNear(query,"deliver") );
AggregationResults<Deliver> results = mongoTemplate.aggregate(aggregation,"deliver",Deliver.class);
//spring 使用MongoOperations Point location = new Point(-73.99171, 40.738868); NearQuery query = NearQuery.near(location).maxDistance(new Distance(10, Metrics.MILES)); GeoResults<Restaurant> = operations.geoNear(query, Restaurant.class);
使用MongoOperations GeoResults 返回的deliver list数据中,deliver会被content包装,要取出deliver数据需content中取。
参考:http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/