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.

10 Respuestas a Generar imágenes de mapas con Google Chart

Avatar

manu

17 de Mayo de 2008 a las 5:06 am

Muchas gracias imzyos… la verdad que es una gran herramienta.

Avatar

imzyos

16 de Mayo de 2008 a las 11:59 pm

Exelente entrada, muy interesante las cosas qeu google pone a nuestro uso

Avatar

Anónimo

16 de Octubre de 2008 a las 6:52 pm

porqe mierda no tienen referencias?

Avatar

Anónimo

10 de Septiembre de 2008 a las 8:28 pm

pongan mas imformacion
no solo mapas porfa

Avatar

Anónimo

3 de Septiembre de 2008 a las 9:03 am

gracias

Avatar

Anónimo

3 de Septiembre de 2008 a las 9:04 am

hola

Avatar

manuel

17 de Octubre de 2009 a las 4:00 am

hlaa estaa muyy buenoo estudiarr jeejej ammm lo detestoooo jejeje perooo taa bnoo xq te daa muchaa informacioonnn

Avatar

basurita

2 de Noviembre de 2009 a las 8:51 pm

esto es una porqueria no me alluda en nada

Avatar

ludmila

21 de Junio de 2010 a las 12:33 am

me parecio medio tonto por que no es lo
que he pedido nose no me gusto y los
que lo isieron son unos b…….¡¡¡
bueno con esto me despido jajajajajaja
SALAME JAJAJAJAJAJAJA BALLANSE A LABAR

Avatar

anonimo

21 de Junio de 2010 a las 12:42 am

no me alludo en nada no me gusta
y ballanse a labar el orto
ajajajajaja la concha de tu madre
hijos de la puta que los pario osea tu madre no?
en el dia de madre pobre de tu mama que tendria que ser un regalo vos pero pobre para ella seguro que fue un espanto
wueno me despido conun besito de mi concha jajajaa lo resibiste ahi va con sangre y todo
para ustedes putoooooooooooossssssssssssssssssssssssssssssssssssssssss

Dejar un comentario