- Herramienta open source basada en Python para generar mapas de ciudades de todo el mundo como pósters artísticos minimalistas
- Usa datos de OpenStreetMap (OSMnx) para visualizar elementos geográficos como calles, vías fluviales y parques, y los renderiza con matplotlib
- Ofrece 17 estilos temáticos (por ejemplo, neon_cyberpunk, blueprint, japanese_ink) y permite agregar temas personalizados con archivos JSON
- Desde la línea de comandos se puede especificar el nombre de la ciudad, el país, el radio y el tema para generar y guardar automáticamente el póster
- Una herramienta que permite a desarrolladores y diseñadores explorar la estructura urbana de forma artística mediante la combinación de diseño y visualización de datos
Descripción general del proyecto
- MapToPoster es un script de Python que genera pósters con diseño minimalista a partir del mapa de una ciudad especificada por el usuario
- Los pósters generados se guardan automáticamente en el directorio
posters/
- Se publica bajo licencia MIT, por lo que se puede modificar y redistribuir libremente
- El repositorio cuenta con aproximadamente 2.7k estrellas y 164 forks
Funciones principales
- Genera pósters mediante una interfaz de línea de comandos (CLI), ingresando el nombre de la ciudad (
--city), el país (--country), el tema (--theme) y la distancia (--distance)
- La opción
--list-themes permite ver la lista de todos los temas disponibles
- Se puede configurar un radio adecuado según el tamaño de la ciudad con base en el valor de distancia (
distance)
- 4,000–6,000 m: ciudades pequeñas
- 8,000–12,000 m: ciudades medianas
- 15,000–20,000 m: grandes ciudades
Configuración de temas
- El directorio
themes/ incluye 17 archivos JSON de temas
- Ejemplos: noir, blueprint, neon_cyberpunk, warm_beige, forest, terracotta, etc.
- Cada tema define propiedades de color para el fondo, las calles, el agua, los parques y otros elementos
- El usuario puede agregar directamente nuevos temas en formato JSON
- Ejemplo:
"bg": "#FFFFFF", "road_primary": "#1A1A1A", etc.
Ejemplos de uso
- Es posible generar pósters con distintas combinaciones de ciudades y temas
python create_map_poster.py -c "Tokyo" -C "Japan" -t japanese_ink -d 15000
python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000
python create_map_poster.py -c "Dubai" -C "UAE" -t midnight_blue -d 15000
- Entre los pósters de ejemplo se incluyen ciudades como San Francisco, Venice, Marrakech y Singapore
Estructura interna y arquitectura
- Los componentes principales son CLI Parser, Geocoding (Nominatim), Data Fetching (OSMnx) y Rendering (matplotlib)
- El orden de renderizado (z-order) es: fondo → agua → parques → calles → degradado → texto
- Funciones principales
get_coordinates(): consulta latitud y longitud a partir del nombre de la ciudad
create_poster(): pipeline completo de renderizado
get_edge_colors_by_type(): asigna colores según el tipo de vía
get_edge_widths_by_type(): ajusta el grosor según la importancia de la vía
load_theme(): carga temas JSON
Extensión y personalización
- Para agregar nuevas capas de mapa (por ejemplo, ferrocarril), se pueden cargar datos de OSMnx y renderizarlos dentro de
create_poster()
- Si se agregan nuevas propiedades de tema, deben definirse tanto en el JSON como en el código (
load_theme())
- Reglas de posicionamiento del texto
- Nombre de la ciudad: y=0.14
- Nombre del país: y=0.10
- Coordenadas: y=0.07
- Fuente: y=0.02
Consejos de optimización de rendimiento
- Si el valor de
dist supera los 20 km, disminuye la velocidad de descarga y aumenta el uso de memoria
- El caché de coordenadas ayuda a evitar límites en las solicitudes a Nominatim
- Configurar
network_type='drive' mejora la velocidad de renderizado
- Para vistas previas rápidas, se puede bajar
dpi a 150
Stack tecnológico y licencia
- Escrito 100% en Python
- Bibliotecas principales: OSMnx, matplotlib, argparse
- Distribuido bajo MIT License, permite uso comercial y modificaciones
Resumen
- MapToPoster es un instrumento basado en código para convertir mapas urbanos en arte, un proyecto open source que combina visualización de datos y diseño
- Es una herramienta útil para que desarrolladores, diseñadores y especialistas en visualización de datos exploren la estructura urbana en una forma artística
3 comentarios
Probé hacer una versión de Seúl/Busan y quedó bastante bien, así que la adjunté en la cuenta de GeekNews en Twitter.
Seúl: https://x.com/GeekNewsHada/status/2013410000031395905
Busan: https://x.com/GeekNewsHada/status/2013412083749265695
En los comentarios de Hacker News también mencionaron
city-roads, que ya había aparecido aquí antes.Comentarios en Hacker News
es city-roads (GitHub), que soporta salida SVG y también se puede probar directamente en línea
Su creador, Anvaka, también ha hecho muchos otros geniales proyectos de visualización de datos
Aunque ajustar los parámetros de las calles es un poco complicado
Como idea de mejora, estaría bien aceptar coordenadas en lugar del nombre de la ciudad para poder centrarlo en un punto específico, y también una función para generar varios estilos a la vez y elegir visualmente
De cualquier forma, es un gran trabajo
No parece UTM sino una proyección esférica global, así que no es adecuada para renderizado local
Que no haya ninguna mención de la proyección en el README resulta un poco sospechoso
Además es open source, así que podrías aprovechar tu experiencia en cartografía y proponer una mejora mediante un pull request
Probablemente toma mosaicos de OSM y luego hace posprocesamiento de imagen
El resultado se ve bastante bien
Me da curiosidad si hay alguna razón especial para haber dejado PNG como valor predeterminado
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])Voy a agregar un parámetro
--formatpara incluirloIncluso una sola ciudad de 500 mil habitantes tarda muchísimo
El-co Color Poster Special
Aunque sí requiere bastante trabajo manual
El README podría tomarse como un ejemplo de buenas prácticas en OSS, y el resultado es sorprendentemente hermoso
Por ejemplo, Salem (OR/MA), Portland (OR/ME), Springfield (IL/MO), Dallas (TX/GA)
Si escribes algo como "Salem, Oregon" o "Salem, MA", obtienes el resultado que quieres, y el texto ingresado se usa como caption
He visto resultados parecidos en Picxstudio, que es una plataforma de generación de imágenes con IA
Así podría depender menos de las apps de navegación y manejar como antes
Hay demasiadas calles de un solo sentido, y la estructura del puerto y los túneles es muy compleja, así que aprenderse las calles de Sídney es una tarea de toda la vida