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


Posted in PHP onOctober 28, 2016

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将提供使用PHP连接mongodb,判断坐标是否在指定多边形区域内的实例。

1.定义多边形区域

多边形的坐标点如下:

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

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

2.在mongodb创建数据库

use testdb;

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

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

3.使用php插入多边形数据,并判断坐标是否在区域内

MongoDBPolygons.class.php

<?php
/**
 * MongoDB 多边形区域类,判断坐标是否在多边形区域内
 * Date:  2016-09-30
 * Author: fdipzone
 * Ver:  1.0
 *
 * Func:
 * public add      创建多边形区域
 * public checkInArea  判断坐标是否在多边形区域内
 * private connect    连接mongodb
 */
class MongoDBPolygons { // class start

  // mongo db 连接
  private $_conn = null;

  // mongo db
  private $_db = null;

  /**
   * 初始化
   * @param String $host  mongodb地址
   * @param String $user  用户名
   * @param String $passwd 密码
   * @param String $db   数据库
   */
  public function __construct($host, $user, $passwd, $db){
    $this->_conn = $this->connect($host, $user, $passwd);
    $this->_db = $db;
  }

  /**
   * 插入多边形数据
   * @param String $collname 表名称
   * @param Array $data   多边形坐标数据
   * @param Array $index  索引
   * @return Int
   */
  public function add($collname, $data, $index){

    // 创建索引
    $cmd = array(
      'createIndexes' => $collname,
      'indexes' => array(
        array(
          'name' => 'index',
          'key' => $index,
          'ns' => $this->_db.'.'.$collname
        )
      )
    );
    $command = new MongoDB\Driver\Command($cmd);
    $this->_conn->executeCommand($this->_db, $command);

    // 插入数据
    $bulk = new MongoDB\Driver\BulkWrite();
    $inserted = 0;

    if($data){
      foreach($data as $k=>$v){
        $bulk->insert($v);
      }
      $result = $this->_conn->executeBulkWrite($this->_db.'.'.$collname, $bulk);
      $inserted = $result->getInsertedCount();
    }

    return $inserted;
  }

  /**
   * 判断是否在多边形区域
   * @param String $collname 表名称
   * @param Decimal $longitude 经度
   * @param Decimal $latitude 纬度
   * @return Array
   */
  public function checkInArea($collname, $longitude, $latitude){
    $filter = array(
      'polygons' => array(
          '$geoIntersects' => array(
              '$geometry' => array(
                  'type' => 'Point',
                  'coordinates' => array(doubleval($longitude), doubleval($latitude))
              )
          )
      )
    );
    $options = array('limit'=>1);
    $query = new MongoDB\Driver\Query($filter, $options);
    $cursor = $this->_conn->executeQuery($this->_db.'.'.$collname, $query);

    $result = array();
    if($cursor){
      foreach($cursor as $v){
        $result[] = $v;
      }
    }

    return $result? $result[0] : $result;
  }

  /**
   * 连接mongodb
   * @param String $host  数据库地址
   * @param String $user  用户名
   * @param String $passwd 密码
   * @return DBLink
   */
  private function connect($host, $user, $passwd){
    $server = 'mongodb://'.$user.':'.$passwd.'@'.$host;
    try{
      $conn = new MongoDB\Driver\Manager();
    } catch (MongoDB\Driver\Exception\ConnectionException $e){
      throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
    }
    return $conn;
  }

} // class end
?>

demo.php

<?php
require 'MongoDBPolygons.class.php';

echo '<strong>php MongoDB 判断坐标是否在多边形区域内演示:</strong><br><br>';

// 调用mongodb多边形区域类
$oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');

// 索引
$index = array('polygons'=>'2dsphere');

// 插入多边形区域数据
$data = array(
      array(
        'polygons' => array(
          'type' => 'Polygon',
          'coordinates' => array(
            array(
              array(doubleval(113.314882),doubleval(23.163055)),
              array(doubleval(113.355845),doubleval(23.167042)),
              array(doubleval(113.370289),doubleval(23.149564)),
              array(doubleval(113.356779),doubleval(23.129758)),
              array(doubleval(113.338238),doubleval(23.13913)),
              array(doubleval(113.330979),doubleval(23.124706)),
              array(doubleval(113.313588),doubleval(23.140858)),
              array(doubleval(113.323865),doubleval(23.158204)),
              array(doubleval(113.314882),doubleval(23.163055)),
            )
          )
        ),
      )
    );

$inserted = $oMongoDBPolygons->add('geo', $data, $index);
if($inserted){
  echo '1.成功插入多边形数据<br><br>';
}

// 判断坐标是否在多边形区域
echo '2.判断广州东站坐标(113.330908, 23.155678)是否在区域内<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.330908, 23.155678);
echo '结果:广州东站坐标(113.330908, 23.155678)'.( $result? '在区域内' : '在区域外');
echo '<br><br>';

echo '3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.33831, 23.137335);
echo '结果:宏发大厦坐标(113.33831, 23.137335)'.( $result? '在区域内' : '在区域外');
echo '<br><br>';

?>

输出:
php MongoDB 判断坐标是否在多边形区域内演示:

1.成功插入多边形数据

2.判断广州东站坐标(113.330908, 23.155678)是否在区域内
结果:广州东站坐标(113.330908, 23.155678)在区域内

3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内
结果:宏发大厦坐标(113.33831, 23.137335)在区域外

广州东站坐标

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

宏发大厦坐标

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
php图片缩放实现方法
Feb 20 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
php数组转成json格式的方法
Mar 09 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 PHP
php依赖注入知识点详解
Sep 23 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
Oct 03 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
PHP创建多级目录的两种方法
Oct 28 #PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 #PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 #PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 #PHP
PHP图像识别技术原理与实现
Oct 27 #PHP
PHP对称加密函数实现数据的加密解密
Oct 27 #PHP
PHP下的浮点运算不准的解决方法
Oct 27 #PHP
You might like
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
vue二级路由设置方法
2018/02/09 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python的历史与优缺点整理
2020/05/26 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
大学生未来职业生涯规划书
2014/02/15 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
员工自我评价范文
2015/03/11 职场文书
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
Ruby处理YAML和json数据
2022/04/18 Ruby
Python 视频画质增强
2022/04/28 Python