Simplify Workbench: banco de pruebas para geometría simplificada

Optimizar nuestro cliente GIS, tanto para web como para escritorio, implica entre otras cosas afinar al máximo los rangos de escala de visualización para cada una de nuestras capas. Sin embargo puede darse el caso de que este mecanismo no sea aplicable. Ante esta situación, es importante que no renunciemos al ahorro en los tiempos de proceso, y en este sentido puede ser útil recurrir a la simplificación o generalización de la geometría.

Lo que aquí os ofrecemos es una herramienta que, dada una determinada entidad PostgreSQL/PostGIS, permite explorar rápidamente cuál es la relación entre tamaño de imagen, extensión del mapa, degradación visual y tiempo de proceso para un máximo de 4 valores de tolerancia designados por el usuario. Se trata de una aplicación sencilla, escrita en C#, en la que el área de trabajo se divide en cuatro paneles. En cada panel podemos asignar una tolerancia, visualizar la geometría simplificada resultante, echar un vistazo a la sentencia SQL ejecutada en PostgreSQL y comprobar el tiempo de proceso transcurrido en realizar la transacción en el servidor y generar la imagen resultante en el cliente. Además, en todo momento conocemos cuál es la dimensión en píxeles de la imagen y el ancho del mapa. La instantánea inferior muestra una sesión de Simplify Workbench en la que se compara la geometría simplificada de los municipios de España procedentes de la Base de Datos de Líneas Límite a escala 1:1.000.000 del IDEE. Se puede observar cómo el tiempo de proceso del panel C es casi 4 veces menor que el del panel A, mientras que el impacto en la visualización es casi inapreciable. Por el contrario, la reducción del tiempo de proceso en el panel D conlleva una degradación visual que, para la resolución de la imagen, no es aceptable.

Geometría simplificada de los municipios de España en Simplify Workbench. Fuente de datos: IDEE

Geometría simplificada de los municipios de España en Simplify Workbench. Fuente de datos: IDEE

Podéis disponer del código fuente de Simplify Workbench bajo licencia GPL haciendo un checkout del siguiente repositorio Subversion de GIS&Chips:

svn co http://www.gisandchips.org/svn/simplifyworkbench

Para los que queráis probarlo de inmediato, tened en cuenta que los datos de conexión a PostgreSQL y entidad PostGIS se configuran en el fichero XML app.config que acompaña al ejecutable. Por defecto, os proporcionamos una conexión al servidor PostgreSQL de GIS & Chips para que podáis hacer tests con los municipios del IDEE. Si vais a realizar pruebas con vuestros propios datos tened en cuenta que la función de simplificación de PostGIS (simplify o st_simplify) no opera sobre geometrías en coordenadas geográficas (e.g. SRID = 4326), por lo que la aplicación no realizará el tratamiento esperado. Tampoco opera sobre entidades con sistema de referencia espacial indeterminado en la tabla geometry_columns (i.e. SRID = -1).

Si eres desarrollador y te vas a ‘zambullir’ en el código seguramente te interesará conocer que Simplify Workbench no es más que una extensión de SharpMap con un interfaz gráfico en Windows.Forms. Formalmente es una solución desarrollada en el IDE de código abierto SharpDevelop, escrita en C# sobre el framework 2.0 de .NET. Integra tres proyectos:  SharpMap (versión 0.9), SharpMapSimplifyExtension y Simplify.

Seguramente alguno de vosotros ya conozca SharpMap. Desde que Morten Nielsen, su creador, publicó allá por 2005-2006  este versátil renderizador de cartografía basado en GDI+, una pequeña revolución se ha producido en el ámbito de los clientes GIS libres sobre plataforma .NET y de hecho el proyecto no sólo continúa muy activo sino que ha conseguido integrar un equipo consolidado de desarrolladores en torno a un ecosistema de proyectos interrelacionados. El proyecto SharpMap de Simplify Workbench corresponde a los fuentes de la versión 0.9, la versión estable, aunque observaréis que el namespace SharpMap.Data.Providers incluye el proveedor de PostGIS (PostGIS.cs) y una referencia a Npgsql, la librería de acceso a datos de PostgreSQL en su versión 2.0.4.

El proyecto SharpMapSimplifyExtension consta de dos clases: PostGISSimplify y VectorSimplifiedLayer. La primera es una derivación de la clase SharpMap.Data.Providers.PostGIS que modifica el método GetGeometriesInView de forma que la sentencia SQL subyacente invoque la función simplify de PostGIS con la tolerancia de entrada. También añade un delegado que permite recuperar mediante un evento tanto la sentencia SQL final como el ancho del bounding box. La segunda deriva de la clase SharpMap.Layers.VectorLayer, sobrecarga el constructor para instanciar capas vectoriales especificando una tolerancia de simplificación y modifica el método Render. Con estas dos simples extensiones podemos definir  una capa vectorial que muestre geometría simplificada de PostGIS sin variar sustancialmente la lógica habitual de trabajo con SharpMap, tal y como se muestra en este ejemplo:

//
//
//
string cnstr = "Server=your.pgsql.server;Port=5432;User Id=user;Password=secret;Database=yourDB";
string tableName = "yourPolygons";
string geomFieldName = "geometry";
string oidFieldName = "oid";
//Instance of data provider for PostGIS simplified geometry
PostGISSimplify src = new PostGISSimplify(cnstr, tableName, geomFieldName, oidFieldName);
//Instance of vector layer to hold simplified PostGIS geometry
//Third parameter is an integer corresponding to tolerance in Douglas-Peucker vertex reduction algorithm
VectorSimplifiedLayer lyr = new VectorSimplifiedLayer("SIMPLIFIED_LAYER", src, 1000);
lyr.Style.EnableOutline = true;
lyr.Style.Fill = Brushes.Transparent;
//Map object, the layer container and rendering logic construct in SharpMap
Map m = new Map(new System.Drawing.Size(350, 275));
m.BackColor = Color.White;
m.Layers.Add(lyr);
//Zoom to extents internally invokes the modified GetGeometriesInView method in PostGISSimplify class
m.ZoomToExtents();
//Retrieve map image
System.Drawing.Image img = m.GetMap();
//

El proyecto Simplify incluye el formulario estructurado en cuatro paneles comentado más arriba y una clase de conveniencia, MapRenderer, que encapsula la lógica de lectura del fichero app.config, definición de layer, obtención de la imagen, recuperación de la sentencia SQL y cálculo del tiempo de proceso. En el directorio de este proyecto encontraréis también el fichero de solución de SharpDevelop (Simplify.sln).

Para terminar, y puesto que muchos de nosotros aquí en GIS & Chips somos fans del framework de código abierto Mono, os animamos a que probéis a compilar usando esta plataforma. Sabemos positivamente que SharpMap 0.9, con pequeñas modificaciones, es compilable sobre Mono. Creemos, aunque no lo hemos comprobado, que el código de Simplify Workbench también lo es. Si alguno lo consigue nos alegrará que nos lo comente.

¡Disfrutad con Simplify Workbench!

  1. Aun no hay comentarios.

  1. Aun no hay enlaces.