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.
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.
Una vez tengamos el fichero (world.sql) deberemos de importarlo a alguna base de datos y con ello conseguiremos las siguientes tablas:
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`) )
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`) )
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`) )
En primer lugar veamos un ejemplo de un 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″.
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.
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.
<?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">
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
http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999
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
http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999
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
http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999
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
http://chart.apis.google.com/chart?cht=t&chs=440×220&chd=s:999999999999
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.