miércoles, enero 02, 2008

MySQL y su soporte a datos espaciales

.

La organización OpenGIS Consortium (http://www.opengis.org/) hace un buen tiempo atrás ha definido un estándar internacional para soportar datos de Sistemas de Información Geográfica (SIG). La dea es disponer de motores de base de datos que naturalmente soporten tales datos e implementen un algebra especial para su manejo. Oracle, DB2, Postgres y MySQL son ejemplos de marcas que han extendido sus capacidades y hoy soportan (algunos en forma incompleta) datos SIG.


La idea de este artículo es presentar como MySQL podría ser (en corto tiempo) una alternativa interesante para ciertos requerimientos relacionados con el manejo de información espacial. Es de destacar que actualmente el motor de base de datos (v 5.0.45) si bien soporta la mayoría de los tipos de datos espaciales, aún no ha implementado las operaciones básicas de procesamiento espacial necesarias para llevar a cabo un proyecto completo. La idea de sus desarrolladores es que en las próximas versiones logren estas implementaciones y dejen un producto totalmente utilizable por software SIG.

La idea es tomar datos geográficos almacenados en archivos shapefile de la empresa ESRI y convertirlos a datos espaciales OpenGIS y almacenarlos en una base de datos MySQL. Luego se visualizará tal información en modo gráfico utilizando un editor GIS llamado Kosmo, el cual se conectará a la BD MySQL, leerá los objetos geométricos almacenados y los mostrará en un mapa.

1) Obteniendo los archivos shapefiles. En la dirección http://www.aeroterra.com/d-argentinagral.htm la empresa Aeroterra pone a disposición una serie de archivos conteniendo objetos geográficos de la República Argentina:

En particular nos interesa descargar : Rutas (Rutas nacionales y provinciales), Departamentos (División política a nivel de departamentos), Ciudades y Ferrocarriles (Líneas de ferrocarril y concesiones).

Cada archivo almacena información específica de un atributo particular de la geografía argentina. Por ejemplo departamentos contendrá información acerca de la ubicación, forma (generalmente especificada como un polígono) y demás datos asociados a los departamentos. En rutas serán cadenas de puntos que las representarán y en ciudades solamente puntos (ubicaciones x e y) que las situarán espacialmente.

2) Una vez descargados los archivos es necesario extraer su información y convertirla a formato SQL para ser ingresada posteriormente a la base de datos MySQL. Para ello utilizaremos la aplicación shp2mysql (descargar de http://kartoweb.itc.nl/RIMapper/ )

shp2mysql "rutas.shp" arg_rutas geoprueba >arg_rutas.sql

  • Donde rutas.shp es el archivo shape descargado de Aeroterra
  • geoprueba es el nombre de la base de datos que almacenará las tablas
  • arg_rutas.sql es el nombre del archivo de órdenes SQL

Realizar la misma operación sobre los shapefiles restantes

  • shp2mysql "localidades.shp" arg_locali geoprueba >arg_locali.sql
  • shp2mysql "departamentos.shp" arg_deptos geoprueba >arg_deptos.sql

Si editamos los archivos .sql anteriormente generados podemos ver órdenes como las siguientes:

CREATE TABLE arg_rutas (

ID INT NOT NULL PRIMARY KEY ,

LENGTH DOUBLE(19,6),

RUTA VARCHAR(255),

Tipo_ruta VARCHAR(255));

ALTER TABLE arg_rutas ADD ogc_geom GEOMETRY;

INSERT INTO arg_rutas VALUES( '0', '274.832300' , '0202' ,' Provincial',

GeometryFromText('MULTILINESTRING ((-58.551580607981926 -34.443648540234847, -58.553672673620632 -34.445398884692182 ))', -1) );

Nótese que el archivo comienza con la definición de una tabla de rutas a la que luego se le agrega un campo que contendrá un objeto geométrico. Se añade un registro que representa a una ruta provincial y como un atributo de ella su trayecto expresado como una geometría basada en una cadena de puntos X Y.

Otro ejemplo de registro, pero para la tabla ciudades. Nótese que el objeto geométrico seleccionado es el punto, el cual es ideal para representar la ubicación de una ciudad.

INSERT INTO arg_locali VALUES ('1701', 'BUENOS AIRES','LUJAN', 'LUJAN', 'CABECERA DE DEPARTAMENTO', GeometryFromText('POINT (-59.115948708126815 -34.584686660791057)',-1) );

En el siguiente ejemplo se muestra la definición de un departamento geográfico, para lo cuals e utilizó la estructura polígono.

INSERT INTO arg_deptos VALUES('468','RIO NEGRO','NORQUINCO','NORQUINCO', '418535.63','8403189312.74',GeometryFromText('MULTIPOLYGON(((-70.268389212745291 -41.413914777185283 ,-70.266688402494580 -41.413914972580798 ,-69.743559243136161 -41.505049703428242 ,-69.386183849248752 -42.006405987036622 ,-69.403192030123108 -42.006352489155098 ,-69.429518717748820 -42.006270144250799 ,-69.439959398203143 -42.006236409150738 ,-69.536523940076378 -42.005854772755150 ,-69.633086891614397 -42.005378117629874 ,-69.729649369833993 -42.004833399546122 ,-69.826206944012597 -42.004202747836501 ,-69.922762761877195 -42.003495049672104 ,-69.930684151473244 -42.003430675131369 ,-70.019315874105970 -42.002701324510191 ,-70.115863144327633 -42.001826173874356 ,-70.212404171726362 -42.000869607628260 ,-70.308944577033614 -41.999831411590939 ,-70.405475243779279 -41.998716417564424 ,-70.416985211565617 -41.998399247205334 ,-70.501223123787156 -41.996065487629245 ,-70.517106528137887 -41.996187302946339 ,-70.613631097264658 -41.996862913171931 ,-70.710165371914243 -41.997456358932894 ,-70.806714623903432 -41.997962871036023 ,-70.903255409203382 -41.998396891595974 ,-70.987296075216292 -41.998704722503810 ,-70.999804703652046 -41.998748676832733 ,-71.096356092575036 -41.999018467122639 ,-71.137515523769807 -41.999104731876493 ,-71.171138069871333 -41.999161327834955 ,-71.237711753439811 -41.951481107633512 ,-71.221973058650477 -41.857308364553440 ,-71.301839211201710 -41.820756494587641 ,-71.222626774501748 -41.668817350850148 ,-71.227239210092876 -41.506629817733014 ,-71.030554486557165 -41.550297955353884 ,-70.922394517592323 -41.431239276085840 ,-70.810297580526779 -41.523188394483363 ,-70.695344128089786 -41.441998772740646 ,-70.619781917480466 -41.414031723968804 ,-70.497801205731975 -41.413303833152717 ,-70.268389212745291 -41.413914777185283 )))',-1) );


3) El paso siguiente es generar la base de datos MySQL y correr las scripts generadas anteriormente, así se crean y se cargan las tablas que contendran la información generada en 2. Suponiendo que se ha generado la BD geoprueba las scripts se corren así:

  • mysql -u root -p geoprueba (signo menor) arg_rutas.sql
  • mysql -u root -p geoprueba (signo menor) arg_locali.sql
  • mysql -u root -p geoprueba (signo menor) arg_deptos.sql

En este momento ya se tiene la BD geoprueba con tres tablas que representan distintos aspectos geográficos de la República Argentina.


4) A continuación utilizaremos la aplicación Kosmo (http://www.saig.es/kosmo.php) a los efectos de visualizar en forma de mapa la información que hemos almacenado en la BD geoprueba. Kosmo es un software open source que permite operar con sistemas de información geográfica, lo importante de él es que puede leer y almacenar datos de diferentes tipos de sistemas de almacenamiento.

Al cargar la aplicación, seleccionamos la opción “Crear un proyecto nuevo, con una nueva vista”, seleccionar la proyección por defecto, en el menú selccionamos “vista” y luego “cargar datos”. En la nueva interfase de carga indicamos que el origen de datos es MySQL, el usuario, clave y base de datos donde cargamos los datos, luego damos click en conectar y si todo fue bien seleccionamos la tabla “arg_deptos” damos aceptar en la ventana siguiente, aparece una nueva interface donde sobre la izquierda seleccionamos la opción arg_deptos. A partir de allí se contruye en la pantalla el plano de los departamentos que componen la República Argentina. Realizamos la misma operación de carga sobre rutas y ciudades.

A continuación se puede navegar por el mapa, consultar datos, definir áreas, medir distancias, agregar objetos geográficos, etc. Los cambios realizados se pueden almacenar sobre las mismas tablas donde se obtuvieron.



2 comentarios:

Anónimo dijo...

En flof nosotros estamos usando postgis de lo mas bien.

Smalbach dijo...

Hola como estan esta muy bueno tu blog, hice todo lo que esta en éste, mas sin ambargo, quisiera hacerles esta pregunta, ¿para dibujar los mapas de una ciudad se tiene que dibujar linea por linea?