Archivos del Autor

Crea una web dinámica sin programar

Hasta ahora, si querías una página web y no sabías programar, podías utilizar gestores de contenido como Wix que ofrecen una plantilla, multitud de funcionalidades extra y un gestor muy amigable para introducir y personalizar el contenido. Sin embargo, si el proyecto es un poco más ambicioso, este tipo de herramientas se quedaba a medio camino. ¿Te gustaría publicar tu colección completa de videojuegos o de un grupo de música? ¿gestionar listados de usuarios o clientes? ¿ofrecer a los usuarios que se registren en tu boletín de noticias? Para este tipo de funcionalidades web es imprescindible utilizar bases de datos, pero el conocimiento técnico va un poco más allá del HTML y CSS. Necesitarás conocer herramientas de gestión de base de datos para construir un modelo relacional de tablas en MySQL o PostgreSQL (por mencionar algunas). Cómo acceder a la información almacenada mediante queries e incluso interactuar con ésta mediante scripts DML para modificar, crear o borrar datos. Como veis, ya no sólo tendríamos que enfrentarnos a pintar el contenido en una web, si no a cómo administrar la información. Por suerte para muchos, Wix ha lanzado recientemente una mejora sustancial de su entorno de desarrollo que simplifica y facilita enormemente esta tarea: WIX Code. Sin tener conocimientos de programación avanzados y de base de datos, ahora sabrás cómo hacer una página web dinámica fácilmente.

Crea una web dinámica sin programar

Para explicar cómo funciona esta herramienta, vamos a centrarnos en un ejemplo práctico que precisamente fue la primera página que tuve que diseñar hace años para un vecino: quería publicar en una web toda su colección de cassettes, discos y vinilos LP / 7” del cantante Raphael (estamos hablando de más de 400 discos en varios idiomas). Mi vecino quería que cada disco tuviera su portada, datos del mismo (año de publicación, idioma, etc) así como todas las canciones que lo componían. Por aquel entonces, sin conocimientos de acceso a base de datos, tuve que picar a mano una a una todas las páginas. Tarea monstruosa, especialmente cuando había que hacer algún cambio que afectaba a todas las páginas.

¿Cuál hubiera sido la forma ideal de hacerlo? Guardar toda la información de los discos y las canciones en una base de datos. Diseñando una única página de contenido dinámico, se pintarían los datos de cada disco en función de los parámetros recibidos. Pero sin conocimientos avanzados de programación, esto es imposible. Si por aquel entonces hubiera existido Wix Code, lo podría haber hecho en menos de la mitad de tiempo y con un mantenimiento posterior ínfimo.

Lo que ofrece esta nueva herramienta es un entorno de trabajo en el que gestionaremos la información de forma amigable a través de una interfaz similar a una hoja de cálculo tipo Excel, aunque por detrás y de forma transparente al usuario, se almacena en una tabla de base de datos. Dentro del entorno de Wix Code, podremos crear Colecciones (lo que serían tablas en una BBDD convencional). Una colección es una hoja de cálculo en la que las columnas especifican el tipo de información y las filas serían cada elemento. En nuestro caso práctico, crearíamos una colección donde las columnas podrían ser Nombre, Año de publicación, Tipo, Idioma y Canciones. En las filas introduciríamos los datos de cada disco. Respecto a las Colecciones, comentar que podemos configurarlas para que además del propio administrador, cualquier usuario pueda interactuar con los datos (modificando, borrando o creando nuestros registros).

Una vez tenemos los datos almacenados en nuestra colección, los utilizaremos para poblar una página de contenido dinámico. A través del asistente, crearemos este tipo de página  y la asignaremos la colección de discos.  En este punto, debemos especificar un valor único que identifique de forma unívoca cada disco para generar su propia dirección URL. Para ello podríamos utilizar el título, o para ser más eficientes, en el proceso de creación de la colección crearíamos un campo numérico incremental que usaremos como “identificador” (1, 2, 3…). Dentro de la página de contenido dinámico, diseñaremos una plantilla para pintar el contenido de cada disco (imagen, título, canciones, etc).

Crea una web dinámica sin programar

Pero Wix Code no sólo ofrece esto. Imaginaros otro caso práctico con el que me topé hace muchos años cuando administraba un foro. Queríamos organizar un boletín de noticias semanal con información relevante para los usuarios, pero por ley de protección de datos sólo podíamos enviar la comunicación a los que hubieran concedido explícitamente su permiso. Para ello diseñamos un formulario en el que los usuarios introducían su e-mail y nos llegaba un correo con la solicitud. Manualmente lo introducíamos en un fichero Excel y cuando había que enviar la comunicación, copiábamos los correos electrónicos de la lista. ¿Principal problema? Que sólo había un Excel, ubicado en mi ordenador. Si otro administrador quería utilizar la lista, tenía que enviársela actualizada. Al igual que en el caso anterior, si hubiera tenido conocimientos más avanzados de programación, en lugar de mandar por correo electrónico la solicitud, hubiera guardado los e-mails de los usuarios en una base de datos que explotaría en el momento de enviar las comunicaciones. Con Wix Code podemos hacer esto sin tocar nada de código. Crearemos una colección para almacenar la información (por ejemplo, nombre y e-mail del usuario) que vincularemos con un form diseñado en el entorno de desarrollo de Wix. De esta forma, podremos mantener nuestro boletín de una forma mucho más eficiente. Un paso más allá, sería aprovechar la propia tecnología de Wix Code para generar una sección de backend desde donde podremos gestionar los datos de la colección. A través de una pantalla podríamos añadir, borrar o modificar datos.

Otra de las posibilidades que ofrece la herramienta son las interacciones con el usuario mediante acciones javascript (cuando se pulse un botón que se pinte un tooltip, por ejemplo). En realidad, utiliza el framework jQuery, que facilita enormemente el uso de javascript, como el acceso DOM a los elementos web. Es cierto que para estas opciones es necesario tener ligeros conocimientos de programación, pero el entorno de desarrollo de Wix Code está preparado para ofrecer dinámicamente una serie de opciones utilizando una práctica habitual en IDEs de desarrollo: pulsando CTRL+espacio aparecerá una ventanita con los métodos o acciones disponibles para el objeto con el que estemos trabajando.

Como veis, por suerte ahora tenemos a nuestra disposición herramientas que facilitan el acceso al diseño de páginas web complejas y elaboradas sin necesidad de tener conocimientos específicos de programación.

 

 

Sin Comentarios

Herramientas para analizar y monitorear servidor de Qlikview

Últimamente estamos haciendo foco en mejorar el rendimiento de los módulos de Qlikview, ya que alguno de ellos con más 180 millones de registros está bloqueando el servidor de forma intermitente (una máquina con 128 GB de RAM y 8 cores). Hace unas semanas publicamos recomendaciones y buenas prácticas tanto en la configuración del servidor como en el desarrollo de los informes en Qlikview. En esta ocasión, os proponemos tres herramientas gratuitas y distribuidas por Qlikview o su comunidad para analizar qué módulos son los que debemos optimizar y concretamente en qué puntos actuar.

 

Descargar herramientas optimización Qlikview
Qlikview Governance Descargar Qlikview Governance
Qlikview Optimizer Descargar Qlikview Optimizer
Qlikview Document Analyzer Descargar Qlikview Document Analyzer

Qlikview Governance [descargar]

Herramienta oficial que se nutre de los logs del servidor para analizar el consumo de los recursos de la máquina, licencias y estadísticas de módulos. La primera vez que se ejecuta el Governance es necesario configurar la ruta donde se ubican los módulos y los correspondientes logs (recordad que es necesario que en Document Settings tengamos habilitado generar logs de cada módulo). Con este módulo principalmente podemos explotar la información relacionada con:

  • Uso de RAM y memoria virtual del servidor. Permite analizar los responsables (módulos y usuarios) de dicho consumo, así como ubicar temporalmente los picos y horas valle.
  • Licencias, usuarios concurrentes y sesiones de usuario. Especialmente indicado en la gestión de una cartera de licencias limitada.
  • Nivel de complejidad de módulos, en esta pantalla se analizar un ranking de los módulos más complejos en relación al nº de registros, peso, usuarios que acceden (sesiones), cantidad de objetos, expresiones, cíclicos, etc.

Es una herramienta fundamental e imprescindible en el día a día. Nosotros la recargamos diariamente como tarea del Publisher.

Qlikview Governance download

Qlik Optimizer [descargar]

Este módulo nos va a ofrecer de un vistazo qué elementos de un informe o módulo Qlikview son los que más memoria RAM consumen. Nos permite seleccionar el tipo o subtipo de elemento a analizar y además, se pueden hacer comparaciones entre varios módulos. Para poder trabajar con esta herramienta es necesario generar un fichero .mem de los módulos que vamos a analizar. Para ello, abrimos cada módulo, pulsamos en Settings > Document Properties > General y hacemos clic en el botón Memory Statistics…Aparecerá una ventana modal para seleccionar la ubicación donde depositar el fichero .mem. Al arrancar por primera vez Qlik Optimizer seleccionaremos esta ubicación y recargamos datos.

Qlik optimizer descarga

Algunas consultas que podemos analizar con esta herramienta:

  • Descubrir la tabla del modelo de datos más pesada haciendo drill down sobre el gráfico de tarta seleccionando database > table > records.
  • Buscar los objetos que más tiempo de cálculo necesitan. Para ello nos centramos en la tarta de la derecha.
  • Analizar granularidad de los datos (nº de valores distintos de un mismo campo). Utilizando el filtro de subtype filtramos por “Symbols” para identificar estos campos. Normalmente son claves, métricas (indicadores) o fechas. En este último caso podemos encontrar campos datetime de los que sólo nos interesa la fecha, no la hora, por lo que podríamos reducir su granularidad convirtiéndolos a formato date.

Qlikview Document Analizer [descargar]

Al abrir la herramienta debemos configurar qué módulo vamos a analizar. Especificamos la ruta donde se encuentre y pulsamos el botón EXTRACT METADATA. Una vez generada, aparecerá un popup y podremos pulsar en el botón RELOAD. Con esta herramienta podremos:

  • Identificar los campos que se cargan en el modelo y no se utilizan. Podremos generar una sentencia DROP FIELD con todos ellos para añadir al final del script. Hay que revisar bien estos campos, porque suele haber falsos positivos (por ejemplo, si algún campo se utiliza en una expresión personalizada, a veces se detecta como no utilizada).
  • Analizar las expresiones que utilizan Count() (recordad que es recomendable evitar los count distinct, en su lugar, lo ideal es utilizar un flag con 1 y 0); otras que utilicen IF anidados y ver su complejidad (intentar reducirlos al máximo posible); uso de SET Analysis, etc.
  • Recomendaciones para optimizar el módulo: normalmente son para configurar como autonumber las claves que usamos para romper tablas sintéticas o convertir a formato numérico las dimensiones cuyos valores son números.

Qlikview Document Analyzer

Sin Comentarios

Ejecutar tarea en Qlikview Server desde línea de comandos

Vamos a automatizar un proceso utilizando Talend ETL en el que debemos recargar un módulo de Qlikview de forma desatendida cuando se reciba un mail con un asunto específico en el buzón de correo del área. Respecto a la parte de Qlikview, para lograrlo utilizaremos la herramienta QMSEDX que permite lanzar desde línea de comandos una tarea programada de Qlikview Server/Publisher (ésta debe estar previamente creada).

 

Seguridad (permisos de usuario)

En primer lugar debemos revisar si el usuario que va a ejecutar la herramienta QMSEDX tiene los permisos correspondientes. En nuestro caso utilizaremos un usuario de servicio en lugar del nuestro propio de desarrollo. Es necesario que el usuario esté dentro de los grupo de windows:

  • Qlikview Administrators
  • Qlikview EDX

Este último es necesario crearlo manualmente, ya que no se crea durante la instalación del servidor de Qlikview. Una vez creado el grupo EDX y añadido el usuario en cuestión, reiniciamos los servicios de Qlikview.

Ejecutar tarea en Qlikview Server desde línea de comandos

 

Configurar tarea programada como External Event

No es necesario tener licencia de Qlikview Publisher para utilizar la herramienta QMSEDX, en su lugar, podemos configurar una tarea programada en el propio QV Server como External Event. Simplemente seleccionamos el documento en cuestión y en la pestaña Reload configuramos la última opción On an External Event. Introducimos la contraseña y pulsamos el botón Apply. Podemos reconfigurar el campo Timeout seconds. La dependencia la dejaremos como select, ya que la idea es lanzar la tarea programada desde línea de comandos, no cuando se ejecute otra tarea programada.

Ejecutar tarea en Qlikview Server desde línea de comandos

 

Configurar fichero .bat para que ejecute QMSEDX

En primer lugar debemos descargar la herramienta QMSEDX (podéis hacerlo desde aquí). Descomprimimos el fichero QMSEDX_CommandLine que contiene QMSEDX.exe y QMSEDX.exe.config.

Abrimos el bloc de notas e invocamos a QMSEDX con los siguientes parámetros:

QMSEDX.exe -task=”nombreTarea” -password=”contraseña

Donde la nombreTarea en el caso de disponer de licencia Publisher será el nombre de la tarea programada. En nuestro caso, como no tenemos esta licencia y utilizaremos el gestor de tareas de QV Server, debemos indicar la ruta “virtual” dentro del servidor (el nombre que hemos asignado a la ruta física de los documentos que hemos parametrizado System > Folders) y el nombre del fichero .qvw. Por ejemplo: en este caso TALEND/cuadro_mando_qv.qvw.

Ejecutar tarea en Qlikview Server desde línea de comandos

Si indicamos mal la ruta/nombre del fichero o el nombre de la tarea, nos arrojará un error:TaskNotFound.

Ejecutar tarea en Qlikview Server desde línea de comandos

En algunos ejemplos se incluye el parámetro -qms=http://<QVserverName>:4799/QMS/Service, no es necesario para las tareas de QV Server. En cualquier caso, con modificar el valor QVServerNahttpme por localhost o el nombre de nuestra máquina sería suficiente.

Invocamos el .bat y se lanzará automáticamente la recarga desde el planificador.

Ejecutar tarea en Qlikview Server desde línea de comandos

Sin Comentarios

Optimización módulos Qlikview

Días atrás comentamos cómo optimizar un servidor de Qlikview para mejorar el rendimiento y consumo de memoria RAM. En esta ocasión, os mostramos recomendaciones para un correcto desarrollo del script y diseño de interfaces de usuario.

Optimización qlikview

Buenas prácticas en desarrollo de módulos en Qlikview

  • Eliminar claves sintéticas del modelo de datos
  • Eliminar loops del modelo de datos
  • Utilizar QVDs cuando sea posible y con el parámetro OPTIMIZED
  • Utilizar campos numéricos para cruzar tablas
    Mediante tablas maestras o lookup en el modelo
  • “Autonumber” para reemplazar claves concatenadas (claves combinando campos para romper tablas sintéticas).
    Esta función genera una clave numérica única por cada valor diferente de un campo. En el caso de claves concatenadas, asigna a cada par un número determinado. Se utiliza pasando como parámetro los campos concatenados, por ejemplo: autonumeric(COD_CAMPO_1 + COD_CAMPO_2)
  • Eliminar la hora de los campos de fecha
    Formateando desde el script estos campos como DATE en lugar de DATETIME. Desde SQL con la sentencia CAST(XXXX as DATE) y en Qlikview DATE(XXX) o FLOOR(XXX). Si es necesaria la hora, se puede mostrar en otro campo.
  • Eliminar campos y tablas lookup no utilizados del modelo de datos
  • Usar flags numéricos cuando sea posible
    Primar el uso de booleanos (1 o 0) en lugar de “S”/”N” o “SI”/”NO”
  • Evitar usar SELECT * en queries
    En su lugar, recuperar sólo los campos de BD que vayamos a leer en el script.
  • Utilizar variables para expresiones recurrentes
  • Reducir expresiones con “count distinct”
    Una alternativa es reemplazarla por un SUM() de un flag configurado a nivel de script.
  • Reducir uso de IF anidados
    Los IF anidados suponen un uso intensivo de memoria y CPU. Intentar trasladar esta lógica a nivel de script o reducir las evaluaciones.
  • Evitar IF en expresiones de Gráficos o tablas
    Es importante evitar utilizar los IF en los títulos de tablas, CONDITIONS para mostrar un objeto y textbox.
  • Reducir comparativa entre campos de tipo texto
    Utilizando siempre que sea posible tablas lookup o bien fabricar una clave numérica con la función autonumeric.
  • Eliminar o reducir uso de MACROS
  • Reducir uso de Show Frequency (Presentation)
    Se utiliza normalmente en los MultiBox y ListBox.
  • Reducir el número de objetos de cada hoja
    Eliminar objetos redundantes u ocultos. Administrar correctamente el uso de charts, textbox, etc.
  • Minimizar uso de Set Analysis en tablas grandes
  • Reducir uso de tablas pivotantes en aplicaciones grandes
  • Evitar funciones al vuelo como “inmonth”, etc
  • Utilizar cargas de datos binarias de periodos históricos o datos no sensibles a cambio
  • Reducir número de CHART abiertos en cada hoja
    En su lugar, mostrarlos minimizados si es posible.
  • Calculate Condition para limitar datos en tablas y charts
  • Utilizar variables o set analysys en lugar de cálculos complejos en las expresiones

 

Recomendaciones: expresiones

Count ( Distinct ‘FieldName’)

Reemplazar el count() por un sum() y el cualificador “distinct” por el valor número 1 para cada ocurrencia distinta del campo.

Load
Alfa,
if (peek(‘Alfa’)=Alfa,0,1) as Flag1,
Num
resident table_1
order by Alfa Asc;

En este caso, la función PEEK compara cada valor del campo “Alfa” con el valor leído anteriormente. Si los valores son iguales, se asigna un 0, si son diferentes, se asigna un 1. El número de valores distintos será sum(Flag1). Es importante que la tabla esté ordenada por el campo Alfa.

Otra alternativa es una query sencilla con los distintos valores:

Load
Distinct Alfa,
Alfa as AlfaDist
resident table_1;

 

If ( Condition(Text),…..)

Mapear los campos de tipo texto a números. Por ejemplo, utilizando la función Autonumber. La expresión de esta forma sería: If (Alfa= ‘ABC’, ‘ABC’, left (Alfa, 2)).

Load
*,
Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;

La expresión cambiaría a  If ( Flag = 1,’ABC’, left (Alfa, 2))

 

Sum ( If (Condition, ‘FieldName’…))

En este caso la agregación se hace en tiempo de ejecución y repercute en el consumo de memoria. Si es posible, es preferible hacer el cálculo a nivel de SCRIPT.

 

If ( Condition1, Sum(‘FieldName’),

La lógica de IF anidados es conceptualmente sencilla, pero normalmente es complicado administrarla. Una gran cantidad de IF anidados supone un uso intensivo de CPU y memoria. Es recomendable revisar los IF anidados para intentar reducir el número de anidaciones. Otra opción es cuando sea posible, sustituir los IF por variables, por ejemplo Quantity*Price donde Price es una variable.

 

Sort text

QV automáticamente evalúa si un campo debe tratarse como número, texto o “general”. Los campos evaluados como texto se ordenan como text, que es la forma más lenta. Esto puede reemplazarse manualmente desde el script.

 

Dynamic captions and text objects

Se pueden utilizar expresiones en prácticamente cualquier objeto que permita introducir texto. Una expresión se evalúa en función de su entorno, por ejemplo, si están definidas en un gráficos o tablas (pivotantes o straight) sólo se calculan cuando estos objetos están activos (no cuando están minimizados). Por otro lado, si tenemos expresiones en el título de un objeto, en el show o calculation condition se evalúan cada vez que se hace una selección.

 

Macro triggers ( “on change” )

Cuidado con lanzar macros en cascada o de forma recursiva generando bucles.

 

Checklist de optimización módulos Qlikview

En uno pdf de documentación oficial de Qlikview se distribuye una hoja excel muy útil para el equipo de desarrollo a modo de checklist de los elementos que hay que revisar para garantizar una buena optimización de un módulo. Podéis descargar la versión traducida al castellano desde aquí.

Checklist optimización módulo qlikview

 

Sin Comentarios

Optimización Qlikview Server

Cada vez que un módulo es abierto por primera vez el servidor carga en RAM el contenido del modelo de datos. En el momento que ese usuario hace selecciones, los cálculos y gráficos resultantes se van almacenando en la RAM del servidor, de manera que estos cálculos se pueden compartir entre todos los usuarios, agilizando futuras consultas. Mientras tanto, QlikView va almacenando el estado de la sesión actual para cada usuario.

La vida de la caché se gestiona desde el Qlikview Manager Console (QMC) configurando el working set con dos parámetros:

  • LOW: memoria RAM mínima que puede utilizar QV (no quiere decir que la reserve, es el máximo de memoria a partir del cual debe limpiar caché y purgar sesiones para liberar espacio).
  • HIGH: máximo RAM disponible para QV en caso de que sea necesario.

Optimización servidor qlikview

Cuando el consumo de RAM alcanza el valor indicado en el LOW (en nuestro caso, el 50% de la RAM disponible), se limpia la caché y se purgan sesiones. Pero si esto no es suficiente, QV puede utilizar hasta el 70% de la RAM del servidor o bien puede usar el disco como Memoria Virtual (según criterios internos de QV). Si de nuevo fuese necesaria más memoria, QV está obligado a utilizar el disco como Memoria Virtual. El rendimiento de este tipo de memoria es mucho peor que la RAM.

Una solución paliativa para optimizar el rendimiento en los picos de consumo sería subir el parámetro HIGH al 90% y NO ejecutar ninguna aplicación dentro del servidor, es decir, no abrir ni recargar módulos desde QV Desktop. Cuando finalice el valle, se recupera la configuración original.

Buenas prácticas en la configuración de Qlikview Server

  1. Incrementar recursos de hardware: ampliar memoria RAM o Cores.
  2. Limitar cantidad de sesiones concurrentes permitidas: Normalmente no se limita para evitar problemas de acceso. Si fuera necesario, se puede limitar en paralelo a asignar un timeout bajo para liberar rápidamente las sesiones en desuso.
  3. Desarrollar aplicaciones para un correcto uso de memoria: implicaría revisar scripts (tablas sintéticas, bucles, expresiones complejas, set analysis, etc) y rediseñar aplicaciones con menor número de objetos, macros, acciones y lógica en general.
  4. Reducir la cantidad de tareas programadas en el servidor: En caso de que haya tareas programadas en Qlikview Server (Publisher). Otra opción es realizar las cargas en horas de bajo consumo (madrugada).
  5. Limitar el desarrollo de aplicaciones en el servidor: desarrollar y recargar módulos en otra máquina y luego copiarlos al servidor. Lo ideal sería trabajar en un entorno de desarrollo y explotar la información desde un servidor operacional.
  6. Liberar recursos deshabilitando otras aplicaciones: en el caso de que se ejecuten otras aplicaciones en la misma máquina.

 

Buenas prácticas en diseño de modelo de datos en Qlikview

Qlikview puede analizar múltiples orígenes de datos pero la forma más eficiente es con un modelo de datos de Estrella o Copo de nieve.

Normalmente los esquemas de Estrella son la mejor solución, pero en muchas situaciones necesitaremos varias tablas de hechos. La forma correcta de conectarlas es mediante tablas de enlace para evitar claves sintéticas y loops. Se puede abordar de tres formas diferentes:

Qlikview modelo de datos

  1. CONCATENATE

Una opción es concatenar dos tablas de hechos, ya sea de forma física mediante la sentencia CONCATENATE o de forma lógica utilizando los nombres de los campos (por ejemplo, CAMPO1_A y CAMPO1_B).

En el caso de dos tablas de hechos A y B, el número de registros de la nueva tabla será la suma de los registros de ambas. Las métricas de la tabla A que no estén en B estarán a NULL y viceversa.

Los nombres de los campos deben ser exactamente los mismos (podemos renombrarlos con AS). La tabla que manda será siempre la que se cargue primero (antes del CONCATENATE).

Cuando se concatenan dos tablas, es necesario crear una referencia manual para identificar el tipo u origen de los datos, por ejemplo “Tipo”.

 

  1. ÚNICA TABLA DE HECHOS

Si es posible, otra solución es fabricar una única tabla de hechos a nivel de SQL o Script.

 

  1. TABLA DE ENLACE CENTRAL

Es la forma habitual de romper las claves sintéticas. Se crean campos de enlace entre las tablas de hecho y las maestras/lookup mediante alias de campos.

Sin Comentarios

Centroides y shapefiles de municipios de España para mapas

Actualmente estamos trabajando en un proyecto de QlikSense utilizando la extensión QlikMaps para representar en capas de un mapa indicadores sobre áreas geográficas. Para visualizar la información es necesario tener correctamente parametrizadas las coordenadas y contornos de todas las áreas geográficas que se vayan a utilizar. Los centroides y contornos de Comunidades autónomas y provincias se pueden encontrar de forma relativamente sencilla, pero para las poblaciones o municipios no hay absolutamente nada.

Shapefiles municipios españa

Desde el portal GADM podemos descargar una base de datos shapefile con las coordenadas de los contornos de todos los municipios de España, con el inconveniente de que es una BD antigua. Hasta donde hemos podido confirmar, es anterior al 2008, ya que hay pueblos que han cambiado de nombre o se han segregado de otros más grandes y aparecen unidos aun.

Para cargar los datos en QlikSense importamos los ficheros .shp a QGIS y generamos un .kml. Sin embargo, comprobamos que al cargar las áreas delimitadas por pares de coordenadas QlikSense no es capaz de correr con agilidad. Como solución, la extensión de mapas además de pintar un polígono por coordenadas, puede utilizar un código polyline. Para convertir las coordenadas a polylines utilizamos una librería gratuita de PHP, convertimos el KML a un XML más sencillo y generamos los códigos comprimidos. Podéis descargar el conversor en PHP desde aquí (nosotros los lanzamos en local utilizando un WAMP). Para validar que los polylines son correctos podéis utilizar esta herramienta de Google Utilidad codificadora de polilínea interactiva. Simplemente copiáis el código y la decodificáis. En caso de que una región tenga varios polígonos (por ejemplo la parte de Burgos dentro de Álava), para que QlikMaps lo pinte correctamente juntaremos los dos polylines con un “<br>” en medio (importante que vaya en minúsculas).

Como la BD de GADM no está actualizada, de los 8125 municipios de España no hemos conseguido los polígonos de 17 de ellos (un 99,76%). Los códigos de provincia y municipio están cruzados con las tablas del INE. Podéis descargar los ficheros con centroides y shapelines de España desde aquí:

Descargar Centroides y shapefiles de España
Comunidades autónomas <1MB
Provincias <1MB
Municipios (99,76% completo) 2MB
Códigos postales 2.4MB
Últ. actualización Nov-2017

Por ejemplo, el polígono que define el área de Alcorcón (Madrid) es el siguiente chorro de pares coordenadas:

-3.80271911621095,40.3633918762208,0 -3.80690407752991,40.3666038513184,0 -3.81053400039672,40.3639030456543,0 -3.81314897537232,40.3697967529298,0 -3.83468604087824,40.3961296081543,0 -3.83030104637146,40.4016304016113,0 -3.83774304389953,40.4031066894531,0 -3.8458130359649,40.3907318115234,0 -3.86770701408381,40.3780097961426,0 -3.8665120601654,40.3739585876466,0 -3.87787795066835,40.3730964660645,0 -3.87884902954102,40.3697280883789,0 -3.87064909934998,40.358684539795,0 -3.87086296081542,40.3532257080079,0 -3.86765193939208,40.3535194396974,0 -3.86675405502319,40.3468856811524,0 -3.85911393165589,40.3434371948243,0 -3.85418391227712,40.3305435180665,0 -3.84749698638917,40.3258628845216,0 -3.84681797027589,40.3241500854492,0 -3.8385949134826,40.3245315551758,0 -3.817715883255,40.3276824951173,0 -3.81699991226197,40.3307342529298,0 -3.79979109764098,40.3427543640137,0 -3.8047161102295,40.3530426025392,0 -3.79892897605896,40.3566513061524,0 -3.78781390190125,40.3587532043457,0 -3.80271911621095,40.3633918762208,0

Que podemos reemplazar por una elegante línea polyline:

enjuF~ueVaSbYzOtUyc@hOqcDreCka@kZgHnm@hlAlq@nnAxgChXmFjD`
fA`T`E~cAgr@ba@h@y@aSlh@sDpTwn@poAy]f\yh@tIgCkAkr@uRoaCaR
oCcjAqjBi_Ax]qUec@cLodA_\d|A

En el mapa quedaría de la siguiente forma:

Centroides y shapelines de municipios de España para mapas

Sin Comentarios