Sep 292012
 
Artículo Perl

En nuestro anterior artículo sobre cómo incluir mapas interactivos en un sitio web hemos comentado que el formato GeoJSON está muy extendido para la representación de información geográfica. Existen muchas aplicaciones que leen y generan este formato, pero en ocasiones nos puede interesar desarrollar un script para procesar esta información de una forma no contemplada por estas utilidades.

En este artículo vamos a ver cómo escribir un script perl para leer y procesar un fichero GeoJSON, y volcar los datos procesados a un nuevo fichero GeoJSON.

Vamos a tomar como ejemplo el fichero ESP_adm2.geojson que hemos obtenido de gadm.org. Este fichero contiene la división de España en provincias. Si abrimos el fichero con qgis, podemos ver la información gráfica que contiene:

En la misma aplicación, seleccionando Layer -> Open Attribute Table, podemos ver la información no gráfica asociada a cada uno de los elementos gráficos del mapa:

Podemos ver que los atributos asociados a cada elemento gráfico son:

  • ID_0, ISO, NAME_0 – Indentifican el país
  • ID_1, NAME_1 – Identifican la Comunidad Autónoma
  • ID_2, NAME_2 – Identifican la Provincia

Nuestro objetivo, a efectos de ilustrar este artículo, es descomponer el fichero ESP_adm2.geojson en un conjunto de ficheros ESP_adm2_<ID_1>.geojson, uno por cada comunidad autónoma.

Estructura del fichero geojson

En primer lugar, abrimos con un editor de texto el fichero ESP_adm2.geojson para ver su contenido:

Como vemos, el fichero contiene una estructura de tipo “FeatureCollection” que consta de un array de “features”.

Cada una de las “features” contiene los atributos que la asocian al pais, CA y provincia a la que pertenece.

Además, cada “feature” contiene una estructura  “geometry” que contiene la información gráfica. Esta estructura puede ser de tipo “Polygon” o “Multipolygon”:

  • Multipolygon Geometry : [ Polygon Geometry [, Polygon Geometry] …] – Array de Polygon Geometries
  • Polygon Geometry : [ Polígono [,Hueco]… ] – Array que consta de un polígono principal y opcionalmente uno o varios huecos
  • Polígono, Hueco: [ Punto [, Punto]… ] – Los Polígonos y Huecos son arrays de puntos que definen un área
  • Punto: [ latitud, longitud ] – Array de dos elementos

Una geometría de tipo “Polygon” consta de un array de polígonos, cada uno de los cuales es un array de puntos. A su vez, cada punto es un array de dos elementos  [latitud, longitud]. El primer polígono es el polígono contenedor que delimita el área principal, y los demás polígonos, si existen, son los “huecos”, es decir, áreas internas que no pertenecen a la región:

Una geometría de tipo “Multipolygon” consta de un array de estructuras de tipo “Polygon”.

Lectura y escritura del fichero geojson

Podemos realizar la lectura del fichero de entrada con el siguiente código:

En este código, podemos señalar:

  • La sentencia “use JSON;” para hacer uso del módulo JSON disponible en CPAN. Este módulo incorporar toda la funcionalidad necesaria para la lectura y escritura de datos JSON.
  • La sentencia ‘binmode(STDOUT, “:utf8”);’ – Un fichero JSON debe estar obligatoriamente codificado en UTF-8. Con esta sentencia aseguramos que los datos que se escriban por standard output están codificados de este modo.
  • La sentencia “local $/;” – Con esta sentencia, aseguramos que la siguiente sentencia “my $json = <STDIN>” lee la totalidad de los datos de entrada como una única cadena de texto. En caso contrario, sólamente se asignarían a la variable $json los datos leidos hasta encontrar un carácter de fin de línea.
  • Las función decode_json() interpreta el string contenido en la variable $json, y lo transforma en una hashref de perl. Del mismo modo, la función encode_json convierte una hashref en un string en formato JSON.

Descomposición en ficheros por cada Comunidad Autónoma

Con el siguiente código recorremos la estructura contenida en la variable $json, y creamos una nueva estructura por cada Comunidad Autónoma (identificada por el atributo ID_1). Por último, Escribimos las nuevas estructuras en un fichero geojson para cada una de ellas:

Análisis de la información contenida en la estructura

También nos puede interesar analizar el contenido de la estructura leída: Número y tipo de las features leídas, etc, así como obtener el rectángulo (coordenadas máximas y mínimas) en el que se encuentra contenida la información gráfica. Esto se puede implementar con el siguiente código:

    Análisis de la estructura

    Obtención del “Bounding Box”

Indice de artículos sobre programación en lenguaje Perl

 Publicado por en 9:22 pm

 Deja un comentario

(requerido)

(requerido)