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

Exemple d'utilisation de php+mongodb pour déterminer si les coordonnées se trouvent dans la zone de polygone spécifiée

墨辰丷
墨辰丷original
2018-05-31 09:57:041497parcourir

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(
      &#39;createIndexes&#39; => $collname,
      &#39;indexes&#39; => array(
        array(
          &#39;name&#39; => &#39;index&#39;,
          &#39;key&#39; => $index,
          &#39;ns&#39; => $this->_db.&#39;.&#39;.$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.&#39;.&#39;.$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(
      &#39;polygons&#39; => array(
          &#39;$geoIntersects&#39; => array(
              &#39;$geometry&#39; => array(
                  &#39;type&#39; => &#39;Point&#39;,
                  &#39;coordinates&#39; => array(doubleval($longitude), doubleval($latitude))
              )
          )
      )
    );
    $options = array(&#39;limit&#39;=>1);
    $query = new MongoDB\Driver\Query($filter, $options);
    $cursor = $this->_conn->executeQuery($this->_db.&#39;.&#39;.$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 = &#39;mongodb://&#39;.$user.&#39;:&#39;.$passwd.&#39;@&#39;.$host;
    try{
      $conn = new MongoDB\Driver\Manager();
    } catch (MongoDB\Driver\Exception\ConnectionException $e){
      throw new ErrorException(&#39;Unable to connect to db server. Error:&#39; . $e->getMessage(), 31);
    }
    return $conn;
  }

} // class end
?>

demo.php

<?php
require &#39;MongoDBPolygons.class.php&#39;;

echo &#39;<strong>php MongoDB 判断坐标是否在多边形区域内演示:</strong><br><br>&#39;;

// 调用mongodb多边形区域类
$oMongoDBPolygons = new MongoDBPolygons(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;testdb&#39;);

// 索引
$index = array(&#39;polygons&#39;=>&#39;2dsphere&#39;);

// 插入多边形区域数据
$data = array(
      array(
        &#39;polygons&#39; => array(
          &#39;type&#39; => &#39;Polygon&#39;,
          &#39;coordinates&#39; => 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(&#39;geo&#39;, $data, $index);
if($inserted){
  echo &#39;1.成功插入多边形数据<br><br>&#39;;
}

// 判断坐标是否在多边形区域
echo &#39;2.判断广州东站坐标(113.330908, 23.155678)是否在区域内<br>&#39;;
$result = $oMongoDBPolygons->checkInArea(&#39;geo&#39;, 113.330908, 23.155678);
echo &#39;结果:广州东站坐标(113.330908, 23.155678)&#39;.( $result? &#39;在区域内&#39; : &#39;在区域外&#39;);
echo &#39;<br><br>&#39;;

echo &#39;3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内<br>&#39;;
$result = $oMongoDBPolygons->checkInArea(&#39;geo&#39;, 113.33831, 23.137335);
echo &#39;结果:宏发大厦坐标(113.33831, 23.137335)&#39;.( $result? &#39;在区域内&#39; : &#39;在区域外&#39;);
echo &#39;<br><br>&#39;;

?>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn