Desde finales de octubre de 2015 ya se puede descargar la versión MySQL 5.7, un motor de bases de datos basado en software libre de amplio reconocimiento mundial, aunque no tanto en el ambiente geográfico, donde PostGIS, que añade el componente espacial a PostgreSQL, es más habitual.

En los últimos años, hemos visto un enorme crecimiento en los servicios basados en la localización y en aplicaciones en donde la información geográfica es un componente principal. Por ello las funcionalidades SIG tienen una importancia estratégica para productos como MySQL, que necesitan mejorar el tratamiento de la información geoespacial si quieren competir en un mercado en auge, pero muy competitivo.

Aprovechamos el post de Alexander Rubin en Percona donde comenta las principales novedades para el manejo de información geográfica introducidas en la última versión para conocer cuales son y como usarlas en nuestros proyectos.

Nuevas características SIG en MySQL 5.7

Los índices espaciales para InnoDB

Una característica muy esperada, ya que su ausencia impidió, por ejemplo, que muchas empresas usasen como tecnología de almacenameinto InnoDB, mas avanzada y con una fiabilidad y consistencia muy superior a MyISAM, la anterior tecnología de tablas de MySQL.

Función st_distance_sphere

MySQL 5.7 presenta la función nativa st_distance_sphere, que utiliza una fórmula haversine para calcular la distancia entre dos puntos de la tierra, una función muy esperada también. Muchos desarrolladores han creado su propio procedimiento almacenado para calcular dicha distancia  utilizando la fórmula haversine; pero la función nativa es 20 veces más rápida que el procedimiento almacenado. Cosa lógica por otra parte, ya que los procedimientos almacenados son lentos computacionalmente, especialmente para las funciones trigonométricas.

La función devuelve un valor en metros y utiliza para calcularla el radio de la tierra, con un valor por defecto de 6.370.986 metros (argumento opcional). A pesar de que nuestra tierra se asemeja más a un esferoide achatado, en la practica todas las aplicaciones utilizan la distancia sobre una esfera. La diferencia entre la fórmula haversine y otras funciones, más precisas (y mucho más lentas) es insignificante a efectos de las aplicaciones habituales.

Nuevas funciones: Geohash y GeoJSON

Otra característica geoespacial interesante de MySQL es la función GeoJSON, que permite convertir un conjunto de resultados a GeoJSON, uno de los formatos de moda para el intercambio de Información Geográfica, como nos contaban en MappingGIS hace unas semanas. De esta manera obtenemos conjuntos de datos listos para usar con la con la API de Google Maps, por ejemplo.

Geohash es un sistema para codificar coordenadas latitud y longitud en una cadena de texto creado por Gustavo Niemeyer en 2008. Con Geohash las coordenadas 40.416737, -3.703587, correspondientes al centro de Madrid, se codifican como ezjmgtxhs1v7. La nueva función permite manipular valores geohash; de esta manera las aplicaciones creadas tienen la capacidad de importar, exportar datos, indexar y buscar de valores geohash.

Pantallazo de Alexander Rubin en percona.com

Gestión de geometrías con la biblioteca Boost.Geometry

Boost.Geometry es una biblioteca escrita en C ++ y en desarrollo desde 2008 que proporciona conceptos, tipos de geometría y algoritmos desarrollados para resolver problemas de geometría. Sigue el estándar del Open Geospatial Consortium (OGC) Simple Features y es independiente del sistema de coordenadas utilizado.

Su uso a partir de la versión 5.7 ha supuesto un cambio importante y es que ha sido necesario modificar gran parte del código nativo de MySQL en lo referente a la gestión de geometrías.

En MySQL eran conscientes de las limitaciones que tenían en la gestión de información geográfica, con algoritmos y geometrías muy pobres. La incorporación de Boost.Geometry aumenta la capacidad de MySQL de realizar aplicaciones SIG.

Conclusión

MySQL 5.7 contiene un gran conjunto de características para trabajar con datos geoespaciales. Se han añadido los índices espaciales en InnoDB; se incorpora st_distance_sphere como una función nativa; ahora podemos trabajar con Geohas o GeoJSON y la biblioteca Boost.Geometry forma parte del código de MySQL.

Pero Alexander Rubin también nos comenta noticias que no acaban de producirse, y es que a excepción de la st_distance_sphere, todas las demás funciones utilizan geometría plana (sin cambios desde MySQL 5.6) y no son compatibles con el Spatial Reference System Identifier (SRID), el código con el que se identifican los sistemas de coordenadas de todo el mundo.

Eso significa que para calcular la distancia de un carril bici en metros, todavía hay que usar una función almacenada o escribir un código de ex-profeso solo para eso. La función nativa st_distance o Distance() ignora SRID por ahora y devuelve un valor que representa una distancia en un plano, lo que no es muy útil en aplicaciones SIG que trabajan con escalas medianas o pequeñas.


Este artículo es una versión ampliada del post New GIS Features in MySQL 5.7 de Alexander Rubin. En el artículo original (en inglés) puedes encontrar ejemplos de uso