Maison > Article > développement back-end > Exemple d'utilisation de php+mongodb pour déterminer si les coordonnées se trouvent dans la zone de polygone spécifiée
Cet article présente principalement l'exemple de php+mongodb jugeant si les coordonnées se trouvent dans la zone de polygone spécifiée. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer.
MongoDB est une base de données basée sur le stockage de fichiers distribués et offre la possibilité de créer des index géospatiaux. Cet article fournira un exemple d'utilisation de PHP pour se connecter à mongodb et déterminer si les coordonnées se trouvent dans une zone de polygone spécifiée. .
1. Définir la zone du polygone
Les points de coordonnées du polygone sont les suivants :
113.314882,23.163055
113.355845,23.167042
113.370 289,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. Créez une base de données dans mongodb
use testdb; db.createUser( { "user":"root", "pwd":"123456", "roles":[{"role" : "readWrite", "db":"testdb"}] } ); db.auth( { "user":"root", "pwd":"123456" } );
3. Utilisez php pour insérer un polygone. données et déterminer si les coordonnées se trouvent dans la zone
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>'; ?>
Sortie :
php Démo MongoDB pour déterminer si les coordonnées se trouvent dans une zone polygonale :
1. Insérez avec succès les données polygonales
2. Déterminez si les coordonnées de la gare de Guangzhou Est (113.330908, 23.155678) se trouvent dans la zone
Résultat : Les coordonnées de la gare de Guangzhou Est (113.330908, 23.155678) sont dans la zone
3. Déterminer les coordonnées du bâtiment Hongfa (113.33831, 23.137335) se trouve dans la zone
Résultat : les coordonnées du bâtiment Hongfa (113.33831, 23.137335) sont en dehors de la zone
Coordonnées de la gare de Guangzhou Est
Coordonnées du bâtiment Hongfa
Ce qui précède C'est tout le contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.
Recommandations associées :
Explication détaillée de plusieurs méthodes de statique de pages en PHP
Méthode PHP pour lire des fichiers CSV volumineux et les importer dans la base de données
phpMéthode pour implémenter le cryptage et le décryptage DES cohérents avec c#
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!