Geospatial Queries On Mongodb

本文介绍了如何在MongoDB中使用GeoJSON存储和查询地理位置数据,包括数据结构、不同类型GeoJSON对象、索引创建及其在查询中的应用,适合想要理解MongoDB地理空间功能的开发者。

序言

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

参考资料:

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuiyaonan2000

给包烟抽吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值