English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

php+Exemple d'implémentation de MongoDB pour déterminer si les coordonnées sont dans la région polygonale spécifiée

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 Nom d'utilisateur
   * @param String $passwd Mot de passe
   * @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->$cursor = $this->executeCommand($this->_db, $command);
    // 插入数据
    $bulk = new MongoDB\Driver\BulkWrite();
    $inserted = 0;
    if($data){
      foreach($data as $k=>$v){
        $bulk->insert($v);
      }
      $result = $this->$cursor = $this->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',
                  
              )
          )
      )
    );
    $options = array('limit'=>1);
    $query = new MongoDB\Driver\Query($filter, $options);
    >$query = new MongoDB\Driver\Query($filter, $options);->$cursor = $this->_conn->_db.'.'.$collname, $query);
    $result = array();
    if($cursor){
      foreach($cursor as $v){
        $result[] = $v;
      }
    }
    retourner $result? $result[0] : $result;
  }
  /**
   * Se connecter à MongoDB
   * @param String $host Adresse de la base de données
   * @param String $user Nom d'utilisateur
   * @param String $passwd Mot de passe
   * @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){
      lancer une ErrorException('Impossible de se connecter au serveur de base de données. Erreur:' . $e->getMessage(), 31);
    }
    retourner $conn;
  }
} // class end
?>

demo.php

<?php
require 'MongoDBPolygons.class.php';
echo '<strong>Démonstration PHP MongoDB pour déterminer si les coordonnées sont dans la zone polygonale :</strong><br><br>';
// Appeler la classe MongoDBPolygons pour zones polygonales
$oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');
// Index
$index = array('polygons'=>'2dsphere');
// Insérer des données de zones polygonales
$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.Insertion réussie des données polygonales<br><br>';
}
// Jugement des coordonnées dans la zone polygonale
echo '2.Jugement des coordonnées de l'Est de Canton (113.330908, 23.155678) est-il dans la zone ?<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.330908, 23.155678);
echo 'Résultat : Coordonnées de l'Est de Canton (113.330908, 23.155678)'.( $result? 'dans la zone' : 'en dehors de la zone');
echo '<br><br>';
echo '3.Jugement des coordonnées du gratte-ciel Hongfa (113.33831, 23.137335) est-il dans la zone ?<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.33831, 23.137335);
echo 'Résultat : Coordonnées du gratte-ciel Hongfa (113.33831, 23.137335)'.( $result? 'dans la zone' : 'en dehors de la zone');
echo '<br><br>';
?>

Sortie :
Exemple de démonstration php MongoDB jugement des coordonnées dans la zone polygonale :

1.Insertion réussie des données polygonales

2.Jugement des coordonnées de l'Est de Canton (113.330908, 23.155678) est-il dans la zone ?
Résultat : Coordonnées de l'Est de Canton (113.330908, 23.155678) est dans la zone

3.Jugement des coordonnées du gratte-ciel Hongfa (113.33831, 23.137335) est-il dans la zone ?
Résultat : Coordonnées du gratte-ciel Hongfa (113.33831, 23.137335) en dehors de la zone

Coordonnées de l'Est de Canton

Coordonnées du gratte-ciel Hongfa

Voici la totalité du contenu de cet article, j'espère qu'il vous aidera dans vos études, et j'espère que vous soutenerez également le tutoriel d'alarme.

Déclaration : le contenu de cet article est tiré d'Internet, propriété des auteurs respectifs, partagé par les utilisateurs d'Internet et téléchargé spontanément. Le site Web ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume pas de responsabilité juridique pertinente. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, le site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer