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.

heatmap orage

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).

Estructura de datos de OSM

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.

Proyección de los datos obtenidos de OSM

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 mapa de calor

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.

heatmap

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.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (5 votos, promedio: 5,00 de 5)

Cargando...

Formación de calidad impartida por profesionales