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
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?>
新闻热点
疑难解答