Home > Article > Backend Development > Example of using php+mongodb to determine whether the coordinates are within the specified polygon area
This article mainly introduces the example of using PHP mongodb to determine whether the coordinates are within the specified polygon area. It has certain reference value. Interested friends can refer to it.
MongoDB is a database based on distributed file storage and provides the ability to create geospatial-based indexes. This article will provide an example of using PHP to connect to mongodb and determine whether the coordinates are within a specified polygon area.
1. Define the polygon area
The coordinate points of the polygon are as follows:
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.314 882,23.163055
2. Create a database in mongodb
use testdb; db.createUser( { "user":"root", "pwd":"123456", "roles":[{"role" : "readWrite", "db":"testdb"}] } ); db.auth( { "user":"root", "pwd":"123456" } );
3. Use php to insert polygon data and determine whether the coordinates are within the area
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>'; ?>
Output:
php MongoDB determines whether the coordinates are within the polygon area Demonstration:
1. Successfully insert polygon data
2. Determine Guangzhou East Whether the station coordinates (113.330908, 23.155678) are within the area
Result: The coordinates of Guangzhou East Station (113.330908, 23.155678) are within the area
3. Determine whether the coordinates of Hongfa Building (113.33831, 23.137335) are within the area
Result: The coordinates of Hongfa Building (113.33831, 23.137335) are outside the area
Coordinates of Guangzhou East Railway Station
Hongfa Building coordinates
#The above is the entire content of this article, I hope it will be helpful to everyone's study.
Related recommendations:
Detailed explanation of several ways to achieve page staticization in PHP
PHP method of reading large CSV files and importing them into the database
phpMethod to implement DES encryption and decryption consistent with c
#
The above is the detailed content of Example of using php+mongodb to determine whether the coordinates are within the specified polygon area. For more information, please follow other related articles on the PHP Chinese website!