MySQL y GIS: usa MySQL como una base de datos espacial

MySQL es una de las Bases de Datos de código abierto más populares del mundo y está disponible en casi cualquier servidor bien directamente o a través de su derivada MariaDB. Pero, ¿se puede trabajar con bases de datos MySQL y GIS? La respuesta es que sí, MySQL tiene una extensión para gestionar datos espaciales muy completo.

Tradicionalmente PostGIS (la extensión espacial de PostgreSQL) ha sido la base de datos preferida para trabajar con datos geográficos, pero MySQL es una opción que ofrece características similares. Ambas tienen ventajas e inconvenientes: en general parece ser que PostGIS es más consistente y MySQL más ligera, es decir que consume menos recursos.

En esta ocasión nos vamos a centrar en MySQL y concretamente es sus características espaciales.

MySQL y GIS: el componente espacial de MySQL

Siguiendo la especificación de la Open Geospatial Consortium (OGC), MySQL implementa extensiones espaciales como un subconjunto del entorno SQL with Geometry Types. Además, al contrario que sucede con PostGIS, no es necesario habilitar las funciones espaciales, puesto que en MySQL ya se encuentran habilitadas por defecto.

Las extensiones espaciales de MySQL permiten la generación, el almacenamiento y el análisis de datos geográficos:

  • MySQL tiene tipos de datos para representar valores espaciales que corresponden a las clases de OpenGIS. Estos tipos de datos permiten representar geometrías como puntos, líneas o polígonos.
  • Funciones para manipular valores espaciales. Estas funciones permiten trabajar con los formatos espaciales y realizar operaciones espaciales.
  • Creación de indices espaciales para mejorar el tiempo de ejecución de las consultas espaciales.

Tipos de datos espaciales

Los tipos de datos espaciales que soporta MySQL son:

  • Tipos de datos espaciales que contienen valores de geometría únicos:
    • GEOMETRY (puede almacenar valores de geometría de cualquier tipo).
    • POINT
    • LINESTRING
    • POLYGON

 Estos tres últimos tipos de valores ( POINT, LINESTRING y POLYGON ) restringen sus valores a un tipo de geometría particular.

  • Tipos de datos espaciales que contienen colecciones de valores:
    • MULTIPOINT
    • MULTILINESTRING
    • MULTIPOLYGON
    • GEOMETRYCOLLECTION

GEOMETRYCOLLECTION puede almacenar una colección de objetos de cualquier tipo. Los otros tipos de colección ( MULTIPOINT , MULTILINESTRING y MULTIPOLYGON ) restringen los miembros de la colección a aquellos que tienen un tipo de geometría particular.

Los tipos de geometrías en MySQL están organizados en clases. La clase base es Geometry y tiene subclases para Point, Curve, Surface y GeometryCollection. De cada una de estas subclases dependen los diferentes tipos tipos de geometrías como POINT o POLYGON.

Crear tablas espaciales

Podemos crear fácilmente una tabla en una base de datos MySQL con la siguiente sentencia:

CREATE TABLE punto (geom GEOMETRY);

En la línea anterior creamos una tabla llamada puntos que contiene una columna llamada geom de tipo GEOMETRY.

Esta es una sentencia muy sencilla. Por lo general la creación de una tabla con características espaciales requerirá de más columnas. Otro ejemplo un poco más elaborado sería el siguiente:

CREATE TABLE 'ptos' (
  'punto' geometry NOT NULL,
  SPATIAL KEY 'punto' ('punto')
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

En este ejemplo creamos la tabla «ptos» que también contiene una sola columna llamada punto, que es donde alojaremos los datos de geográficos. También hemos definido el mecanismo de almacenamiento : MyISAM y su codificación de caracteres.

Insertando datos en una tabla espacial

Ahora que ya tenemos una tabla podemos proceder a insertar puntos.

INSERT INTO ptos VALUES (ST_PointFromText('POINT(-6.63442 40.97840)', 4326));
INSERT INTO ptos VALUES (ST_PointFromText('POINT(-6.64227 40.96303)', 4326));
INSERT INTO ptos VALUES (ST_PointFromText('POINT(-6.66115 40.95858)', 4326));
INSERT INTO ptos VALUES (ST_PointFromText('POINT(-6.68685 40.93992)', 4326));

Mediante el comando INSERT INTO, introducimos nuevos valores en la tabla ptos. ST_PointFromText inserta puntos WKT (veremos más adelante qué es) y su SRID, utilizando el siguiente formato.

ST_PointFromText(wkt[, srid [, options]])

Si utilizamos phpMyAdmin disponemos de una herramienta para la visualización de los datos GIS. Nos ofrece una imagen como la siguiente en donde se pueden ver los puntos creados.

Formatos para el almacenamiento de datos geográficos

WKT

La representación WKT (Well Known Text) o de texto conocido está diseñada para intercambiar datos de geometría en forma ASCII.

Un ejemplo de representaciones WKT de objetos de geometría es: POINT(15 20)

Observar que se ha escrito sin comas separando las coordenadas.

Si en la tabla ptos que creamos anteriormente realizamos la consulta:

SELECT ST_X(ST_GeomFromText('POINT(-6.63442 40.97840)'));

obtendremos el valor de la coordenada X, del punto. En este caso -6.63442.

La función ST_X se encarga de extraer la coordenada X de un punto y la función  ST_GeomFromText() utiliza una representación WKT de POINT.

WKB

La representación binaria conocida (WKB) de valores geométricos se utiliza para intercambiar datos de geometría como flujos binarios representados por valores binarios. Es un formato alternativo al anterior y que tiene la ventaja  de que al ser compilada en forma binaria la velocidad de proceso es muy elevada.

Por ejemplo, un valor WKB que corresponde a POINT(1-1) consiste en esta secuencia de 21 bytes, cada uno representado por dos dígitos hexadecimales:

0101000000000000000000F03F000000000000F0BF

La siguiente consulta nos devuelve el valor en formato hexadecimal del punto (-6.63442 40.97840).

SET @g = ST_GeomFromText('POINT(-6.63442 40.97840)');
SELECT HEX(@g);

El resultado de esta consulta es el valor : 0000000001010000009AB67F65A5891AC0053411363C7D4440

Analizar información espacial

MySQL dispone de funciones que permiten realizar operaciones espaciales de los siguientes tipos:

  • Funciones de conversión de formato geométrico. Son las funciones para convertir valores geométricos entre formato interno y los formatos WKT o WKB.
  • Funciones Geometry. Son las funciones que nos permiten analizar cada tipo de geometría; por ejemplo las que nos dan la longitud de una línea o el área de un polígono.
  • Funciones que crean nuevas geometrías a partir de unas existentes. Estas funciones crean nuevas geometrías a partir de las existentes. Son operaciones del tipo unión, intersección o buffer.
  • Funciones para probar relaciones espaciales entre objetos geométricos. Son funciones que analizan las relaciones entre dos geometrías. Por ejemplo si una geometría está contenida en otra o tienen elementos comunes.

Ejemplos de funciones espaciales

La función espacial de MySQL que nos permite calcular el área de un polígono es Area. En el siguiente código calcula el área del polígono indicado:

SET @poly = 'POLYGON((0 0,0 3,3 3,3 0,0 0))';
SELECT Area(GeomFromText(@poly))

Para calcular la longitud de una línea se utiliza GLength. Un ejemplo de esta función es:

SET @ls = 'LineString(0 0,0 3,3 3)';
SELECT GLength(GeomFromText(@ls));

Si quieres aprender a crear mapas a partir de los datos albergados en bases de datos MySQL y PostGIS y crear aplicaciones web de mapas interactivas, inscríbete en nuestro curso online de webmapping interactivo (Leaflet, MySQL y PostGIS).

Let’s connect!

Date de alta en nuestra newsletter y te enviaremos GRATIS el ebook que te ayudará a impulsar tu perfil GIS:
Vitaminas MappingGIS

Tan solo una vez al mes recibirás las últimas novedades del sector GIS y de nuestros cursos