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 删除cookie和浏览器重定向
Mar 16 PHP
PHP 文件扩展名 获取函数
Jun 03 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 PHP
php实现自动生成验证码的实例讲解
Nov 17 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
一页面多XMLHttpRequest对象
2007/01/22 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
基于AngularJS实现表单验证功能
2017/07/28 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
node.js遍历目录的方法示例
2018/08/01 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python输入错误后删除的方法
2019/10/12 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
《钱学森》听课反思
2014/03/01 职场文书
库房保管员岗位职责
2014/04/07 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
品质保证书格式
2015/02/28 职场文书
2015年司法局工作总结
2015/05/22 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers