O cómo saber dónde tenemos más posibilidades de tomarnos una cerveza en Málaga.
En esta entrada vamos a usar Python para automatizar la obtención de datos de OpenStreetMap (OSM) y elaborar un mapa de calor (heatmap) que nos indique dónde encontraremos más bares, cafeterías y restaurantes en Málaga. Evidentemente lo que aquí se muestra se puede usar en aplicaciones más trascendentes pero para aprender usaremos un ejemplo divertido. Este tutorial es una variante del de Nikolai Janakiev publicado en Medium.
Hacer la petición de los datos mediante Python
En QGIS mediante Python vamos a hacer una petición a OpenStreetMap mediante la API Overpass. Para ello es necesario tener los módulos json() y requests(), y tenerlos en la carpeta de Python de QGIS.
import requests import json overpass_url = "http://overpass-api.de/api/interpreter" overpass_query = """ [out:json]; area["name"="Málaga"][admin_level=8]; (node["amenity"="restaurant"](area); node["amenity"="bar"](area); node["amenity"="cafe"](area); ); out center; """ response = requests.get(overpass_url, params={'data': overpass_query}) data = response.json()
Para entender la petición que se hace a OpenStreetMap a través de Overpass es necesario comprender la estructura de datos en OpenStreetMap. En castellano, OSM se estructura en nodos, vías y relaciones (cada uno de los cuales tiene un id).

Obtención de información sobre una «Vía».
Con el código de Overpass le estamos pidiendo a la API todos los nodos clasificados con la etiqueta «amenity» que sean bar, café o restaurante que se encuentren en el término municipal de Málaga. Almacenamos la respuesta en la variable data y la codificamos en formato JSON. Mediante el siguiente bloque de código vamos a extraer de los datos aquellos elementos que nos interesan, que serían las coordenadas y el nombre del local en cuestión.
coords = [] for element in data['elements']: if element['type'] == 'node': lon = element['lon'] lat = element['lat'] try: name = element['tags']['name'] except: name = '' coords.append((lon, lat, name)) elif 'center' in element: lon = element['center']['lon'] lat = element['center']['lat'] try: name = element['tags']['name'] except: name = '' coords.append((lon, lat, name))
De esta forma ahora ya podemos pasar el contenido de coords a una capa en QGIS. Los datos de OSM vienen referenciados en el EPSG: 4326 y debemos tener esto en cuenta a la hora de importarlos en QGIS.

Información de los puntos obtenidos de OSM.
Visualizar los datos en QGIS
Ahora que ya tenemos los datos nos interesa colocarlos sobre un mapa para saber con precisión dónde tenemos que ir si queremos encontrar muchos bares. Para ello comenzaremos creando una capa vectorial en memoria y mediante un bucle for iteraremos a través de los datos e iremos creando los puntos.
layer = QgsVectorLayer('Point?crs=epsg:4326', 'point' , 'memory') prov = layer.dataProvider() prov.addAttributes([QgsField("NAME", QVariant.String)]) layer.updateFields() layer.startEditing() fields = prov.fields()
Mediante un bucle for iteraremos ahora sobre los datos e iremos añadiendo los puntos a la capa de manera automática. Aprovecharemos también para añadir el nombre que hemos obtenido de OSM.
for coord in coords: point = QgsPoint(coord[0], coord[1]) feat = QgsFeature() feat.setGeometry(QgsGeometry(point)) try: feat.setFields(fields) feat['NAME'] = coord[2] print('succeeded in adding node name') except: print('failed to add name') prov.addFeatures([feat]) layer.updateFeature(feat)
Una vez hecho esto aplicamos los cambios y agregamos la capa a QGIS.
layer.commitChanges() layer.updateExtents() QgsProject.instance().addMapLayer(layer)
Creando un Mapa de Calor en QGIS.
Usaremos el complemento «Mapa de calor», que viene por defecto en la versión 3.8 de QGIS, para obtener una representación gráfica de los resultados que nos indique la densidad de los datos que estamos tratando. En este caso, obtendremos dónde se ubican más bares en Málaga. Hemos reproyectado la capa «bares Málaga» al EPSG: 25830 y la hemos guardado en el equipo, de esta manera podemos trabajar en metros y configuramos el plugin de la siguiente manera (según el caso que se estudie estos parámetros variarán).

Configuración del plugin mapa de calor.
Cuando tengamos la capa le daremos una simbología apropiada para visualizar mejor los datos. Para visualizar la capa tal y como la vemos más abajo hemos de modificar en la pestaña «Transparencia» el valor de «sin datos» a cero. Hemos colocado una capa de OSM por debajo y dotado de transparencia a nuestro mapa de calor para ver las calles en las que tenemos más posibilidades de encontrar una cafetería, bar o restaurante.
Conclusiones
Aunque el sujeto de este análisis, al tratarse de bares en Málaga, pueda parecer banal y que carece de importancia. Ha permitido en este caso comprobar que existe una gran cantidad de locales que no aparecen reflejados en el caso de Málaga. Es decir, permite revisar la cartografía si ya conocemos de antemano la distribución espacial de una entidad, lo que es bastante útil si queremos colaborar con el proyecto OSM.
En los casos en los que OSM sea la única fuente de información geográfica, estos análisis pueden ayudarnos en ciertas situaciones en las que por ejemplo queremos saber dónde se encuentra el hospital más cercano, la mayor concentración de vías de comunicación… Contando siempre con el apoyo de otros medios para verificar esta información antes de tomar cualquier decisión.
Hola, me pareció super interesante el tutorial, pero tengo problema en replicarlo.
Al importar en la consola Python las primeras 14 líneas, me retornan muchos errores. Hay un espacio en donde podría compartirles los errores? gracias!
Buenas Luca, es importante que tengas instalado el módulo requests de Python y que se halle en una carpeta donde QGIS pueda encontrarlo. Puedes hacerlo con pip a través de la consola de Windows (cmd).