Í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