jueves, enero 03, 2008

Probando una bd espacial con MySQL

.

La idea es probar algunas capacidades de la base de datos MySQL en lo referente a manejo de datos espaciales. Para lo cual primero se crea una tabla llamada "ciudades" donde se almacenarán atributos convencionales más un atributo espacial "ubicacion" en el cual usando una geometría tipo punto se almacenarán las coordenadas de la localidad.

CREATE TABLE `ciudades` (

`id` int NOT NULL,

`cp` int,

`localidad` varchar(50),

`provincia` varchar(50),

`ubicacion` point not null,

SPATIAL INDEX(ubicacion),

PRIMARY KEY (`id`)

) TYPE=MyISAM;


Luego se cargan algunos registros que servirán para validar la prueba


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(33, 3321, 'Almada', 'Tapia', GeomFromText('POINT(67.1 149.6)'));


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(35, 5511, 'Los Talas', 'Tapia', GeomFromText('POINT(66.6 149.1)'));


INSERT INTO ciudades (`id`, `cp`, `localidad`, `provincia`, `ubicacion`)

VALUES(39, 5221, 'Paz', 'Suma', GeomFromText('POINT(60.1 140.5)'));


A los efectos de recuperar todos los registros se puede consultar con la siguiente orden:

SELECT cp,localidad, AsText(ubicacion) FROM ciudades;


Nótese que la función AsText() convierte a ASCII una representación interna de un objeto espacial.

Una prueba interesante de recuperación de datos podría ser obtener aquellos registros que estén dentro de un cuadrado especificado por el usuario. Se instanció la variable g1 con un objeto polígono, el cual representa al área geográfica de donde nos interesa extraer las ciudades. A continuación, en la consulta se usó la función MBRContains() la cual devuelve verdadero si un punto (ubicación) se halla dentro de un cuadrado mínimo que envuelve al polígono dado como parámetro.

SET @g1 = GeomFromText('Polygon((66 148,66 150,70 150,70 148, 66 148))');

SELECT cp, localidad, AsText(ubicacion) FROM ciudades

WHERE MBRContains( @g1, ubicacion)


Actualmente una de las limitaciones del algebra espacial de MySQL es que opera sobre cuadrados mínimos que recubren objetos espaciales y no sobre los objetos propiamente dichos. Esto hace que se pierda precisión en las respuestas.



No hay comentarios.: