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
- 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.
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.
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.
/************************************************/
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).
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 sobredos 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.
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
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.
EratostenVaisse Reload!!!
ResponderBorrarjajaja reloud, si.. tiempo de no escribir pero ya de vuelta.
ResponderBorrar