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 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
php中JSON的使用与转换
Jan 14 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
PHP的全局错误处理详解
Apr 25 PHP
php中的登陆login实例代码
Jun 20 PHP
ThinkPHP中session函数详解
Sep 14 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
PHP dirname简单使用代码实例
Nov 13 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
php swoft框架实例用法
2020/12/22 PHP
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
js点击选择文本的方法
2015/02/09 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
js的三种继承方式详解
2017/01/21 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
高中生职业规划范文
2014/03/09 职场文书
高中学校对照检查材料
2014/08/31 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
2015元旦标语横幅
2014/12/09 职场文书
2015年推普周活动总结
2015/03/27 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
历史博物馆观后感
2015/06/05 职场文书
七一晚会主持词
2015/06/29 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python