mongoDb地理空间索引和查询

一.MongoDb介绍(http://docs.mongoing.com/manual/applications/geospatial-indexes.html)

MongoDB提供了一系列的索引和查询机制来处理地理空间信息。这一节会介绍MongoDB的地理索引特性。您可以阅读 地理索引教程 来了解关于MongoDB中地理查询的完整示例。

表面

在您存储地理数据和编写查询条件前,首先,您必须选择表面类型,这将被用在计算中。您所选择的类型将会影响您的数据如何被存储,建立的索引的类型,以及您的查询的语法形式。

MongoDB提供了两种表面类型:

球面

如果需要计算地理数据就像在一个类似于地球的球形表面上,您可以选择球形表面来存储数据,这样就可以使用 2dsphere 索引。

您可以按照坐标轴:经度,纬度 的方式把位置数据存储为GeoJSON对象。GeoJSON的坐标参考系使用的是 WGS84 数据。

平面

如果需要计算距离,就像在一个欧几里德平面上,您可以按照正常坐标对的形式存储位置数据并使用 2d索引。

位置数据

如果您选择球形表面来计算,您可以选择把位置数据存储为如下两种格式之一:

GeoJSON对象

对 GeoJSON 的查询总是基于球形表面。GeoJSON的默认坐标参考系使用的是 WGS84 数据。

2.4 新版功能: 在版本2.4新引入了对GeoJSON的存储和查询支持。在版本2.4以前,所有的地理数据使用坐标对的形式。

在 2.6 版更改: 支持更多GeoJSON类型:多点, 多线段, MultiPolygon, 几何体集合。

MongoDB支持如下GeoJSON对象:

  • 单点
  • 线段
  • 多边形
  • 多点
  • 多线段
  • MultiPolygon
  • 几何体集合

普通坐标对

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可以查询和某个点最近的其他点。邻近查询使用 $near 操作符。 $near 操作符要求有 2d 或者2dsphere 索引。

地理空间索引

MongoDB提供了如下的地理索引类型来支持地理查询。

2dsphere

2dsphere 索引可以支持如下特性:

  • 在球形平面上的计算
  • GeoJSON对象和对普通坐标对的向后兼容。
  • 复合索引。这个复合索引可以包含一个 2dsphere 索引字段以及一些按升序或降序建立的普通索引字段(作为 2dsphere 索引的前缀或者后缀)。

2.4 新版功能: 在版本2.4之前``2dsphere`` 索引是不可用的。

参见

查询 2dsphere 索引

2d

2d 索引支持如下特性:

  • 使用平面几何的方式计算
  • 普通坐标对(比如,在一个平面坐标系中的点)
  • 作为复合索引,额外索引一个键。方法是,把额外的一个键作为 2d 索引键的后缀

参见

查询 2d 索引

地理空间索引和分片

您 不能 使用地理索引来作为 shard key 索引。

您可以在一个被分片的集合上创建并维护一个一个地理空间索引,使用的不能是分片键。

对于被分片的几何,使用了 $near 操作的查询是不被支持的。作为替代,您可以使用 geoNear 命令或者$geoNear 在聚合阶段的时候。

您还可以使用 $geoWithin 来查询地理空间数据。

其它资源

以下页面提供了关于地理空间索引和查询的完整文档

2dsphere 索引

MongoDB的 2dsphere 索引支持查询在一个类地球的球面上进行几何计算。 索引支持以GeoJSON对象或者普通坐标对的方式存储数据。

2d 索引

MongoDB的 2d 索引支持以普通坐标对的方式存储数据,用于MongoDB2.2版及以前

geoHaystack 索引

haystack索引是一个被特殊优化过的索引,用于返回小区域结果。对于那些使用球面几何的查询而言, 2dsphere 会是一个更好的选择。

2d 索引原理

提供了对地理索引更深层次本质的阐释。这份材料对于普通操作者不是必须的,但是对于正在排除障碍或者想要更深入理解的用户也许有点帮助。

参见

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 } )

3. 查询

$geometry表示查询的几何图片.

3.1 查询多边形范围的值

type表示类型:polygon 多边形

db.places.find( { loc :
                  { $geoWithin :
                    { $geometry :
                      { type : "Polygon" ,
                        coordinates : [ [
                                          [ 0 , 0 ] ,
                                          [ 3 , 6 ] ,
                                          [ 6 , 1 ] ,
                                          [ 0 , 0 ]
                                        ] ]
                } } } } )

3.2 查询附近的值

使用$near来查询附近的地点。

db.places.find( { loc :
                        { $near :
                          { $geometry :
                             { type : "Point" ,
                               coordinates : [ <longitude> , <latitude> ] } ,
                            $maxDistance : <distance in meters>
                     } } } )

3.3 查询圆形内的值

查询圆时,需要指定圆心, 半径。

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 shelldb.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/

时间: 2024-10-25 05:28:55

mongoDb地理空间索引和查询的相关文章

MongoDB系列五(地理空间索引与查询).

一.经纬度表示方式 MongoDB 中对经纬度的存储有着自己的一套规范(主要是为了可以在该字段上建立地理空间索引).包括两种方式,分别是 Legacy Coordinate Pairs (这个词实在不知道怎么翻译...) 和  GeoJSON . Legacy Coordinate Pairs Legacy Coordinate Pairs 又有两种方式可以存储经纬度,可以使用数组(首选)或嵌入式文档. 数组: <field>: [<longitude>, <latitude

Mongodb地理空间索引

1. LBS地理空间索引 关于LBS相关项目,一般存储每一个地点的经纬度的坐标, 假设要查询附近的场所,则须要建立索引来提升查询效率. Mongodb专门针对这样的查询建立了地理空间索引. 2d和2dsphere索引. 2. 创建索引 建立places集合,来存放地点, loc字段用来存放地区数据GeoJSON Point. db.places.insert( { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name

MongoDB 学习笔记之 地理空间索引入门

地理空间索引: 地理空间索引,可用于处理基于地理位置的查询. Point:用于指定所在的具体位置,我们以restaurants为例: db.restaurants.insert({name: "Citi", loc: {type: "Point", coordinates: [52.37, 5.21]}}) db.restaurants.insert({name: "SAP", loc: {type: "Point", coo

mongodb的地理空间索引常见的问题

创建地理空间索引注意事项 创建地理空间索引失败,提示错误信息如下 > db.places.ensureIndex({"loc":"2dsphere"}){"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"ok" : 0,"errmsg" : "Can't extract geo keys fr

mongodb 学习笔记 03 -- 查询表达式

mongodb 学习笔记 03 – 查询表达式 不等于,大于,小于 !=: db.stu.find({name:{$ne:'billvsme'}}) 名字不是'billvsme' > : db.stu.find({age:{$gt:18}}) 年纪大于18 < : db.stu.find({age:{$lt:18}}) 年纪小于18 >=: $gte <=: $lte in/not in/all $in :db.goods.find(stu_id:{$in:[93001,93002

MongoDB多条件分页查询,新增,删除操作

概述 日志信息记录到MongoDB中,然后多条件查询 程序界面 MongoDBTools.java package com.admin.utils; import java.lang.reflect.Field; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.apache.log4

mongodb的地理空间索引如何在solr中体现

"$near"是唯一一个会对查询结果进行自动排序的地理空间操作符 "$near"的返回结果是按照距离由近及远排序的.其他排序条件不会生效. 这种按照地理位置远近查询怎么在solr排序中体现?

python操作mongodb之二聚合查询

#聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_example #准备数据 result = db.things.insert_many([{"x": 1, "tags": ["dog", "cat"]}, {"x": 2, "tags": [&

Mongodb基础用法及查询操作[转载]

插入多条测试数据> for(i=1;i<=1000;i++){... db.blog.insert({"title":i,"content":"mongodb测试文章.","name":"刘"+i});                                                      ... } db.blog.list.find().limit(10).forEach(