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 相关文章推荐
用PHP制作静态网站的模板框架(四)
Oct 09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
Apr 28 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
sae使用smarty模板的方法
Dec 17 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
phpMyAdmin安装并配置允许空密码登录
Jul 04 PHP
Smarty变量用法详解
May 11 PHP
微信支付开发订单查询实例
Jul 12 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP回调函数简单用法示例
May 08 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 Calender(日历)代码分享
2014/01/03 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
浅析PHP文件下载原理
2014/12/25 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php 的反射详解及示例代码
2016/08/25 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
jQuery中parents()方法用法实例
2015/01/07 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
Python实现去除代码前行号的方法
2015/03/10 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
物流仓管员岗位职责
2013/12/04 职场文书
新学期决心书
2014/03/11 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
安全学习心得体会范文
2016/01/18 职场文书
《秋思》教学反思
2016/02/23 职场文书