jueves, 17 de enero de 2013

Mapas en símbolos proporcionales.


 En cartografía temática, los símbolos proporcionales tienen como propósito la representación de cantidades (cifras absolutas), por ejemplo:
- Población,
- Inversión en Quetzales,
- Homicidios

 Un error muy frecuente es tratar de representar variables absolutas en mapas de "coropletas" o rampa de color. Pues esos mapas nos dan una mala lectura del fenómeno que queremos dar a entender...




En la figura siguiente, se presentan los datos de población de Guatemala (proyecciones 2012 por municipio). A propósito, y con fines ilustrativas, realize el mapa de las dos formas (símbolo proporcional y coropletas), para poder comparar dos representaciones de un mismo dato.

Guatemala - Población 2012 por municipios (fuente: Proyecciones INE de población)

Mapa de coropletas (rampa de color) - Clasificacion Jenks.Mapa en simbolos proporcionales


El primer mapa es el ejemplo de lo que no hay que hacer, esencialmente porque el tamaño de las unidades espaciales (municipios) nos induce en error, pues, a primera vista, podemos creer que la mayoridad de la población guatemalteca se concentra en la franja transversal del norte, dos municipios de Peten, y otros dos de Izabal. Por otra parte, aún si el municipio de Guatemala aparece en rojo, su tamaño reducido nos da a entender de que no es relevante, y que la población que reside ahi no es tan importante. En resumen, algunos dirian que , "el tamaño engaña".

La realidad, que se representa de mejor forma en el segundo mapa no deja dudas que la gran mayoridad de la población se concentra en el departamento de Guatemala. Cada disco o circulo es de tamaño proporcional al valor a mapear. Esa representación tambien deja apreciar las concentraciones que hay en occidente (Xela, Totonicapan y Sur del Quiche)

 En todo caso, el valor a representar si quisieramos un mapa de coropletas, seria un valor relativo, por ejemplo:
   - Densidad poblacional por km2.
   - Inversion en Q. por habitante
   - Tasa de homicidios por 100,000 habitantes.

/************************************************/

Hecha ésta aclaración, propongo el siguente ejemplo en el que realizamos un mapa temático con símbolos proporcionales por medio de PostgreSQL y MapServer. Mapeamos la cantidad de muertos por accidentes de tránsito en Guatemala durante el mes de diciembre 2012.

Mis datos:
Tengo una tabla de poligonos que representan a los municipios de la república, y otra tabla de datos que contiene la cantidad de muertos por accidente de transito para cada municipio, en el mes de diciembre 2012.


Preparación de mis datos #PostGIS
    1 --> mi tabla cat_municipios es de poligonos, y necesito un punto para cada unidad espacial, con el fin de poder posicionar un símbolo proporcional para cada municipio.
Podemos extraer el centroide de cada polígono con la funcion st_centroid(the_geom) de PostGIS, sin embargo prefiero usar st_pointonsurface(the_geom). La ventaja es que la segunda funcion nos asegura que el símbolo proporcional se encuentre a dentro del polígono.

ST_Centroid    VS   ST_PointOnSurface.
    2 --> Realizo la union de los datos (muertes por accidente de tránsito) y la geometria (el punto) a través de un join, el campo que me permite la union es el codigo municipal, presente en las dos tablas iniciales.


 SELECT  
  transito_dic.sum                  as muertos_transito,
   transito_dic.sum*4                as talla_simbolo,
    cat_municipios.cod_mupio          as codigo_municipal, 
     cat_municipios.municipio          as nombre_municipio,
   st_pointonsurface(cat_municipios.the_geom) as geometria_punto
     FROM transito_dic
     LEFT OUTER JOIN dg_pnc_novedades.cat_municipios
  ON transito_dic.id_municipio = cat_municipios.cod_mupio;

Nos resulta la tabla siguiente; los datos estan listos para mapear. La columna "talla_simbolo" es calculada en base a las muertes registradas, la multiplico por cuatro solo con fines de "calibración", para que resalten los datos en el mapa. Como pueden imaginar, vamos a usar esa columna "talla_simbolo" para determinar el tamaño de los simbolos en el mapa.






Mapeo de los datos con #Mapserver

En este caso presento un mapeo con el servidor de mapas Mapserver 6.x pero bien se podria usar cualquier GIS de escritorio que conecte a PostGreSQL. (Qgis por ejemplo)

#Mi codigo para el Layer de Mapserver
...
... LAYER
      NAME "muertes_transito_dic2012"
      STATUS ON
      TYPE POINT
      CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost dbname=xxxx user=xxx password=xxx port=5432"
  DATA "geometria_punto from (SELECT transito_dic.sum as muertos_transito,transito_dic.sum*5 as talla_simbolo,cat_municipios.cod_mupio as codigo_municipal,cat_municipios.municipio as nombre_municipio, st_pointonsurface(cat_municipios.the_geom) as geometria_punto FROM transito_dic LEFT OUTER JOIN dg_pnc_novedades.cat_municipios ON transito_dic.id_municipio = cat_municipios.cod_mupio) as foo using unique codigo_municipal using SRID=900913"
    MAXSCALE 5000000
    MINSCALE 400000
    LABELMAXSCALE 5000000
    LABELMINSCALE 250000
    CLASS
    STYLE
      SYMBOL "circle"
      SIZE [talla_simbolo]  # COLUMNA talla_simbolo PARA DETERMINAR EL SIZE
      COLOR 128 128 128 #GRIS
      OUTLINECOLOR 220 0 0 # ROJO
    END
    LABEL
  TEXT '[muertos_transito]' # COLUMNA muertos_transito PARA COLOCAR COMO ETIQUETA LA CANTIDAD
  COLOR  220 0 0
  OUTLINECOLOR 200 200 200
   BUFFER 5
  FONT "calibri"
  TYPE truetype
  SIZE 9
  PARTIALS TRUE
  ALIGN center
END
   END #class

       TRANSPARENCY 60
       DUMP TRUE
      PROJECTION
         "init=epsg:900913"
      END
       METADATA
         "wms_title" "Muertes transito diciembre por Municipio"
         "wms_abstract" "
Muertes transito diciembre por Municipio"
         "wms_extent" "200000.0 1518453.0 900000.0 1972555.0"
         "gml_include_items" "all"
       END
    END # Layer

...
...

Con fines de presentación lo integre sobre un fondo de mapa libre de OpenStreetMap (osm.org).

Muertes por accidentes de tránsito o atropellos en el mes de diciembre 2012. Guatemala. Fuente PNC.

Sin sorpresa la capital y el area metropolitana llegan primeros... pero mas sorprendente, algunas ciudades medianas como Palín, San Andres Iztapa, y Uspantan y Chiquimulilla... logran sumar más de cinco muertos por hechos de tránsito o atropellos en solo un mes!!

 En fin quisiera llamar la atención sobre dos tres puntos; ese modo de representación es mas delicado de lo que parece:
1- a menudo, hay que calibrar los circulos y realizar varios intentos para obtener un buen resultado.
2- Aún asi, cuando las unidades o entidades geográficas (puntos) son muy cercanos, los discos se traslapan y a veces uno tapa el otro...  Eso se soluciona posicionando los puntos mas pequeños en cima o adelante de los mas grandes (igualito que para la foto de grupo...). El "truco" para ordenarlos de esa forma es simplemente agregar a mi query SQL un ORDER BY talla_simbolo DESC;
Tambien se aconseja poner a los puntos un borde de color diferente para que se puedan distinguir entre si.
3- Tercer punto, y talvez lo más importante, manejen con cuidado y usen pasarelas para cruzar la calle.




De forma general, se sugieren los mapas en simbolos proporcionales cuando se tiene una cantidad de puntos relativamente pequeña, y mas que todo cuando estan posicionados en el espacio de forma relativamente homogénea.

2 comentarios: