Avanzar en el tiempo a mayo 2016.
No hay mapas buenos de papel para la región donde vivo. Hay mapas de calles en escala 1:20,000 para automovilistas dentro de la ciudad, pero no tienen absolutamente nada de detalle en las áreas rurales. Hay mapas 1:200,000 para viajes largos en coche, pero esa escala es demasiado grande para explorar en bici.
Me gustaría que hubiera mapas impresos, de alta calidad, a escala 1:50,000 (es decir, 1 Km en el mundo real son 2 cm en el mapa), con un nivel de detalle suficiente y algunas cosillas:
Curvas de nivel. Xalapa está en medio de la montaña, entonces es útil poder planear los trayectos con respecto a las subidas/bajadas demasiado empinadas.
¿Dónde puedo reabastecerme de agua y comida? Tienditas de la esquina, puestos de comida en la calle.
¿Qué calidad tienen los caminos, y están pavimentados? Mi región está repleta de veredas y caminos rurales que pasan entre cañaverales y cafetales. Es posible ir en bici por los caminos más transitados con llantas "normales" para pavimento. Otros caminos más accidentados requieren llantas más anchas, o más destreza, o una bici de montaña, pues tienen piedras y raíces y pequeños obstáculos del tamaño de una manzana.
¿Hay sitios interesantes o vistas bonitas? Es bueno tener un "premio" visual cuando llegas a tu destino, independientemente del maravilloso paisaje montañoso que hay en el trayecto. ¿Algún mirador interesante? ¿Ruinas fotogénicas? ¿Cascadas?
Tantos puntos de referencia como sea posible. Las veredas rurales tienden a verse todas iguales — cafetos, plátanos, caña, caminos de tierra. ¿Hay un árbol especialmente grande junto al cruce de dos veredas, para que sepas dónde dar vuelta? ¿Hay algún altar o cruz, de esos que te encuentras por todos lados? ¿Hay cables de alta tensión sobre el camino, para usarlos como referencia?
Llevo un par de años haciendo un mapa de los caminos rurales por aquí en OpenStreetMap. Es un proceso interesante.
Por ejemplo, esta es la foto de satélite que sale en iD, el editor de OpenStreetMap en el web:
Se pueden distinguir caminitos rurales entre los plantíos (aquí, entre el río azul y la carretera amarilla). A veces son difíciles de ver entre los árboles, y a veces desaparecen por completo entre la vegetación. Cuando los caminos no se ven o no son 100% inambiguos en la foto de satélite, no queda qué hacer mucho más que irse en la bici a recorrerlos, mientras se guarda una ruta con el GPS del teléfono.
Estos son dos caminos rurales típicos de aquí:
Ya de vuelta en casa, puedo cargar la ruta del GPS en el editor de OpenStreetMap, trazar los caminos y añadir algunos detalles por inferencia (el camino cruza un río, por lo tanto debe haber un puente) o de memoria (¡ah, me acuerdo de ese puentecito de piedra!). He aquí un puente en un camino sin pavimentar:
También es posible imprimir un mapa rápidamente, por ejemplo, con Field Papers, hacerle anotaciones mientras uno va en bici, y posteriormente añadir los datos al mapa cuando uno ya está en la computadora.
Bien, eso es todo sobre crear datos para el mapa. La visualización (o renderización de imágenes para imprimir) es otro tema.
Hay varios renderizadores de mapas que funcionan con los datos de OpenStreetMap:
OpenTopoMap. Tiene curvas de nivel. ¡Es de alto contraste! Los caminos pavimentados son de color claro con contorno negro, como en un mapa impreso tradicional; los caminos rurales sin pavimentar están en negro. Los ríos tienen contorno azul oscuro. Los ríos también tienen unas flechas pequeñitas que indican la dirección de la corriente (eso es cuesta abajo, y es de interés para los ciclistas) — fíjate en la flechita azul donde el río se divide en dos. El mapa muestra varias cosas de interés para excursionistas o ciclistas: vallas, cercas, miradores, cruces religiosas en el camino, altares, albergues. Las áreas boscosas, granjas y plantíos tienen un sombreado especial. El mapa no muestra tienditas ni dónde conseguir comida.
GPSies con la capa Sigma Cycle. Tiene curvas de nivel. Dice la dificultad para bici de montaña de cada vereda, lo cual es lindo y útil. No salen las tienditas a menos que uno le ponga un acercamiento muy profundo. Es un mapa con bajo contraste visual, para una pantalla de computadora, pero no sirve para imprimirse, pues sale un mugrero sin nitidez.
Cycle.Travel. El mapa es muy lindo en pantalla, no sirve para imprimirse, pero el ruteo para bicis es fabuloso. El motor de ruteo le da preferencia a los caminos pequeños y tranquilos, en vez de irse por las carreteras grandes. También busca las rutas donde las pendientes no son ridículas. Te da perfiles de elevación de las rutas... si estás en el primer mundo. Esa parte no funciona en México. Ojalá que esto cambie — hay datos de elevación para todo el mundo, pero hay que hacer ciertos cálculos de dimensiones épicas antes de que el ruteo funcione para un continente entero (mira el final de ese blog).
Lo hago todo el tiempo, y es bastante tedioso:
*Adoro* traer mapas en el teléfono, y uso varias aplicaciones que pueden guardar mapas para consultarlos sin conexión a internet.
City Maps 2 Go es bueno. Lo han hecho más complicado con las últimas versiones. Los mapas de México no se actualizan muy frecuentemente, lo cual es frustrante pues yo le meto datos nuevos al mapa todo el tiempo y no puedo verlos en esa aplicación. Como ventaja, usa mapas vectoriales.
MotionX GPS es excelente. Hace todo lo que puede para grabar una ruta con el GPS sin detenerse, a diferencia de *ejem* Strava, que deja de grabar a medio camino sin avisar. Te deja grabar mapas para usarlos sin conexión. Sólo puede bajar mapas de pixeles renderizados por OpenStreetMap y por OpenCycleMap — el primero es nominalmente bueno; el segundo ya se ve bastante viejo, aunque sigue siendo útil.
Maps.Me está muy lindo. Tiene mapas vectoriales sin conexión. Los mapas se actualizan frecuentemente. Tiene ruteo.
Go Map!! es un editor completo para OpenStreetMap. Más o menos puede guardar mapas para usarlos sin conexión. Lo uso todo el tiempo para añadir detalles pequeños al mapa durante los trayectos en bici. Esta aplicación es excelente.
Estas aplicaciones sirven bien para viajes de unas cuantas horas (i.e. mientras dure la batería), pero no me funcionan para trayectos de un día entero. He comenzado a cargar con una batería externa, pero es engorroso y pesado.
Entonces, quiero un mapa impreso. Desde tiempos ancestrales existen los fierros necesarios para sostener un mapa impreso al manubrio de la bici, o incluso una bolsa de manubrio con ventanita para un mapa.
Lo más fácil sería descargar un área del mapa de OpenTopoMap, en un nivel de zoom que sea útil, e imprimirla. Esto funciona en una urgencia, pero tiene varios problemas.
Los mapas renderizados de OpenStreetMap casi siempre están diseñados para verlos en el web, o en una pantalla relativamente de alta resolución de un teléfono móvil. Ambos casos están lejos de tener el tamaño y la resolución de un buen mapa impreso. Una laptop o compu de escritorio tiene una pantalla de buen tamaño, pero es de baja resolución: incluso un monitor de 21" a 4K sólo tiene un poco más de 200 puntos por pulgada. Un teléfono tiene una pantalla más densa, de unos 300 a 400 PPP, pero es una pantalla diminuta... a comparación de un lindo mapa impreso — de unos 50x50 cm a 1200 PPP.
... y un mapa impreso se puede doblar al tamaño de un tabletófono, y aun así es de mayor resolución y más ligero y no come baterías y carajo, soy un retrógrada recalcitrante, ¿o no?
Además, los mapas para el web se pueden cambiar de zoom, mientras que los mapas impresos tienen una escala fija. 1:50,000 funciona bien para unas cuantas horas de ciclismo — en la región montañosa donde vivo, me es demasiado cansado ir mucho más lejos que lo que cabe en un mapa así.
Entonces, mi cadena de pensamientos iba algo así como:
¿De qué tamaño es la hoja de papel para mi mapa? Depende de la impresora.
¿Qué resolución impresa va a tener? Depende de la impresora.
¿Qué escala quiero para el mapa? 1:50,000
¿Qué nivel de detalle quiero? Con un valor de zoom=15 hay buen detalle, y a z=16 las cosas se ven todavía mejor. Sin embargo, no es sino hasta z=17 que se empiezan a ver cosas muy pequeñas como tienditas y puestos de comida... a menos en los renderizadores "normales" de OpenStreetMap.
Los mapas en el web son curiosos. Normalmente, OpenStreetMap se renderiza con mosaicos cuadrados; cada mosaico es de 256x256 pixeles. Con zoom=0, el mundo entero cabe en un solo mosaico.
El URL para esa imagen renderizada es http://opentopomap.org/0/0/0.png.
Si nos acercamos un paso, a zoom=1, ese super-mosaico se divide en 2x2 sub-mosaicos. Fíjate en los URLs, que terminan en zoom/x/y.png:
|
|
|
|
Vamos a acercarnos un nivel más, a zoom=2, y fijémonos sólo en los cuatro sub-sub-mosaicos que corresponden al mosaico de la esquina superior izquierda del ejemplo de arriba (la parte con Norteamérica y Centroamérica):
|
|
|
|
Entonces, más o menos, la pregunta es: ¿qué nivel de zoom quiero, según el nivel de detalle que quiero en un mapa de cierta escala, tomando en cuenta la resolución de la impresora que voy a usar?
Como referencia:
Después de jugar un poco con los números, llegué a una fórmula relacionada. ¿Qué escala del mapa voy a obtener, dada una resolución impresa y un nivel de zoom?
(defun get-map-scale (dpi tile-size zoom latitude) (let* ((circumference-at-equator 40075016.686) (meridian-length (* circumference-at-equator (cos (degrees-to-radians latitude)))) (tiles-around-the-earth (exp (* (log 2) zoom))) (pixels-around-the-earth (* tiles-around-the-earth tile-size)) (meters-per-pixel (/ meridian-length pixels-around-the-earth)) (meters-in-inch-of-pixels (* meters-per-pixel dpi)) (meters-in-cm-of-pixels (/ meters-in-inch-of-pixels 2.54))) (* meters-in-cm-of-pixels 100))) (get-map-scale 600 ; dpi 256 ; tile-size 16 ; zoom 19.533) ; latitude of my town 53177.66240054532 ; pretty close to 1:50,000
Bien: zoom=16 tiene un nivel de detalle útil, y me da una escala en el mapa impreso muy cercana a 1:50,000. Seguramente puedo tomar las imágenes renderizadas y hacerlas un poco más pequeñas para llegar a la escala que quiero (de 53177 a 50000).
¿Por qué hay un parámetro tile-size (tamaño de mosaico) en pixeles? ¿Qué no son siempre de 256x256? Continuemos.
Un contorno de 1 pixel ("la línea más delgadita") se ve bien en una pantalla, pero en una impresión a 600 PPP ó 1200 PPP es muy difícil de distinguir, especialmente si está sobre un fondo de curvas de nivel, sombreados de plantíos y otras basuritas cartográficas.
Un ícono de 16x16 pixeles que muestra en pantalla la ubicación de una tiendita, o un mirador, se ve muy bien. Pero al imprimirse a altas resoluciones, no es más que una pequeña mancha.
Y la tipografía... un texto de 10 pixeles de alto tal vez es legible incluso en un teléfono, pero definitivamente no lo es en papel.
Si nada más tomo una imagen de OpenTopoMap y la imprimo, me quedan textos muy pequeñitos, líneas y contornos que son muy delgados, y marcadores e íconos que son casi invisibles. Necesito algo que me permita ajustar el grosor de las líneas, el tamaño de íconos y marcadores, el tamaño y posición de las etiquetas textuales — de modo que al imprimirse todo, me dé un mapa legible.
Mira estos mapas y haz un acercamiento. Están diseñados para imprimirse: tienen mucho detalle, pero en una pantalla el texto se ve demasiado grande. Al imprimirse, se verían muy lindos.
De forma predeterminada, openstreetmap.org usa Mapnik como renderizador, que a su vez usa una cadena de herramientas para producir hojas de estilos que determinan cómo se renderiza el mapa. Las hojas de estilos dicen cosas como, "una carretera nacional se pinta con líneas en rojo, de 20 pixeles de ancho, con un contorno negro de 4 pixeles, y con marcadores de número de referencia de carreteras a cada X pixeles de separación, con este ícono", o "los panteones se pintan como polígonos rellenos con crucecitas a 40% de opacidad". Para un mapa al que se le puede hacer zoom, hay que repetir todo este proceso para cada nivel de zoom (pues los grosores y tamaños cambian, y nada más escalar todo de forma lineal se ve terrible). Es un dolor en el trasero definir una hoja de estilos así — o más bien, es trabajo muy meticuloso que hay que hacer en un lenguaje esotérico.
Últimamente ha habido una explosión de renderizadores de mapas que funcionan con datos de OpenStreetMap. He estado usando Mapbox Studio, que tiene la gran ventaja de no requerir que escribas una hoja de estilos en un lenguaje extraño. Studio es una aplicacioń de web que te permite definir capas para el mapa y un estilo para cada capa: "la capa de calles viene de los caminos residenciales; píntalos como líneas blancas con contorno negro". Te permite usar valores especiales para cada nivel de zoom, y esto se configura con una interfase de usuario muy interesante... que sería mucho mejor sin los problemas de foco de mouse/teclado que tienen los navegadores de web.
He estado aprendiendo cómo usar este mamotreto — al principio sí que parece la cabina de un avión. Se me facilitaron las cosas una vez que entendí lo siguiente:
La base de datos principal de OpenStreetMap es una bolsa enorme llena de puntos, líneas y "relaciones". Cada uno de esos objetos puede tener varias parejas llave/valor. Por ejemplo, un punto puede tener "shop=bakery" y "name=Panecitos y Panezotes", mientras que una calle puede tener "highway=residential" y "name=Calle del Carbohidrato".
Varias herramientas muy, eh, interesantes se usan para rebanar esos datos y ponerlos en mosaicos vectoriales (vector tiles). Un mosaico vectorial es nada más un cuadrado que contiene capas con instrucciones de dibujo. Por ejemplo, una capa de "calles" puede contener varios "moverse-a línea-a línea-a linea-a". Sin embargo, los mosaicos no tran información de estilos. Vienen con la posición de las cosas, pero no con los colores o grosores.
Hay muchos proveedores de mosaicos vectoriales y renderizadores. Mapzen provee mosaicos vectoriales y un renderizador con OpenGL muy interesante. Mapbox provee mosaicos vectoriales y un montón de bibliotecas para usarlos en plataformas móviles. Cada proveedor de mosaicos vectoriales decide qué cosas del mapa poner en qué capas.
Las capas tienen dos propósitos: estilos y orden-z. Los estilos son lo que te imaginas: la capa para calles residenciales se pinta como líneas de cierto grosor/color/contorno. El orden-z más o menos depende del propósito del mapa. Hay un fondo de colores sólidos, que se determinan a partir del terreno (desierto=amarillo, bosque=verde, agua=azul). Encima de eso se pintan las curvas de nivel. Encima de eso están las calles. Encima de eso, los puntos de interés.
En términos de estilos, hay algunos truquitos que se usan para obtener varios tipos de apariencia. Por ejemplo, cada tipo de camino (carretera nacional, carretera secundaria, calle residencial) tiene dos capas: una para el contorno y otra para el relleno de las líneas. Esto es para evitarse hacer cálculos complicados en las intersecciones: para tener líneas rojas con un contorno negro, se usa una capa de líneas negras gruesas, y encima otra capa con líneas rojas delgadas, ambas a partir de los mismos datos.
Un juego de mosaicos vectoriales puede no tener toda la información que está en la base de datos principal de OpenStreetMap. Por ejemplo, Mapbox crea y distribuye unos mosaicos que se llaman mapbox-streets-v7 (introducción, referencia). Viene con calles, edificios, puntos de interés como tiendas, vallas, etc. No viene con algunas cosas que me interesan para el mapa ciclista, como líneas de cables y torres de alta tensión (son buena referencia al ir por el camino), altares, y las áreas industriales.
En teoría puedo crear un juego de mosaicos con la información que falta, pero no quiero perder el tiempo con una cadena de herramientas misteriosas. En vez de eso, Mapbox te permite añadir capas personalizadas; en particular, tienen un tutorial de cómo extraer objetos específicos del mapa con la herramienta Overpass Turbo y luego añadir eso a tu mapa como una capa nueva. Por ejemplo, con Overpass Turbo puedo hacer una búsqueda de "encuéntrame todas las líneas de alta tensión en esta región", exportarla como datos GeoJSON, subir el archivo a Mapbox Studio y crear una capa con un estilo especial para los cables y torres de electricidad. Es trabajo más o menos manual, pero tal vez se puede automatizar con la magia de los Makefiles y el API de Mapbox.
Antes de que se me olvide: Mapbox usa mosaicos de 512 pixeles. No sé por qué son así, tal vez para reducir el número de peticiones HTTP. De cualquier forma, ésta es la razón por la que mi pedacito de código de ahí arriba tiene un parámetro tile-size.
Esto es un trabajo todavía incompleto. Cosas que faltan:
Un estilo que sirva para imprimirse. He estado ajustando los colores y estilos de línea para que el mapa tenga contraste alto y que sea legible. Todavía no investigo qué grosores son adecuados, ni los tamaños del texto, para la impresión.
Añadir los datos que me interesan pero que no están en mapbox-streets-v7: altares, cables y torres de alta tensión, áreas industriales, límites municipales, granjas, portones, ruinas, cascadas... afortunadamente, todo esto está disponible en la base de datos principal de OpenStreetMap.
Añadir estilos para cosas que sí están en los mosaicos vectoriales, pero que no tienen un estilo lo suficientemente visible por defecto. Los plantíos podrían tener un sombreado con iconitos de caña o café; las canchas deportivas podrían tener dibujos de fútbol o béisbol.
Averiguar cómo hacer sombreados con patrones que se repiten para líneas. Quiero que los desfiladeros se vean más o menos así (una línea con triangulitos), pero no sé cómo hacerlo en Mapbox. Quiero que los ríos tengan flechas que indiquen la dirección de la corriente.
Hacer un recorrido en bici más o menos exhaustivo de todos los caminos rurales, en el área en que voy a generar el mapa, para asegurarme que no falten objetos importantes. Eso debe ser la parte divertida, ¿no?
El diseño del estilo Mapbox Outdoors. Para mi propio mapa, empecé con este estilo como base y luego lo fui ajustando para darle más contraste y colores mejores para la impresión.
Discusión técnica de cómo generar un mapa urbano para imprimir — un poco viejo; usa TileMill y CartoCSS (los antecesores de Mapbox Studio). Describe cómo lidiar con mapas SVG, carteles grandes, páginas de índices de calles.
Un mapa alemán antiguo muy ingenioso, que consigue hacer caber un perfil de elevación para cada camino (!).
La escala de mapas perdida discute que 1:100,000 es la mejor para ciclimo de larga distancia y de varios días, para evitarse cargar con muchos mapitas plegados. Excelente mapa-porn (mira el mapa de Snowdonia (País de Gales) — ¡desfiladeros dibujados a mano!). Yo no soy más que un aficionado que anda en bici por medio día, entonces por ahora los mapas 1:50,000 me son suficientes.
Cómo hacer un mapa para bicis se enfoca en los mapas para la ciudad, y en indicar si ciertas calles son seguras o no para la gente que se mueve en bici.
Cómo renderizar el Mundo — cómo es que los mosaicos permiten renderizar pedacitos del planeta según se necesite.
Introducción a Tilemaker: mosaicos vectoriales sin infraestructura. En vez de manejar una montaña de mierda con Postgres y demás infraestructura, esta es una utilería de línea de comandos (... con un archivo de configuración escrito a mano) para rebanar datos de OpenStreetMap en capas que uno mismo define.
Retroceder en el tiempo a octubre 2015.
Federico Mena-Quintero <federico@gnome.org> jue 2016/abr/21 07:43:27 CDT