您当前的位置: 首页 >  mongodb

cuiyaonan2000

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Geospatial Queries On Mongodb

cuiyaonan2000 发布时间:2021-10-18 14:01:51 ,浏览量:0

序言

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

参考资料:

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

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

关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.0355s