关闭

mongodb 判断坐标是否在指定多边形区域内的方法

标签: mongodbpolygon坐标索引地理空间
15465人阅读 评论(3) 收藏 举报
分类:

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。

1.使用百度拾取坐标工具,在地图上定义多边形的坐标点,并把每个点的坐标保存。

百度拾取坐标工具:http://api.map.baidu.com/lbsapi/getpoint/

多边形的坐标点如下:
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

注意首尾坐标必须一样,这样才能使多边形闭合。

2.使用百度地图开放平台地图JS Demo,把多边形坐标输入,看看多边形是否合适。

百度地图开放平台地图JS Demo:http://developer.baidu.com/map/jsdemo.htm#c2_9

把以下代码替换源码编辑器中的内容,然后点击运行

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        body, html{width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
        #allmap {height:100%; width: 100%;}
        #control{width:100%;}
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
    <title>设置线、面可编辑</title>
</head>
<body>
    <div id="allmap"></div>
    <div id="control">
        <button onclick = "polyline.enableEditing();polygon.enableEditing();">开启线、面编辑功能</button>
        <button onclick = "polyline.disableEditing();polygon.disableEditing();">关闭线、面编辑功能</button>
    </div>
</body>
</html>
<script type="text/javascript">
    // 百度地图API功能
    var map = new BMap.Map("allmap");
    map.centerAndZoom(new BMap.Point(113.330764,23.155878), 15);
    map.enableScrollWheelZoom();

    var polygon = new BMap.Polygon([
        new BMap.Point(113.314882,23.163055),
        new BMap.Point(113.355845,23.167042),
        new BMap.Point(113.370289,23.149564),
        new BMap.Point(113.356779,23.129758),
        new BMap.Point(113.338238,23.13913),
        new BMap.Point(113.330979,23.124706),
        new BMap.Point(113.313588,23.140858),
        new BMap.Point(113.323865,23.158204)
    ], {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});  //创建多边形
    map.addOverlay(polygon);   //增加多边形
</script>

多边形区域


3.定义测试坐标

广州东站坐标:113.330908,23.155678 (多边形内)

广州东站坐标


宏发大厦:113.33831,23.137335 (多边形外)

宏发大厦坐标


4.在mongodb测试

1.创建数据库

use testdb;

db.createUser(  
    {  
        "user":"root",  
        "pwd":"123456",  
        "roles":[{"role" : "readWrite", "db":"testdb"}]  
    }  
);

db.auth(  
    {  
        "user":"root",  
        "pwd":"123456"  
    }  
);


2.插入多边形范围并添加索引

db.geo.ensureIndex(  
    {  
        polygons: "2dsphere"  
    }  
);

db.geo.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],
            ]]
        }
    }
);


3.判断坐标是否在多边形区域

广州东站坐标:113.330908,23.155678

db.geo.find(
    {
        polygons:
        {
            $geoIntersects:
            {
                $geometry:{ 
                    "type" : "Point",
                    "coordinates" : [113.330908,23.155678] }
                }
            }
        }
);

输出:

{ "_id" : ObjectId("57c2b1895fb7fd4790f9f099"), "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 ] ] ] } }

表示坐标 113.330908,23.155678 在多边形区域内

宏发大厦:113.33831,23.137335

db.geo.find(
    {
        polygons:
        {
            $geoIntersects:
            {
                $geometry:{ 
                    "type" : "Point",
                    "coordinates" : [113.33831,23.137335] }
                }
            }
        }
);

输出:

表示坐标 113.33831,23.137335 在多边形区域外

2
0
查看评论

结合MongoDB开发LBS应用

简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理。我所在的项目也正从事相关系统的开发,我们使用的是Symfony2+Doctrine2 ODM+MongoDB的组合。 我们将这些技术要点整理成文,...
  • huangrunqing
  • huangrunqing
  • 2013-06-17 14:36
  • 29615

php结合mongodb判断坐标是否在指定多边形区域内的实例

之前写过一篇《mongodb 判断坐标是否在指定多边形区域内的方法》是基于mongodb实现,所有操作都是在mongodb执行。本文将使用php结合mongodb,使用php判断坐标是否在多边形区域内的实例。
  • fdipzone
  • fdipzone
  • 2016-09-30 21:41
  • 19380

关于指定的经纬度是否落在多边形内

这个想法就是判断一个点向左的射线跟一个多边形的交叉点有几个,如果结果为奇数的话那么说明这个点落在多边形中,反之则不在。直接贴代码吧 A: B: C: D: package com.cmcc.monitor.test; public class GisTest { publi...
  • qq_22929803
  • qq_22929803
  • 2015-07-09 15:55
  • 2115

判断一个指定的经纬坐标是否落在一个多边形区域内?

Python: def IsPtInPoly(aLon, aLat, pointList): ''' :param aLon: double 经度 :param aLat: double 纬度 :param pointList: list [(...
  • bluehawksky
  • bluehawksky
  • 2016-06-14 11:34
  • 2456

mongodb 判断坐标是否在指定多边形区域内的方法

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标点,并把每个点的坐标保存。 百度拾取坐标工具:http://api.m...
  • azhegps
  • azhegps
  • 2016-11-29 16:17
  • 704

mongodb 存储经纬度以及查询

关于LBS相关项目,一般存储每个地点的经纬度的坐标, 如果要查询附近的场所,则需要建立索引来提升查询效率。 Mongodb专门针对这种查询建立了地理空间索引。 2d和2dsphere索引,分别是针对平面和球面。 { loc : { lon : 40.739037, lat: 73.992964 }...
  • zxjiayou1314
  • zxjiayou1314
  • 2016-03-10 10:42
  • 6618

mongodb 对地理位置坐标的计算

https://docs.mongodb.org/manual/core/2dsphere/
  • terry_water
  • terry_water
  • 2016-02-02 11:11
  • 1280

mongodb 计算坐标距离

使用场景很多 ,不瞎比比了 ,直接上案例。创建数据集合location:db.location.insert({loc:[1,3]}); db.location.insert({loc:[3,4]}); db.location.insert({loc:[0,-3]}); db.location.in...
  • u011135260
  • u011135260
  • 2016-08-16 22:25
  • 401

mongo按坐标点查询其所在多边形区域

1.存储进去的格式为: db.geom.insert({"demo":                       {"type":"P...
  • markchiu
  • markchiu
  • 2016-04-13 10:24
  • 402

多边形范围点判定算法

判断一个二维坐标点是否在一个多边形范围框内,首先给出范围框各顶点的坐标(按顺时针方向给出),分别放到两个数组中再比较大小范围从而判定点是否在多边形返回框中  code如下:public class RangePoint { double[] x_points; doubl...
  • liuzhoulong
  • liuzhoulong
  • 2015-02-15 16:15
  • 2072
    微博
    微信公众号
    微信分享公众平台-破晓领域
    破晓领域
    微信号:fdipzone-idea
    名称:破晓领域

    个人资料
    • 访问:7817437次
    • 积分:46031
    • 等级:
    • 排名:第81名
    • 原创:295篇
    • 转载:24篇
    • 译文:0篇
    • 评论:511条
    博客专栏
    最新评论