Cuál es la base de datos open source mas rápida para cambiar de proyección una tabla de geometrías?

abril 30, 2012

Esta tarde me picó la curiosidad y realicé unas pruebas sencillas. En la misma máquina cargué una tabla de 1 millón de poli líneas en tres bases de datos distintas y las convertí de Mercator a geográficas. Los tiempos de la conversión (sin contar la carga) fueron los siguientes:

PostgreSQL 9.1 67.2 segundos
Spatialite   3.0.1 122 segundos
MySQL con Spatial-UDF 276 segundos

Me sorprendió muy positivamente la velocidad del PostgreSQL  y en comparación me defraudó un poco la de Spatial-UDF. Porqué se alejaba tanto de las demás base de datos ?

Al principio pensé que se debía a las llamadas UDF del MySQL o a la decodificación de la geometría que la realiza la librería GEOS mientras que en las demás BDD lo realiza código propio. Pero con este test quedó muy claro:

mysql> select mysql.proj4text(4326) into @4326;
Query OK, 1 row affected (0.01 sec)
  
mysql> select mysql.proj4text(3395) into @3395;
Query OK, 1 row affected (0.03 sec)

mysql> create table tmp_lines as select msudf_transform(geom,@3395,4326,@4326) from lines;
 Query OK, 1000000 rows affected (55.19 sec)

 

Lo que realmente es lento es la función transform ya que por cada geometría que transforma debe buscar los textos proj4 de los SRIDs origen y destino.

  
CREATE FUNCTION transform(geom GEOMETRY,srid INTEGER) RETURNS geometry return msudf_transform(geom,proj4text(SRID(geom)),srid,proj4text(srid)); 

Pero como podemos evitar este paso ?

Transformar coordenadas con MySql

abril 12, 2012

La semana pasada trasteando en casa  con el MySql quería cambiar la proyección de unas geometrías y me hacia pereza exportar la tabla, proyectar y volver a importar.

Busqué por internet y encontré esta extensión LIB_MYSQLUDF_FPROJ4 que permite transformar un punto de una proyección a otra.  De hecho sólo permite una de las coordenadas del punto (X o Y). Hice algunas pruebas pero era difícil de usar para transformar una tabla con geometrías poli línea.

Total que decidí implementarme mi propio UDF.

MySql almacena las geometrías con formato SRID + WKB por lo que necesitaba unas rutinas para decodificar WKB. Podía usar las de PostGis, MapNik, etc … pero decidí usar la de GEOS básicamente porqué además del decodificador proporciona muchas funciones espaciales que MySql no tiene y además la usan Postgis y Spatialite. Total que es una librería  estándar de la mayoría  de proyectos GIS de código abierto.

Del mismo modo escogí la librería PROJ.4  para realizar las proyecciones ya que es la mas usada en proyectos de código abierto y seguramente una de las mas completas.

Con un par de horas ya podía decodificar y  codificar una geometría. Una horita mas y ya realizaba las primeras transformaciones.

Copié al MySql la tabla que contenía la definición de todos los sistemas de referencia de una base de datos. Quería leer esta tabla des de la función UDF para convertir el SRID en una definición de proyección PROJ.4. Aquí me encontré con un problema gordo: para leer la tabla se tenia que crear una nueva conexión con la base de datos y facilitar un usuario y password. Pero como podías obtener el password del usuario que ha llamado al UDF ? Total que al final  lo descarté y añadí un par de funciones SQL para trabajar con SRID’s y que llaman a la función UDF con la definición de proyección PROJ.4 origen, destino y el SRID que debe tener la geometría destino.

Cuando tenga un poco de tiempo intentaré publicar la librería en github para quien pueda interesar …

Ya está publicada la podéis descargar de MySQL-Spatial-UDF

Volver a generar las clases POJO y ficheros XML de mapeo a partir de la base de datos con NetBeans

enero 1, 2012

 

A partir de la versión 6.5 de NetBeans contiene un asistente que permite crear las clases POJO y los ficheros XML de mapeo Hibernate a partir de las tablas de una base de datos.

El asistente tambien nos crea un fichero revenge.xml que contiene la lista de tablas sobre la que se realiza la ingenieria inversa y como se debe realizar el proceso de mapeo.

Podemos editar este fichero para añadir nuevas tablas o para modificar los mapeos. El problema es que una vez editado el NetBeans no contiene ninguna herramienta para volver a generar las clases ni los ficheros XML.

De momento la única solución es añadir un nuevo objetivo en el fichero ant del proyecto.

En la pestaña Files seleccionamos el fichero build.xml y antes de la etiqueta </project> añadimos las siguiente línias:

  <target depends="init" name="hibernate_revenge"> 	<echo message="${javac.classpath}"></echo> 	<taskdef name="hibernatetool" classpath="${javac.classpath}" classname="org.hibernate.tool.ant.HibernateToolTask" /> 	<hibernatetool> 		<jdbcconfiguration packagename="com.mypackage.model" revengfile="src/hibernate.rtp.reveng.xml" configurationfile="src/hibernate.cfg.xml" /> 		<hbm2hbmxml destdir="src" /> 		<hbm2java destdir="src" ejb3="false" jdk5="true" /> 	</hibernatetool> </target> 

actualizando el path del fichero revenge y el nombre del paquete.

Una vez guardado el fichero. Podemos ejecutar el comando seleccionando el fichero build.xml con el botón derecho del mouse Run Target/Other Targets/hibernate_revenge

Tambien podemos crear un botón en la barra de tareas a través de la ventana navigator. Seleccionamos hibernate_revenge con el botón derecho del mouse y  Create Shortcut …

De esta forma podreis modificar las tablas de la base de datos y/o los mapeos y regenerar los POJOS y ficheros de configuración tantas veces querais.

Comparativa entre caches de tiles

octubre 15, 2011

OpenLayers: cliente web para visualizar cartografia

junio 4, 2008

Después de mucho tiempo sin postear, no me puedo resistir a escribir unas palabras sobre OpenLayers.

OpenLayers es una librería javascript que nos permite visualizar mapas en cualquier navegador web actual. Además no tiene ninguna dependencia con el servidor web en el que se aloja: al estar todo escrito en javascript sólo se ejecuta en el navegador.

OpenLayers se parece a las librerías de Google Maps o MSN Virtual Earth pero su principal punto fuerte frente a ellos es que es software abierto y utiliza métodos estándares para acceder a los datos cartográficos entre ellos Web Map Service (WMS) i Web Feature Service (WFS).  También permite combinar información de distintos servidores, marcar puntos encima del mapa i obtener las coordenadas, dibujar líneas y polígonos, etc… Os dejo un link con ejemplos de utilización de esta librería.

MySQL: Mejoras de las funciones de consulta de datos geoespaciales.

julio 24, 2007

MySQL proporciona funcionalidad para guardar y recuperar datos geoespaciales, pero la operación con estos es limitada y está lejos de ofrecer una API plenamente compatible con la propuesta por los estándares OpenGIS.

La deficiencia más notable es que todas las funciones de consulta operan usando los rectángulos envolventes de la geometría para simplificar las operaciones. Así los resultados devueltos por estas funciones son inexactos.

Alexey Botchkov ha mejorado las funciones de consulta INTERSECTS y WITHIN para que devuelvan resultados exactos y trabajen igual como se describe en los estándares OpenGIS. También ha implementado las siguientes funciones geoespaciales:

* BUFFER(g1 geometry, d numeric) 
* DIFFERENCE(g1 geometry, g2 geometry)
* DISTANCE(g1 geometry, g2 geometry)
* INTERSECTION(g1 geometry, g2 geometry)
* SYM_DIFFERENCE(g1 geometry, g2 geometry)
* UNION(g1 geometry, g2 geometry)

Las mejoras no se encuentran en ninguna versión release del MySQL  ya que aún se encuentran en fase de test. Para disponer de un servidor con las nuevas funcionalidades se debe descargar el código fuente que se encuentra en el BitKeeper y compilarlo. Para mayor información podéis consultar el siguiente mensaje del foro GIS del Mysql. Esperamos que estas importantes funcionalidades  pronto se añadan a las versiones de Release del MySQL para el disfrute de toda la comunidad.

UMN MapServer: Dibujar capas de datos que se encuentran en el MySQL

octubre 24, 2006

Minnesota nos permite dibujar capas de datos que se encuentren en el  Mysql mediante una conexión OGR. El siguiente ejemplo permite dibujar puntos rojos o azules segun el valor del campo TIPO:

 

LAYER 
NAME "nombre" 
TYPE POINT 
STATUS ON 
DEBUG OFF 
CONNECTIONTYPE OGR 
CONNECTION "MySQL:dbname,host=dbhost,user=dbuser,password=dbpwd" 
CLASSITEM TIPO 
DATA "tabla" 
    CLASS 
      EXPRESSION "E" 
      STYLE 
        COLOR 255 0 0 
        SYMBOL "POINT" 
        SIZE 10 
      END 
    END 
    CLASS 
      EXPRESSION "S" 
      STYLE 
        COLOR 0 255 0 
        SYMBOL "POINT" 
        SIZE 10 
      END 
    END 
END

				

TeleAtlas MapInsight: Un nuevo sistema para reportar errores de la cartografia.

octubre 18, 2006

TeleAtlas ha puesto en marcha un nuevo servicio llamado  MapInsight que permite a los usuarios de su cartografia reportar errores.

Si estás harto de que la calle donde vives no aparezca en tu navegador o que la ruta para ir a Madrid te mande a pasear por el campo, puedes abrir una incidéncia y esperar que en la siguiente actualización lo hayan corregido.

UMN MapServer: Servidor de mapas web

septiembre 29, 2006

MapServer es un entorno de desarrollo de código abierto para construir aplicaciones de internet espaciales. Mapserver no és un sistema GIS completo, ni aspira a ser-lo. Mapserver sobresale en el dibujado de datos espaciales (mapas, imágenes, datos vectoriales, .. ) por internet.

Mas allà de explorar datos GIS, MapServer te permite crear "imágenes de mapas geográficos": mapas que pueden dirigir a los usuarios hacia el contenido. Por ejemplo, Minnesota DNR Recreation Compass  proporciona a los usuarios mas de 10.000 páginas web, reportes i maps en una sola aplicación. La misma aplicación sirve de "generador de mapas" para otras partes de la web, proporcionando contexto espacial donde se requiera..

MapServer fué inicialmente desarrollado por la Universidad de Minnesota (UMN) en el proyecto ForNet  en cooperación con la NASA y el Departamento de Recursos Naturales de Minnesota (MNDNR). Actualmente,  el proyecto MapServer se hospeda en el proyecto TerraSIP , un proyecto subvencionado entre otros por la NASA y la Universidad de Minnesota UMN.

El software se mantiene con un creciente número de desarrolladores ( cerca de 20) de todo el mundo y es soportado por varios grupos de organizaciones que crean mejoras y lo mantienen.

Características

  • Salida cartográfica avanzada

    • Dibujado de geometrias y ejecución en función de la escala
    • Etiquetado de geometrias incluyendo detección de colisiones
    • Plenamente customizable, salida basada en plantillas
    • Fuentes TrueType
    • Elmentos de mapa automatizados (barra de escala, mapa de referencia y leyenda)
    • Mapas temáticos usando clases basadas en expresiones lógicas o regulares.
  • Permite scripts en varios lenguajes

    •  PHP, Python, Perl, Ruby, Java, and C#
  • Se ejectua en múltiples plataformas

    • Linux, Windows, Mac OS X, Solaris, y más …
  • Soporta múltiples formatos de datos vectoriales y raster

    • ESRI shapfiles, PostGIS, ESRI ArcSDE, Oracle Spatial, MySQL y otros a través de OGR
    • TIFF/GeoTIFF, EPPL7, y otros a través de  GDAL
  • Cumple las especificaciones de Open Geospatial Consortium (OGC)

    • WMS (cliente/servidor),  WFS no transaccional (cliente/servidor), WMC, WCS, Filter Encoding, SLD, GML, SOS
  • Soporta proyecciones

    • Mas de 1000 proyecciones diferentes al vuelo a través de la libreria Proj.4

Ogr2Ogr: Utilidad para importar/exportar Shapefiles a otros formatos

septiembre 22, 2006

Ogr2Ogr nos permite importar/exportar Shapefiles a otros formatos. Entre los formatos que admite está el MySql lo que nos permite importar y exportar shapefiles a esta base de datos. Tiene la ventaja sobre shp2mysql que és mas rápido ya que utiliza wkb ( representación de datos binarios) en vez de wkt ( reprentación de datos de texto) para introducir los datos en la base de datos. La sintaxis de esta utilidad és un poco complicada. Aqui tenemos algunos ejemplos:

Para importar un shapefile al Mysql en una tabla nueva:

  ogr2ogr -f MySQL MySQL:<bdd>,host=<host>,user=<usuario>,password=<password> <fichero.shp> -nln <tabla_destino> -update -overwrite -lco engine=MYISAM 

Para añadir un shapefile al Mysql a una tabla que ya contiene registros:

  ogr2ogr -f MySQL MySQL:<bdd>,host=<host>,user=<usuario>,password=<password> <fichero.shp> -nln <tabla_destion> -update -append -lco engine=MYISAM 

Para exportar una tabla del Mysql a un shapefile:

  ogr2ogr -f "ESRI Shapefile" <fichero.shp> MySQL:<bdd>,host=<host>,user=<usuario>,password=<password> -sql "<sentencia select>"