Cómo descargar datos de OpenStreetMap en R para complementar mis mapas

Veinticinco segundos. Ese es el margen que te da el servidor de Overpass antes de cortarte la conexión a medio pedido, y la primera vez que choqué con ese número no tenía idea de que existiera un reloj corriendo detrás de la pantalla. Llevaba semanas dándole vueltas a un raster del área del Jardín Botánico de la Universidad Austral de Chile —una imagen que por fin se veía nítida después de mil ajustes, pero sola: manchas verdes y café sin un camino, sin un estero con nombre, sin nada que dijera por dónde entra la gente a caminar. Me faltaba la capa humana, la que vive en OpenStreetMap, y para traerla a R primero hay que entender justamente ese tipo de límite técnico. Esto es, en el fondo, mapeo participativo: gente común subiendo caminos y marcando almacenes de barrio, y uno bajando esos datos con osmdata —el paquete que en la comunidad rstats se usa para esto— para complementar lo que ya se tenía armado en teledetección básica.

Por qué los datos oficiales no me alcanzaban

Antes de llegar a OSM probé lo obvio: bajar shapefiles de páginas de gobierno. Las páginas eran lentas, los archivos pesaban una tonelada, y cuando por fin abría uno la información estaba vieja —un camino que sé que existe hace años ni aparecía, o las parcelas estaban corridas varios metros. También instalé una prueba de ArcGIS pensando que ahí sería más fácil, pero la licencia expiró antes de que lograra sacar mi primer mapa con esa herramienta.

Fue mi compañera de oficina, Marcia, quien me mandó un link sobre esto (de esos que ella manda y después nunca alcanza a leer completos ella misma) y así terminé leyendo sobre OpenStreetMap (OSM). Funciona como la Wikipedia de los mapas: la misma gente va subiendo caminos, ríos y almacenes de barrio, y cualquiera puede bajar esos datos gratis dentro de R. Una cosa es saber que existe esa comunidad, y otra muy distinta lograr que el código no tire un error apenas aprietas Enter.

Código R con el paquete osmdata y la función getbb() para descargar datos de OpenStreetMap

El paquete osmdata y la lógica del bounding box

Un par de semanas después instalé el paquete osmdata. Lo primero que me costó entender es que no se le puede pedir a R todo el mapa de un país de una sola vez, porque el computador se cuelga. Ahí entra el bounding box o caja de límites: es decirle a R, de forma literal, que mire solamente un cuadradito del mundo. La función getbb() hace ese trabajo por ti —le escribes el nombre de un lugar, por ejemplo "Valdivia, Chile", y el paquete busca las coordenadas.

Ahí aprendí algo que no es un detalle menor: OSM casi siempre trabaja en el sistema WGS 84, que en el código aparece como EPSG:4326. Si tu raster está en otra proyección —a mí me pasó con uno en UTM— nada va a calzar, algo así como poner la tapa de una olla sobre un sartén cuadrado. No voy a meterme en la parte matemática de por qué pasa esto, pero sí en la regla práctica que a mí me habría ahorrado una tarde entera: revisa el sistema de coordenadas de las dos capas antes de intentar sobreponerlas.

¿Qué etiquetas pedir para no reventar la RAM?

Pedir todo —ríos, calles, edificios, bosques— fue mi primer error serio. El computador empezó a sonar como si fuera a despegar y RStudio se cerró solo, sin aviso. Descargar datos crudos de OSM mediante paquetes como osmdata satura la memoria rápido; conviene filtrar directamente en la consulta a la API en lugar de bajar todo el set de datos y recién después ver qué sirve.

OSM organiza todo en pares de clave-valor. Si quieres caminos, la clave es highway; si quieres ríos, es waterway. En vez de pedir todo Valdivia de una, aprendí a pedir solamente highway del tipo residential o tertiary, por ejemplo. Esto no es solo por prolijidad: el servidor de Overpass, el que entrega los datos, tiene ese timeout de 25 segundos del que hablaba al principio, y si el pedido es muy grande y se pasa de ese tiempo, la conexión se corta y uno se queda con las manos vacías.

Hace poco un lector de Temuco, Aldo, me escribió con una de esas preguntas tan puntuales que suele hacer: qué pasaría si el archivo que bajas de OSM pesara más de 2 GB. No le supe dar un número exacto, pero sí la lógica: cuanto más pesado el archivo, más cerca se está de que RStudio se cuelgue antes de terminar de cargarlo, así que la meta nunca es bajar "todo por si acaso", sino acotar la consulta hasta que el archivo ni se acerque a ese problema.

Si el proceso se queda pegado a medio camino, casi siempre es porque el pedido abarca demasiado: conviene acotar por tipo de etiqueta antes que subir el tiempo de espera en la configuración. Esto se parece mucho a lo que escribí sobre cómo evitar errores de memoria al procesar rasters grandes en RStudio: al final el problema siempre es el mismo, querer abarcar más de lo que la memoria puede aguantar.

Apuntes a mano sobre bounding box, EPSG:4326 y etiquetas de OpenStreetMap para mapeo participativo en R

Cuando el vector por fin encaja sobre el raster

Algo que conviene saber antes de pedir cualquier capa: si el gráfico queda completamente vacío, el problema casi nunca es el código en sí, sino la ortografía exacta de la etiqueta —waterway y no water_way, por ejemplo— porque R no tira ningún error cuando la etiqueta no existe, simplemente no encuentra nada que dibujar. Por eso ahora reviso la etiqueta en la wiki de OSM antes de escribirla de memoria.

Lo bueno llegó cuando por fin corrí osmdata_sf() para transformar la descarga en objetos de tipo simple features, mucho más fáciles de cruzar con cualquier otra capa que ya se tenga en R. Los caminos aparecieron alineados sobre mi imagen del Jardín Botánico, y ahí quedó visible algo que el raster solo nunca iba a mostrar: al cruzar esa red de senderos con un índice NDVI que ya tenía calculado, apareció un parche rojizo justo en la línea donde el camino se ensancha en verano —vegetación más débil, justo donde pasan más pies y entra más sol directo. Los píxeles verdes dejaron de ser solo píxeles y pasaron a ser un terreno con nombre y apellido, con rutas y esteros reales encima. Fue ese cruce el que terminó de mejorar mis mapas de bosque de una forma que el raster solo nunca me iba a dar.

Lo que cambia cuando el mapa tiene nombre y apellido

Mapear no es solo apilar capas, es también decidir qué historia va a contar ese mapa. Integrar vectores de la comunidad saca el análisis de ser solo índices fríos y lo convierte en algo que se puede leer: por dónde entra la gente al área del Jardín Botánico, qué zonas quedan más aisladas por falta de caminos, hacia dónde sigue creciendo la ciudad.

Mapa en R combinando raster de teledetección básica con vectores de OpenStreetMap descargados con osmdata

Si estás recién empezando con osmdata, la regla es simple: pide poco, pide específico, y revisa la etiqueta exacta antes de asumir que el código está roto. Me ha servido mucho tener a mano la carpeta de hojas donde anoto los errores que ya resolví una vez —la reviso cada vez que abro un proyecto nuevo, antes de volver a pelear con la misma proyección o la misma etiqueta mal escrita— y también organizar mis scripts de R para tener separados los pedacitos de código que de verdad funcionan.

La primavera ya está asomando en Valdivia y dan ganas de salir a caminar y subir uno mismo algún sendero que falte en el mapa del Jardín Botánico, porque así funciona esto: se aprende de los datos que otra persona subió y, de paso, se deja algo más preciso para el que venga después. Cada capa que se logra cruzar bien —raster con vector, imagen satelital con camino real— es un pedacito más de terreno que por fin se entiende completo.

Artículos relacionados