lunes, 11 de mayo de 2015

Importando datos en CartoDB con Geobide


La publicación de aplicaciones web mapping con plataformas alojadas en la nube se enmarcan en un sector tecnológico que va madurando a gran velocidad. Estas plataformas proporcionan una infraestructura muy fiable y escalable para la implementación de soluciones a nivel de web, con costes de soporte y administración mínimos, y con más flexibilidad de la que cabría esperar.

Este artículo se centra en la carga de datos en CartoDB utilizando como herramienta el conversor de formatos GeoConverter que se distribuye con la suite gratuita Geobide. El ejercicio nos va a servir por un lado para demostrar la flexibilidad que nos ofrece CartoDB para integrarnos de forma sencilla en su arquitectura, y por otro, instruirnos en el uso de GeoConverter y su nuevo "plugin" para la lectura y escritura de datos en ese repositorio.

Wikipedia dice sobre CartoDB:

“CartoDB is a Software as a Service (SaaS) cloud computing platform that provides GIS and web mapping tools for display in a web browser. CartoDB users can use the company's free platform or deploy their own instance of the open source software. CartoDB is offered as freemium service, where accounts are free up to a certain size”

O sea, describe la típica arquitectura de herramientas geográficas alojadas en la nube con una política de precios basada en el volumen de datos alojados y en un portfolio de capacidades tecnológicas para ajustarlas a nuestras propias necesidades.

Por otra parte Geobide es una suite gratuita que engloba un conjunto de herramientas desktop para transformar y geoprocesar datos geográficos. Geobide soporta los formatos CAD/GIS vectoriales más comunes en el mercado (Shapefile, DGN, DXF/DWG, SDE, FGDB, PostGIS, LAS, ...).



El ejercicio me va a permitir demostrar la flexibilidad que ofrece CartoDB con sus APIs y lo fácil que nos va a resultar integrar nuestras propias herramientas en esa arquitectura basada en la nube.

Pongámonos ya manos a la obra!

Como es lógico, CartoDB ofrece su propio importador de datos desde diferentes formatos de fichero (Shapefile, CSV) pero yo voy a “practicar” con su API desarrollando un nuevo lector-escritor de su repositorio de datos para Geobide. Este nuevo "plugin" se ofrece ya de forma gratuita y lo puedes descargar libremente junto con toda la suite Geobide desde su web. Ahí va un pantallazo de GeoConverter con los todos formatos soportados incluyendo también el correspondiente a CartoDB.


De las diferentes APIs para desarrolladores que ofrece CartoDB hay una que me ha parecido especialmente interesante por su flexibilidad, y es la SQL API. Según la documentación, CartoDB aloja los datos, nuestros propios datos subidos a la nube, en PostgreSQL/PostGIS y esta API nos permite interactuar con ellos utilizando directamente sentencias SQL a las capas geográficas alojadas.


Guau!!!! eso suena muy bien, pues a ver si es verdad :-). El desarrollo del nuevo plugin lo he basado en el uso de ese API que mediante sentencias SQL estilo “CREATE TABLE”, “SELECT”, “INSERT”, … se gestionan los datos de la capa en CartoDB. Podemos ahora con GeoConverter personalizar mejor el proceso de importación de los datos (aspecto no demasiado elaborado en la herramienta propia de CartoDB) en aspectos como la definición de los campos de las geometrías, o en la definición de reglas y expresiones para la personalización de los valores de sus atributos.

Quedan fuera de este artículo los detalles técnicos del desarrollo del plugin para GeoConverter que daría para otro artículo distinto donde documentar el uso de su SDK para la creación de nuestros propios gestores de formatos u otras funcionalidades.

Bueno, pues vamos a allá y como ejercicio podemos utilizar una capa de municipios de mi querida tierra Navarra. Esta capa la tengo descargada de la IDE de Navarra (IDENA) y es un Shapefile de 360 recintos con sus específicos atributos en el correspondiente fichero DBF.



Sobra decir que podríamos usar como entrada de GeoConverter nuestra propia capa de datos, y en cualquiera de los formatos CAD/GIS soportados, incluso ahora también el propio CartoDB!

Puedes consultar en este link la ayuda completa de GeoConverter.


Paso 1, Seleccionar la fuente de datos de entrada.

Indicamos en este punto el formato y aquellos datos que son personalizables en la lectura de la capa a cargar.


Para un Shapefile, simplemente debemos indicar el nombre del fichero.



Paso 2, Definir un filtro alfanumérico y/o espacial a aplicar a esos datos de entrada si queremos sólo cargar un extracto de toda la capa.



Paso 3, Definir la fuente de datos de salida.

En este ejercicio definimos como salida el formato “CartoDB”, indicando el nombre de usuario y ApiKey de usuario CartoDB donde vamos a volcar los datos. 




La definición geométrica y alfanumérica de la capa es automáticamente mostrada por GeoConverter desde la capa de entrada, pero podemos modificar por ejemplo la tabla de atributos para ajustarla a nuestras preferencias y que será la que en un fin último veremos como dataset en CartoDB.

A modo didáctico vamos a personalizar la tabla de atributos, borrando algún campo que viene de la capa de entrada, y añadimos alguno asignando su valor en base a una expresión basada en datos de los features (valores de campos o datos geométricos como área, longitud, …). La expresión que podemos definir puede contener la combinación de atributos, operadores matemáticos estándar, y funciones de utilidad que necesitemos para calcular el valor final del atributo.



Paso 4, definir la transformación espacial de las geometrías a grabar.

CartoDB almacena las geometrías de cada capa en dos campos “the_geom” y “the_geom_webmercator” en los sistemas de referencia espacial “EPSG:4326” y “EPSG:3857” respectivamente. El segundo sistema de referencia es gestionado automáticamente por CartoDB así que para nosotros como usuario nuestra capa se maneja en “EPSG:4326”.

Indicamos pues la transformación a aplicar a la capa a cargar. El sistema de referencia espacial de la capa de municipios de mi ejemplo es el “EPSG:25830”, y como salida indicamos el “EPSG:4326”.



Y ya está! Pulsar el botón "Procesar" y listo. Ya tenemos nuestra capa en el repositorio de CartoDB para usarla en su estupenda plataforma!




En este punto me gustaría comentar la buena impresión que ofrecen las herramientas de CartoDB para un recién llegado como yo a este producto, con una interfaz moderna e intuitiva. Un "bonus" por esta plataforma!

Como conclusión final del artículo podemos resumir que hemos comprobado la flexibilidad que nos ofrece CartoDB con sus APIs y lo hemos aplicado en desarrollar un "plugin" en otra herramienta externa. De paso nos ha servido para descubrir la enorme potencialidad que se abre con esas APIs de este “gis-cloud”.

Se me queda en el tintero mejorar el plugin de Geobide para la carga de las geometrías. Actualmente inserto cada una de ellas en una sentencia SQL tipo “INSERT INTO ...” independiente y que como era de preveer es muy lento para la carga masiva de datos. La solución me vendrá de modificar el proceso interno de inserción basado en paquetes o ficheros. Pero eso es una tarea a investigar en sus APIs y en la que debo profundizar. Actualización: Fijado, el core ahora gestiona las inserciones de las geometrías usando una transacción compleja que agrupa las sentencias SQL por paquetes.

Import data to CartoDB with Geobide



Publication of web mapping applications with hosted cloud platforms are part of a technology sector that is maturing rapidly. These platforms provide a highly reliable and scalable solutions for the implementation of web-level, with minimal support and infrastructure costs, and with more flexibility than expected.

This article focuses on import data to CartoDB using the GeoConverter tool that ships with the free suite Geobide. The exercise will serve us to demonstrate the flexibility that CartoDB offers to integrate easily into its architecture, and secondly, to instruct in the use of GeoConverter and his new "plugin" for reading and writing data in this repository.

Wikipedia says about CartoDB:

“CartoDB is a Software as a Service (SaaS) cloud computing platform that provides GIS and web mapping tools for display in a web browser. CartoDB users can use the company's free platform or deploy their own instance of the open source software. CartoDB is offered as freemium service, where accounts are free up to a certain size”

In other words, describes the typical architecture of geographic tools hosted in the cloud with a pricing policy based on the volume of data stored and a portfolio of technology capabilities to fit our own needs.

Geobide is a free suite that includes a set of desktop tools to transform and geoprocessing geographic data. Geobide supports most common CAD/GIS vector formats on the market (Shapefile, DGN, DXF/DWG, SDE, FGDB, PostGIS, LAS, ...).



The exercise will allow me to demonstrate the flexibility that CartoDB offers with its APIs and how easy it is going to be integrating our own tools in this cloud-based architecture.

Let's get to work!

Naturally, CartoDB offers its own data importer from different formats (Shapefile, CSV) but I will "practice" with its API to develop a new reader-writer of his data repository for Geobide. This new "plugin" is already available for free and you can download freely with all Geobide suite from its website. Here's a screenshot of GeoConverter with all supported formats including also the CartoDB dataset.


Of different APIs for developers that CartoDB offers, one of them seemed especially interesting for me because of this flexibility, it is the SQL API. According to the documentation, CartoDB saves the data, our own data uploaded to the cloud, in PostgreSQL/PostGIS databases and this API allows us to interact with them using SQL statements directly to hosted geographic layers.



Wow! That sounds great, we'll see if it's true :-). I have based the development of the new plugin on the use of this API using SQL statements as "CREATE TABLE", "SELECT", "INSERT"... in order to manage the layer in CartoDB. We can now use GeoConverter to better customize the data import process (aspect not too fancy in the tool of CartoDB) in areas such as the definition of the fields of geometries, or the definition of rules and expressions for customizing values of its attributes.

Left out of this article the technical details of plugin development for GeoConverter that would for any other article which document the use of the SDK for creating our own format managers or other functionalities.

Well, to practice we can download the layer of municipalities of my dear land Navarra. This layer is available from the IDE of Navarra (IDENA) and it is a Shapefile with 360 polygons with their specific attributes in the corresponding DBF file.


Needless to say that we could use as input in GeoConverter our own data layer, and saved in any of CAD/GIS formats supported, even now also CartoDB!

You can check this link to see the GeoConverter online help (Sorry, only in spanish).

Step 1: Select the input source.

Indicate at this point the format and data that are customizable in the source layer to load.


For a Shapefile, we simply indicate the file name.



Step 2: Define an alphanumeric and/or spatial filter to be applied to these source if we just load an extract of the entire layer.


Step 3: Set the output data settings.

In this exercise we define the output in "CartoDB" format, indicating the CartoDB user name and ApiKey settings where we will save the data.



The geometric and alphanumeric definition of the layer is automatically displayed by GeoConverter from the input layer, but we can change for example the attribute table to fit our preferences and it will be that we will see in the new CartoDB dataset.

By example, we will customize the attribute table, deleting a field definition loaded from the input layer, and add a field assigning its value based on an expression with data of the features (field values or geometric data such as area, length , ...). We can define the expression using a combination of attributes, standard mathematical operators, and utility functions that we need to calculate the final value of the new attribute.


Step 4, define the spatial transformation of the conversion.

CartoDB stores the geometry of each layer into two "the_geom" and "the_geom_webmercator" fields with the spatial reference systems "EPSG:4326" and "EPSG:3857" respectively. The second reference system is automatically managed by CartoDB so for us our layer is managed in "EPSG:4326".

Then indicate the transformation to apply to the source layer. The spatial reference system of my input layer is "EPSG:25830" and indicate the "EPSG:4326" as the target spatial reference system.


And that's all! Press the "Process" button and ready. We have our layer in the CartoDB repository for use in its great platform!





At this point I would like to discuss the good impression of CartoDB tools for a newcomer like me to this product, with a modern and intuitive interface. A "bonus" for this platform!

As a final conclusion of this article we tested the flexibility that CartoDB provides us with their APIs and we have applied it to develop a "plugin" into another external tool. It has helped us to discover the huge potential of these APIs in this "gis-cloud".

I have yet to improve the Geobide plugin for save geometries. Currently I insert each feature in a SQL "INSERT INTO ..." independent statement and as you would anticipate is very slow to import big data. The solution will be to modify the internal process basing it on the management of packages or files. This is my new task to investigate in these APIs. Fixed: Now the core manages the insert operations of geometries using a complex transaction wich groups them in chunks.