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

php+Ejemplo de MongoDB para determinar si las coordenadas están dentro del área poligonal especificada

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 Nombre de usuario
   * @param String $passwd Contraseña
   * @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(doubleval(
          '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(
      => array(
          '$geoIntersects' => array(
              '$geometry' => array(
                  'type' => 'Point',
                  
              )
          )
      )
    );
    $options = array('limit'=>1);
    $query = new MongoDB\Driver\Query($filter, $options);
    $cursor = $this->_conn->ejecutarConsulta($this->_db.'.'.$collname, $query);
    $result = array();
    if($cursor){
      foreach($cursor as $v){
        $result[] = $v;
      }
    }
    devolver $result&63; $result[0] : $result;
  }
  /**
   * conectar a mongodb
   * @param String $host Dirección de la base de datos
   * @param String $user Nombre de usuario
   * @param String $passwd Contraseña
   * @return DBLink
   */
  private function conectar($host, $user, $passwd){
    $server = 'mongodb://'$user.':$passwd.'@'$host;
    try{
      $conn = new MongoDB\Driver\Manager();
    } catch (MongoDB\Driver\Exception\ConnectionException $e){
      lanzar nuevo ErrorException('No se puede conectar al servidor de base de datos. Error:' . $e->obtenerMensaje(), 31);
    }
    devolver $conn;
  }
} // class end
?>

demo.php

<?php
require 'MongoDBPolygons.class.php';
echo '<strong>demostración de php MongoDB para determinar si las coordenadas están dentro de un polígono:</strong><br><br>';
// llamar a la clase de áreas poligonales MongoDB
$oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');
// índice
$index = array('polygons'=>'2dsphere');
// insertar datos de áreas poligonales
$data = array(
      array(doubleval(
        => array(
          'type' => 'Polygon',
          'coordinates' => array(
            array(doubleval(
              doubleval(113.314882))23.163055))
              doubleval(113.355845))23.167042))
              doubleval(113.370289))23.149564))
              doubleval(113.356779))23.129758))
              doubleval(113.338238))23.13913))
              doubleval(113.330979))23.124706))
              doubleval(113.313588))23.140858))
              doubleval(113.323865))23.158204))
              doubleval(113.314882))23.163055))
            )
          )
        ,
      )
    );
$inserted = $oMongoDBPolygons->add('geo', $data, $index);
if($inserted){
  echo '1.Se insertaron datos poligonales con éxito<br><br>';
}
// .Determinar si las coordenadas están dentro del área poligonal
echo '2.Determinar si las coordenadas de la estación de tren de Guangzhou East (113.330908, 23.155678). ¿Está dentro del área<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.330908, 23.155678);
echo 'Resultados: Coordenadas de la estación de tren de Guangzhou East (113.330908, 23.155678).( $result? 'dentro del área' : 'fuera del área');
echo '<br><br>';
echo '3.Determinar si las coordenadas del edificio Hongfa (113.33831, 23.137335). ¿Está dentro del área<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113.33831, 23.137335);
echo 'Resultados: Coordenadas del edificio Hongfa (113.33831, 23.137335).( $result? 'dentro del área' : 'fuera del área');
echo '<br><br>';
?>

Salida:
Demostración: php MongoDB Determinar si las coordenadas están dentro del área poligonal

1.Se insertaron datos poligonales con éxito

2.Determinar si las coordenadas de la estación de tren de Guangzhou East (113.330908, 23.155678) ¿Está dentro del área?
Resultados: Coordenadas de la estación de tren de Guangzhou East (113.330908, 23.155678) están dentro del área

3.Determinar si las coordenadas del edificio Hongfa (113.33831, 23.137335) ¿Está dentro del área?
Resultados: Coordenadas del edificio Hongfa (113.33831, 23.137335) fuera del área

Coordenadas de la estación de tren de Guangzhou East

Coordenadas del edificio Hongfa

Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyemos mutuamente en el tutorial de clamor.

Declaración: el contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @ para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)

Te gustará