Índices geoespaciales con MongoDB

adrianalonso.es

web developer

Mongodb

  • Sistema de índices
  • Almacenar Información Geoespacial
  • Alternativas como Postgis o extensiones  para mysql
  • GIS ( Sistemas de Información geográfica)

¿Que es un índice?

Un índice en bbdd se trata de una estructura de datos que toma campos particulares de una tabla y almacena una estructura de rápido acceso a éstos datos con el objetivo de realizar consultas por el campo indexado mejorando el rendimiento y la velocidad de respuestas hacia estos. Son útiles emplearlos cuando nuestra base de datos crece significativamente.

Índice Geospacial

  • índice contra coordenadas (lat, long)
  • Permite realizar consultas del tipo:
    •  Dame puntos cercanos a esta coordenada
    • Dame puntos de este área
  • El plano para buscar coincidencias con puntos en 2dimensiones

Índice 2d

  • Plano Euclediano
  • Almacenado como Pares de Coordenadas
{
    loc:[-3.5234,40.434]

}

Índice 2d esféricos

Los índices 2d esféricos son índices algo más complejos que soportan consultas de cálculo geométricas en una esfera similar a nusetro planeta, de tal manera que soportan objetos de tipo Point, LineString y Polygon.

 

 

Ejemplo con Doctine



<?php

namespace MIW\DataAccessBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/** @MongoDB\EmbeddedDocument 
*/
class Coordinates
{
    /** @MongoDB\Float */
    public $x;

    /** @MongoDB\Float */
    public $y;
    
    public function getX() {
        return $this->x;
    }

    public function getY() {
        return $this->y;
    }

    public function setX($x) {
        $this->x = $x;
    }

    public function setY($y) {
        $this->y = $y;
    }


}

Ejemplo con Doctine

<?php

namespace MIW\DataAccessBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/** @MongoDB\EmbeddedDocument 
  @MongoDB\Index(keys={"coordinates"="2d"}) */
class Address
{ 
    /**
     * @MongoDB\String
     */
    protected $address;
    

    /** @MongoDB\EmbedOne(targetDocument="Coordinates") */
    public $coordinates

}

Ejemplo de Query

Realizar una búsqueda por proximidad

 

 

 

 

O lo que es lo mismo:


    return $this->createQueryBuilder()
        ->field('address.coordinates')->near($lat,$long)
        ->getQuery()
        ->execute();
db.runCommand( { geoNear: 'addres.coordinates', near: [$lat,$long])} );

Gracias a MongoDB podemos obtener un valor añadido a nuestra base de datos de una forma bastante sencilla. Eso si, esto es una solución para problemas concretos y reducidos. Si se requieren operaciones más complejas en las que se requieran empleo de distancias, rutas se requerirán sistemas más complejos como los sistemas GIS comentados al inicio del artículo o emplear librerías que nos de esta potencia como es Google Maps.

GRACIAS

http://adrianalonso.es/2014/08/indices-geoespaciales-con-mongodb/

Índices Geoespaciales con MongoDB

By Adrián Alonso Vega

Índices Geoespaciales con MongoDB

  • 838