Mysql ¿Cómo Trabajar con Información Geoespacial?

Mysql ¿Cómo Trabajar con Información Geoespacial?

La información Geoespacial siempre ha sido de una utilidad incalculable pero hasta los costos de los equipos necesarios para capturarla, trasmitirla y procesarla habían hecho que solo se aplicara en casos muy específicos, en organizaciones con amplios recursos. En los últimos años la explosión de los smartphones ha posibilitado que estas soluciones estén al alcance de más y más personas aportando soluciones ricas e interesantes.

MySQL también se suma a esto, en especial a partir de su versión 5.6 de mayo del 2015, y nos permite almacenar información geoespacial directamente en la base de datos y hacer consultas y operaciones sobre estos datos, para ello contamos con los siguientes tipos de datos:

  • GEOMETRY. Almacena valores de cualquiera de los siguientes tipos.
  • POINT. Un punto con coordenadas x,y.
  • LINESTRING. Líneas que representan cosas como ríos, vías, redes, etc.
  • POLYGON. Representa una superficie plana.

Una columna de estos tipos podrá guardar un valor del tipo que le fue asignado, también hay variantes que permiten almacenar más de un valor a la vez, como MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION.

Para crear valores de estos tipos se usan funciones como las que se ven en los siguientes ejemplos:

  • INSERT INTO tabla VALUES (PointFromText('POINT(1 1)'));
  • INSERT INTO tabla VALUES (LineStringFromText('LINESTRING(0 0,1 1,2 2)'));
  • INSERT INTO geom VALUES (PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'));

Un concepto importante a tener en cuenta es el de los mínimos rectángulos contenedores (MBR en inglés), como su nombre lo indica son los rectángulos más pequeños que pueden contener una geometría, por ejemplo, si tenemos un polígono que representa un circulo con radio 3 metros, su MBR será un cuadrado de 6 metros de lado. Las operaciones con los MBR son mucho más rápidas.

Supongamos que tenemos definidos los polígonos que representan los barrios de una ciudad y queremos saber en qué barrio está un punto dado. Entonces primero probamos si el MBR de cada barrio contiene al punto, con esto descartamos de forma eficiente una gran cantidad de barrios y nos quedamos una lista de candidatos mucho más reducida, a los barrios de esta lista si los comprobaremos usando la geometría en detalle, en lugar las cajas y así obtenemos el resultado final.

MySQL cuenta con gran cantidad de funciones que podemos usar para tratar los datos, algunas de ellas son:

  • area()   Área de un polígono
  • contains() Indica si el MBR de una geometría contiene el MBR de otra.
  • intersects() Indica si el MBR de una geometría intersecta el MBR de otra.
  • st_contains() Indica si una geometría contiene a otra.
  • st_Intersects() Indica si una geometría intersecta otra.

Sin embargo no todo es color de rosa, y hay algunas limitaciones importantes que debemos tener en cuenta.

Recuerda que la tierra es redonda y los mapas son planos, piensa en una mandarina, si la pelas con cuidado y extiendes la cascara sobre una mesa notarás como se deforma, lo mismo pasa con los mapas, hay varias formas de proyectar la forma redonda de la tierra en un mapa plano pero siempre se busca que el área que vamos a representar sufra la menor distorsión posible. Un mapa nunca está completo a menos que se indique el sistema que se usó para la proyección, por ejemplo, los mapas en Colombia deberían hacerse con el sistema de referencia MAGNA-SIRGAS.

MySQL puede almacenar un número junto a cada valor geométrico que indica el sistema de referencia, sin embargo, a la hora de hacer operaciones este número es ignorado y las operaciones se hacen sobre el sistema cartesiano.

Las versiones de MySQL anteriores a la 5.6 no hacen operaciones directamente con la geometría de los objetos, es decir, no cuentan funciones como st_contains o st_intersects, por lo tanto solo hacen operaciones con los MBR y para trabajar con la geometría exacta tendremos que crear nuestras propias funciones o llevar estos cálculos una capa más arriba, por ejemplo, Java cuenta con bibliotecas que pueden realizar estos cálculos.

Espero que está pequeña introducción te sea de utilidad y si te gustó seguro hay otros artículos en este Blog que te pueden interesar, no olvides suscribirte, darle me gusta y compartir.

Deja un Comentario

CAPTCHA code
X