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操作数组相关函数
Feb 03 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
php获取301跳转URL简单实例
Dec 16 PHP
php 伪静态之IIS篇
Jun 02 PHP
PHP5.3新特性小结
Feb 14 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
php批量修改表结构实例
May 24 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
mongodb和php的用法详解
Mar 25 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 读取文件乱码问题
2010/02/20 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python3 实现调用串口功能
2019/12/26 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
python如何绘制疫情图
2020/09/16 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
应届生自我鉴定
2013/12/11 职场文书
中国好声音广告词
2014/03/18 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
夏季药店促销方案
2014/08/22 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
乒乓球比赛通知
2015/04/27 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
入党申请书怎么写?
2019/06/11 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python