viernes, 2 de agosto de 2013

Google Maps en Qlikview

Fuente: WebMining

En este artículo revisaremos cómo integrar Google Maps a nuestro proyecto de Qlikview para visualizar nuestra información directamente en un mapa dinámico. Gracias a la combinación de la tecnología AJAX y una API Key de Google, la visualización geográfica de los datos contenidos en un documento QlikView es una tarea fácil y muy efectiva. Ejemplos de aplicación de lo anterior son:
  • Visualización geográfica de información de propiedades para el sector Inmobiliario.
  • Geolocalización de clientes, ventas, productos o servicios y cómo de distrubuyen geográficamente para el sector Retail o Banca.
  • Puntos de interés turístico, hoteles, restoranes y otros para el sector Turismo.
  • Visualización de ubicación de contribuyentes para el sector Gobierno.
  • Cualquier otra variable que se te ocurra y que se pueda localizar geográficamente!…

¿ Cómo crear una API Key para Google Maps v3 ?

Lo primero es que necesitarás una cuenta de Gmail, luego vas ahttps://code.google.com/apis/console/ y una vez adentro creas una nueva API > “Create a new API Project”, luego vas  a “API Access” > “Create Client ID”. Entonces selecciona Google Maps v3  de la lista de APIs disponibles y copias la key que aparece en “Simple API Access”…y ya la tienes!

Ejemplo de Integración

Para propósitos de demostración de la integración de Google Maps en Qlikview, hemos desarrollado el siguiente ejemplo:
Supongamos que tenemos la información de la población (cantidad de habitantes) de las principales ciudades de Chile y queremos desplegarla en un mapa. Tenemos entonces los siguientes datos (para cada ciudad hemos buscado las coordenadas de latitud y longitud en GMaps):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ciudad,poblacion,latitude,longitude
Arica,189692,-32.7648852,-71.1963079
Iquique,286105,-20.2440725,-70.1385651
Antofagasta,547933,-23.6239214,-70.4016127
Copiapó,272402,-27.3753215,-70.3285281
La Serena,6773,-29.9069352,-71.2470754
Valparaíso,1682005,-33.0504619,-71.6164515
Santiago,6607805,-33.4253598,-70.5664659
Rancagua,84912,-34.1620308,-70.7410124
Talca,975244,-35.4227130,-71.6565138
Concepción,1982649,-36.8148146,-73.0292574
Temuco,937259,-38.7270296,-72.5989468
Valdivia,373712,-39.8274322,-73.2512409
Puerto Montt,794529,-41.4543039,-72.9925047
Coihaique,100417,-45.5637560,-72.0646866
Punta Arenas,156502,-53.1478563,-70.9066254

Manos a la obra

Partimos nuestro proyecto de GMap en Qlikview, vamos a Archivo >> Editor de Script (o con la tecla abreviada CTRL+E) e ingresamos el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
SET DecimalSep='.';
// Google Maps en QlikView
// Google Maps Key. Obten la tuya en http://code.google.com/apis/maps/signup.html
gmap_key = 'xx';
max_zoom_level = 7; //valor máximo = 17
// Variables requeridas para calcular mapa
var_pi180=      '=pi()/180';
var_lat_offset= '0';
var_mc2=        '=256*pow(2,$(var_zoom))';
var_mc1=        '=256*pow(2,($(var_zoom)-1))';
var_mid_lat=    '=min(latitude)+(1+var_lat_offset)*((max(latitude)-min(latitude))/2)';
var_mid_long=   '=min(longitude)+(max(longitude)-min(longitude))/2';
var_zoom=       '=max(aggr(if(max( round(256*pow(2,(_zoom_level -1)))+( longitude  *((256*pow(2,_zoom_level ))/360)) )-min( round(256*pow(2,(_zoom_level -1)))+( longitude  *((256*pow(2,_zoom_level ))/360)) ) <map_size_x AND max((256*pow(2,(_zoom_level-1)))+((0.5*log((1+(sin((latitude)*pi()/180)))/(1-(sin((latitude)*pi()/180)))))*((-256*pow(2,_zoom_level))/(2*pi()))))-min((256*pow(2,(_zoom_level-1)))+((0.5*log((1+(sin((latitude)*pi()/180)))/(1-(sin((latitude)*pi()/180)))))*((-256*pow(2,_zoom_level))/(2*pi()))))<map_size_y,_zoom_level,1),_zoom_level))';
var_maptype=    '=if(isnull(only(maptype)),fieldvalue( '&chr(39)&'maptype'&chr(39)&', 1 ),maptype)';
map_size_x=     '350';
map_size_y=     '350';
SET HidePrefix='_' ;
// Campo Requerido para calcular el mejor nivel de zoom
_zoom_level:
Load RecNo( ) as _zoom_level autogenerate(max_zoom_level);
maptype:
LOAD * INLINE [
maptype
roadmap
mobile
satellite
terrain
hybrid
];
Data:
LOAD * INLINE [
ciudad,poblacion,latitude,longitude
Arica,189692,-32.7648852,-71.1963079
Iquique,286105,-20.2440725,-70.1385651
Antofagasta,547933,-23.6239214,-70.4016127
Copiapó,272402,-27.3753215,-70.3285281
La Serena,6773,-29.9069352,-71.2470754
Valparaíso,1682005,-33.0504619,-71.6164515
Santiago,6607805,-33.4253598,-70.5664659
Rancagua,84912,-34.1620308,-70.7410124
Talca,975244,-35.4227130,-71.6565138
Concepción,1982649,-36.8148146,-73.0292574
Temuco,937259,-38.7270296,-72.5989468
Valdivia,373712,-39.8274322,-73.2512409
Puerto Montt,794529,-41.4543039,-72.9925047
Coihaique,100417,-45.5637560,-72.0646866
Punta Arenas,156502,-53.1478563,-70.9066254
] (delimiter is ',');
El código anterior permite cargar las variables e instrucciones y los datos para generar el mapa. El resultado sería algo así como muestra la siguiente figura:
Editor de Script
Editor de Script
Grabamos y luego vamos a Archivo >> Ejecutar Script (o con la tecla abreviada CTRL+R) y cargamos los datos…
Agregaremos 3 objetos ahora:
  1. Un objeto Cuadro de Lista, apuntando a la variable maptype, que define el tipo de mapa (satelital, calles, híbrido, etc.)
  2. Un objeto Gráfico, con tipo de gráfico Tabla Simple, donde seleccionaremos las variables ciudad ypoblacion.
  3. Un objeto Gráfico, con tipo de gráfico Gráfico de Dispersión, donde irá nuestro mapa.
Vamos entonces a las propiedades del objeto Gráfico de Dispersión,  y seleccionamos la dimensión ciudad, como muestra la figura:
Gráfico de Dispersión, Dimensiones
Gráfico de Dispersión, Dimensiones
Luego en la opción Expresiones añadimos las siguientes 4 expresiones:
  1. longitude
  2. latitude
  3. poblacion
  4. ciudad
Las dos últimas expresiones tiene como definición la misma variable. Las expresiones longitude y latitudetienen las siguientes definiciones:
  1. longitude
    • Definición: =avg( round (256*pow(2,($(var_zoom)-1)))+( longitude  *((256*pow(2,$(var_zoom)))/360)) )
    • Color de fondo: =argb(180,round(550*poblacion/max(total poblacion)),0,80)
  2. latitude
    • Definición: =avg(((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin((latitude)*pi()/180)))/(1-(sin((latitude)*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))))
Estas definiciones se deben ingresar en la casilla Definición como muestra la siguiente figura:
Gráfico de Dispersión, Expresiones
Gráfico de Dispersión, Expresiones
Por su parte, para darle formato a la escalas de los ejes X e Y, también debemos definir expresiones. Esto lo hacemos en la opción Ejes, como muestra la siguiente figura, donde ingresamos cada una de las definiciones descritas a continuación:
  • Escala Eje X
    Min Estático: =((256*pow(2,($(var_zoom)-1)))+( var_mid_long *((256*pow(2,$(var_zoom)))/360)) -round(map_size_x/2))
    Max Estático: =((256*pow(2,($(var_zoom)-1)))+( var_mid_long *((256*pow(2,$(var_zoom)))/360)) + round(map_size_x/2)-15)
  • Escala Eje Y
    Min Estático: =((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin(var_mid_lat*pi()/180)))/(1-(sin(var_mid_lat*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))+round(map_size_y/2))
    Max Estático: =((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin(var_mid_lat*pi()/180)))/(1-(sin(var_mid_lat*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))-round(map_size_y/2)+15)
Gráfico de Dispersión, Ejes
Gráfico de Dispersión, Ejes
Finalmente, y no menos importante, en la opción Colores,  debemos ingresar el código que hace que Google Maps muestre el mapa. Esto lo hacemos en la sección Formato de Marco, donde dice Imagen Dinámica, ingresamos la siguiente expresión :
Imagen Dinámica:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
='http://maps.google.com/maps/api/staticmap?center='
&
num(var_mid_lat, '##############', '.', ',' )
&
','
&
num(var_mid_long, '##############', '.', ',' )
&
'&zoom=$(var_zoom)'
&
'&maptype='&var_maptype
&
'&size='&map_size_x&'x'&map_size_y
&
'&key='&gmap_key & '&sensor=false'


El Resultado

El resultado de todos los pasos anteriores se muestra en la siguiente figura, donde podemos ver la población de las distintas ciudades de Chile dispuestas geográficamente en un mapa dinámico:
Vista Principal, GMaps integrado en Qlikview
Vista Principal, GMaps integrado en Qlikview
Notar que el tamaño y gradiente de color de la burbúja que aparece en el mapa indica el tamaño de la población de la ciudad. Esto se logra con las definiciones que hicimos anteriormente para latitude y longitude. También podemos hacer clic en el cuadro de la ciudad, o en la burbúja del mismo mapa, y se nos despliega la ciudad en cuestión. Por su parte, el Cuadro de Lista Tipo Mapa permite cambiar la vista  a un mapa satelital, de calles o híbrido, como mencionamos anteriormente:
Detalle de Ciudad, GMaps integrado en Qlikview
Detalle de Ciudad, GMaps integrado en Qlikview
Bueno, con este ejemplo demostramos la potencialidad de Qlikview para desplegar nuestros datos usando Google Maps de una manera profesional.