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

php+Beispiel zur Überprüfung, ob ein Koordinatenpunkt in einem bestimmten Polygonbereich liegt, in MongoDB

MongoDB ist eine auf verteiltem Dateispeicher basierende Datenbank und bietet die Möglichkeit, geospatialen Indizes zu erstellen. In diesem Artikel wird ein Beispiel gezeigt, wie man mit PHP eine Verbindung zum MongoDB herstellt und überprüft, ob Koordinaten im angegebenen Polygonbereich sind.

1.Definieren Sie den Polygonbereich

Die Koordinaten des Polygons sind wie folgt:

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.Erstellen Sie eine Datenbank im MongoDB

use testdb;
db.createUser( 
  { 
    "user":"root", 
    "pwd":"123456" 
    "roles":[{"role" : "readWrite", "db":"testdb"}] 
  } 
);
db.auth( 
  { 
    "user":"root", 
    "pwd":"123456" 
  } 
);

3.Verwenden Sie PHP, um Polygondaten einzufügen und zu überprüfen, ob Koordinaten im Bereich sind

MongoDBPolygons.class.php

<?php
/**
 * MongoDB Polygonbereichsklasse, Überprüfen, ob Koordinaten im Polygonbereich sind
 * Date:  2016-09-30
 * Author: fdipzone
 * Ver:  1.0
 *
 * Func:
 * public add      Polygonbereich erstellen
 * public checkInArea  Überprüfen, ob Koordinaten im Polygonbereich sind
 * private connect    Verbindung zum MongoDB
 */
class MongoDBPolygons { // class start
  // mongo db Verbindung
  private $_conn = null;
  // mongo db
  private $_db = null;
  /**
   * Initialisierung
   * @param String $host  MongoDB-Adresse
   * @param String $user Benutzername
   * @param String $passwd Passwort
   * @param String $db   Datenbank
   */
  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',
                  
              )
          )
      )
    );
    $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#63; $result[0] : $result;
  }
  /**
   * Verbindung zu MongoDB herstellen
   * @param String $host Datenbankadresse
   * @param String $user Benutzername
   * @param String $passwd Passwort
   * @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('Verbindung zum Datenbankserver kann nicht hergestellt werden. Fehler:' . $e->getMessage(), 31);
    }
    return $conn;
  }
} // class end
?>

demo.php

<?php
require 'MongoDBPolygons.class.php';
echo '<strong>php MongoDB Demonstrationsanwendung zur Überprüfung, ob Koordinaten im Polygonbereich liegen:</strong><br><br>';
// Aufruf der MongoDB-Polygonbereichsklasse
$oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');
// Index
$index = array('polygons'=>'2dsphere');
// Einfügen von Polygonbereichsdaten
$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>';
?>

输出:
php MongoDB 判断坐标是否在多边形区域内演示:

1.成功插入多边形数据

2.判断广州东站坐标(113.330908, 23.155678)是否在区域内
结果:广州东站坐标(113.330908, 23.155678)在区域内

3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内
结果:宏发大厦坐标(113.33831, 23.137335)在区域外

广州东站坐标

宏发大厦坐标

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。)

Dir gefällt