Generar imágenes de mapas con Google Chart

Por el 16 de mayo de 2008

en: Negocio|Programacion

La posibilidad de generar imágenes de mapas a modo de gráficas con Google Chart es posiblemente una de las funcionalidades más interesantes que trae este genial servicio, para ello únicamnete tenemos que hacer llamadas a Google Chart API con los datos necesarios.

Documentación Google Chart API | Mapas

Gracias a esta funcionalidad por fin podemos crear de una sencilla manera gráficos que muestren estadísticas globales por países.

Para la realización de los ejemplos que vamos a ver a continuación vamos a hacer uso de esta estructura de tablas que podemos conseguir en el apartado de descargas de MySQL.

Descarga World.sql

Esta entrada es un poco larga por lo que voy a adelantar el resultado de los ejemplos para que aquellos a los que no le interesa la programación de los mismos pueda acceder rápidamente a los datos.

Distribución de la población mundial

Distribución población mundial


Densidad de la población mundial

Mapa de densidad de población mundial


Esperanza de la población mundial

Mapa de esperanza de vida de la población mundial


GNP de la población mundial

Mapa de GNP de la población mundial


Area de superficie por países

Mapa de área de superficie de los países



Generar imágenes de mapas con Google Chart

Una vez tengamos el fichero (world.sql) deberemos de importarlo a alguna base de datos y con ello conseguiremos las siguientes tablas:

City

CREATE TABLE `City` (
  `ID` int(11) NOT NULL auto_increment,
  `Name` char(35) NOT NULL default '',
  `CountryCode` char(3) NOT NULL default '',
  `District` char(20) NOT NULL default '',
  `Population` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ID`)
)

Country

CREATE TABLE `Country` (
  `Code` char(3) NOT NULL default '',
  `Name` char(52) NOT NULL default '',
  `Continent` enum('Asia','Europe',
  'North America','Africa','Oceania',
  'Antarctica','South America')
  NOT NULL default 'Asia',
  `Region` char(26) NOT NULL default '',
  `SurfaceArea` float(10,2) NOT NULL default '0.00',
  `IndepYear` smallint(6) default NULL,
  `Population` int(11) NOT NULL default '0',
  `LifeExpectancy` float(3,1) default NULL,
  `GNP` float(10,2) default NULL,
  `GNPOld` float(10,2) default NULL,
  `LocalName` char(45) NOT NULL default '',
  `GovernmentForm` char(45) NOT NULL default '',
  `HeadOfState` char(60) default NULL,
  `Capital` int(11) default NULL,
  `Code2` char(2) NOT NULL default '',
  PRIMARY KEY  (`Code`)
)

CountryLanguage

CREATE TABLE `CountryLanguage` (
  `CountryCode` char(3) NOT NULL default '',
  `Language` char(30) NOT NULL default '',
  `IsOfficial` enum('T','F') NOT NULL default 'F',
  `Percentage` float(4,1) NOT NULL default '0.0',
  PRIMARY KEY  (`CountryCode`,`Language`)
)

Ejemplos de gráficas de mapa (Google Chart API + world.sql)

En primer lugar veamos un ejemplo de un mapa en blanco

Mapa en Blanco


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:_&chtm=world

Ahora que hemos podido crear un mapa en blanco podemos probar a introducirle algunos datos al mapa, si hemos leido la documentación de la API vemos que deberíamos tener el código de cada uno de los países para poder situar correctamente los datos.

Si hemos importado la estructura de tablas anteriormente citada no habrá ningún problema ya que trae los datos necesarios:

La API de Google Chart utiliza la ISO 3166-1 alfa-2 que es el estándar que proporciona códigos para los nombres de los países, al ser la “alfa-2″ el sistema de códigos utiliza dos letras, que como podeis comprobar corresponden a los dominios de nivel superior de Internet de cada uno de los países.

En la tabla “Country” corresponde al campo “Code2″.

Mapa de distribución de la población mundial

En este mapa mostraremos la distribución mundial de población por países adquiriendo un tono más oscuro aquellos países que acumulan mayor población.

Distribución población mundial


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:9wNKIHHGGFFEEE

Para generar este mapa es necesario un pequeño script de PHP y la estructura de tablas anteriormente citada, como se puede ver hay una función que codifica los datos, esto se hace para que podamos meter más cantidad de espacio en menos caracteres.

El otro punto a tener en cuenta es que para generar un mapa no podremos dar valores superiores a 100 por lo que debemos en primer lugar conseguir el valor máximo para poder obtener el porcentaje del resto de datos.

Para el resto de características del mapa lo más sencillo es echar un vistazo a la API.

Sin codificar se puede llegar a imprimir en el mapa aproximadamente 120 países, una vez codificado no hay problema para incluir datos de los 239 países.

Descarga este código

<?php
function simpleEncode($values, $maxValue=-1)
{
  $simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  $simpleLength = strlen($simpleEncoding)-1;

  if ($maxValue < 0) $maxValue = max($values);

  $chartData = 's:';
  foreach ($values as $currentValue) {
    if (is_numeric($currentValue) && $currentValue >= 0) {
      $chartData .= $simpleEncoding[round($simpleLength * $currentValue / $maxValue)];
    } else {
      $chartData .= ‘_’;
    }
  }
  return $chartData;
}

$conexion = mysql_connect("localhost",
 "USUARIO", "PASSWORD");
mysql_select_db("rf_21_innodb", $conexion);

$query = "SELECT MAX(population) as max_pop from country";
$result = mysql_query($query, $conexion) or die(mysql_error());
$max = mysql_fetch_assoc($result);
$max = $max['max_pop'];

$query = "SELECT Population, Code2 from country
WHERE Population > 0 order by Population DESC";
$result = mysql_query($query, $conexion) or die(mysql_error());

$paises = "";
$data = array();

 while ($row = mysql_fetch_assoc($result))
 {
	$data[] = ($row['Population']/$max)*100;
	$paises .= $row['Code2'];
 }
$data = simpleEncode($data);
?>

<img src="http://chart.apis.google.com/chart?cht=t&chs=440x220&
chd=<?=$data?>&chco=ffffff,FFEBD7,FF6600&
chld=<?=$paises?>&chtm=world&chf=bg,s,EAF7FE">

Mapa de densidad de población mundial

En este mapa mostraremos la densidad de población mundial por países.

Generar este mapa será más fácil porque tenemos ya creada la base en el ejemplo anterior, para este mapa únicamente tendremos que cambiar las sentencias SQL y aplicar algunos filtros para poder obtener resultados eficientes (hay pequeños países con una densidad de población desorbitada que dejan los valores máximos demasiado altos).

SELECT MAX(Population/SurfaceArea) as max_pop from country
SELECT (Population/SurfaceArea) as Population, Code2
from country WHERE Population > 0 order by Population DESC

Descarga el script que genera este mapa

Mapa de densidad de población mundial


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999

Esperanza de vida de la población mundial

En este mapa mostramos la esperanza de vida por países de la población mundial.

SELECT MAX(LifeExpectancy) as max_pop from country
SELECT LifeExpectancy, Code2 from country
WHERE LifeExpectancy is not NULL AND LifeExpectancy > 0 order by Population DESC

Descarga el script que genera este mapa

Mapa de esperanza de vida de la población mundial


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999

Mapa de la salud económica de los países del mundo

En este mapa mostramos el GNP (Gross national product), indicador clave de la salud de una economía; es el valor de todos los bienes y servicios producidos por un país.

SELECT MAX(GNP) as max_pop from country
SELECT GNP, Code2 from country WHERE
GNP is not NULL AND GNP > 0 order by Population DESC

Descarga el script que genera este mapa

Mapa de GNP de la población mundial


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999

Mapa de el área de superficie de los países del mundo

En este mapa es el más sencillo de todos ya que muestra el área de superficie de cada país.

SELECT MAX(SurfaceArea) as max_pop from country
SELECT SurfaceArea, Code2 from country
WHERE SurfaceArea is not NULL
AND SurfaceArea > 0 order by Population DESC

Descarga el script que genera este mapa

Mapa de área de superficie de los países


http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999

Conclusión

Cómo hemos podido ver es bastante fácil utilizar la API de Google Chart para generar mapas, únicamente necesitamos los datos y una tabla de países que contiene los identificadores de cada país, se me ocurren muchísimas maneras de utilizar esta funcionalidad ya que hay un gran número de sitios webs que tienen datos que pueden ser analizados en un gráfico a nivel mundial.

Dejar un comentario