9 puntos por GN⁺ 2024-04-22 | 1 comentarios | Compartir por WhatsApp
  • tinyworldmap es un mapa mundial para apps web offline-first y de bajo ancho de banda, diseñado para usarse con Leaflet
  • Soporta todos los niveles de zoom, y la versión más completa ocupa 450 KB con gzip; el renderizado del lado del cliente fue perfilado y probado para que no tenga retrasos perceptibles incluso en teléfonos de gama baja de hace 10 años
  • El mapa base muestra las 10,000 ciudades con mayor población agregadas a OpenStreetMap, e incluye ciudades y pueblos de 48,000 habitantes o más al momento de escribir esto
  • Hay dos formas de uso: como mapa base que reemplaza los tiles de OpenStreetMap, o como mapa de fallback que, al estar offline, sustituye las solicitudes de tiles de OSM por tiles generados localmente
  • Los datos del mapa usan licencia ODBL, al igual que OpenStreetMap, y requieren atribución a OpenStreetMap y tinyworldmap, por ejemplo en el pie de Leaflet

Propósito y alcance de tinyworldmap

  • tinyworldmap es un mapa mundial para apps web offline-first y de bajo ancho de banda
  • Está diseñado para usarse con Leaflet y soporta todos los niveles de zoom
  • La versión más completa ocupa 450 KB con gzip y 1.1 MB descomprimida
  • El renderizado del lado del cliente fue perfilado y probado ampliamente en teléfonos de gama baja de hace 10 años, sin retrasos perceptibles
  • Las demos están disponibles como Nightly demo, Stable demo y v3 announcement

Datos del mapa base

  • En la configuración predeterminada, muestra las 10,000 ciudades con mayor población agregadas a OpenStreetMap
  • Al momento de escribir esto, ese rango incluye todas las ciudades y pueblos con 48,000 habitantes o más

Dos formas de usarlo en Leaflet

  • Uso como mapa base

    • Para usar tinyworldmap como mapa base en Leaflet, se agrega el script de distribución en la etiqueta head
    • El script de la versión estable es https://tinyworldmap.com/dist/v3/tiny-world-all-10000.js e incluye todos los datos necesarios para mostrar el mapa
    • En lugar de una capa de tiles de Leaflet, se agrega L.GridLayer.TinyWorld de la siguiente forma
    new L.GridLayer.TinyWorld({maxZoom: 19}).addTo(map)
    
  • Uso como mapa de fallback offline

    • En una app web offline-first, cachear mapas basados en imágenes para todos los niveles de zoom es inviable por la gran cantidad de tiles, y el tamaño total suele llegar a terabytes
    • Este repositorio ofrece un service worker para funcionalidades offline en apps web que incluyen mapas
    • Cuando se instala el service worker, el mapa de fallback se precarga
    • Las páginas visitadas se cachean
    • El mapa base queda excluido de la caché
    • Cuando se puede acceder al servidor, no se usan los datos en caché
    • Si el usuario está offline, el sitio web se sirve desde la caché y el service worker intercepta las solicitudes al servidor de tiles de OSM para reemplazarlas por tiles alternativos generados localmente con tinyworldmap
    • Antes de registrar el service worker, se deben modificar todas las secciones marcadas como IMPORTANT dentro del service worker
    • Después del registro, la atribución de la capa de tiles de Leaflet debe incluir tanto a OpenStreetMap como a tinyworldmap
    • Hitchmap es un ejemplo de app en producción que usa tinyworldmap como fallback
    • En un navegador compatible con service workers, si abres el sitio web, esperas un momento, apagas internet y recargas, la app debería funcionar correctamente con el mapa de fallback
    • La instalación del service worker puede tardar

Estilos del mapa y mapas personalizados

  • El constructor acepta la opción render para cambiar la apariencia del mapa
  • La opción style de cada capa se aplica al CanvasRenderingContext2D de Canvas
  • Por ejemplo, se puede cambiar el estilo de la capa state_borders especificando fillStyle
let render = {
    state_borders: {
        style: {fillStyle: '#f00'}
    }
}

new L.GridLayer.TinyWorld({maxZoom: 19, render}).addTo(map)
  • Si una organización necesita un mapa personalizado con rutas, ciudades, otro idioma o contenido propio que incluya datos de OSM o de otras fuentes, puede pedir una cotización escribiendo a business@tinyworldmap.com

Opciones de archivos de mapa más pequeños

  • Versión sin fronteras

    • tiny-world-cities-10000.js(on) incluye los datos de la versión completa excepto fronteras estatales, fronteras nacionales y líneas de costa
    • Esta versión reduce 300 KB con gzip y 825 KB descomprimida
    • La versión sin fronteras tiene la ventaja de que todos los datos incluidos son precisos
    • Las fronteras nacionales de la versión completa no son precisas en niveles altos de zoom, por lo que pueden verse raras al superponer polígonos que se ajustan a fronteras nacionales o líneas de costa
    • En esos casos, la versión sin fronteras suele verse mejor
  • Versión sin etiquetas de ciudades

    • Hay dos archivos sin etiquetas de ciudades
    • tiny-world-borders.js(on): omite las fronteras estatales
    • tiny-world-nocities.js(on): conserva las fronteras estatales
    • Las etiquetas de ciudades ocupan 410 KB descomprimidas y 172 KB comprimidas
  • Versión con menos ciudades

    • Los archivos con etiquetas de ciudades también están disponibles en versiones de 2,000, 4,000 ciudades
    • Basta con cambiar 10000 por 2000 o 4000 en el nombre del archivo
    • | Cantidad de ciudades incluidas | Criterio de población |
    • | --- | --- |
    • | 10,000 | Más de 48,000 habitantes |
    • | 4,000 | Más de 137,000 habitantes |
    • | 2,000 | Más de 287,000 habitantes |

Licencia y atribución

  • Los datos de tinyworldmap usan licencia ODBL, al igual que los datos de OpenStreetMap
  • ODBL exige atribución
  • Si se configuró de la forma indicada, el pie de Leaflet debería incluir la atribución de OpenStreetMap y tinyworldmap
  • De lo contrario, se debe agregar por separado la atribución de OpenStreetMap y tinyworldmap

1 comentarios

 
GN⁺ 2024-04-22
Opiniones de Hacker News
  • Me gusta la idea. Está buena porque resuelve el problema de alejar demasiado el zoom y tener que esperar a que el servidor renderice el mosaico del continente que acabas de pedir.
    Dicho eso, no termino de ver cuál sería el caso de uso en el que puedes saber la posición relativa de West Bloomfield Township y Waterford Charter Township, suburbios de Detroit, pero no en qué estado están ni siquiera si existen los Great Lakes.
    Me gustaría que usaran muchos más datos para las costas y muchos menos para la subdivisión de áreas metropolitanas.

    • La dirección es buena, pero creo que deberían incluir sí o sí los accidentes geográficos principales, algo como las 100 islas principales, los 50 lagos principales y los 200 ríos principales.
    • Lo mismo aplica para carreteras y ferrocarriles. Si es un mapa de rutas para llevar en el auto, hacen falta, pero fuera de eso rara vez necesitas saber dónde están las carreteras.
      Terminan tapando demasiada otra información posible.
    • Por curiosidad probé algunos lugares: Alexandria, en Virginia, EE. UU., aparece del otro lado del río, y Bahrain sale bastante desastroso.
    • Esa parte mejoró en v2.
  • Está genial, pero el detalle de las costas es demasiado bajo. Algunos pueblos del Reino Unido flotan sobre el mar y, en cambio, Greenland y Northern Canada se llevan todos los vértices.
    Parece que ya tuvieron en cuenta el nivel de detalle según la proyección de Mercator, pero estaría bueno bajar la prioridad de las zonas donde casi no vive gente.

    • Buen proyecto. Al elegir qué lugares incluir, si también usaran el QRank de Wikidata, podrían aparecer islas famosas aunque tengan poca población.
      La base de datos SQLite de QRank también apareció alguna vez en HN.
      [1] https://qrank.wmcloud.org/
      [2] https://github.com/hikeratlas/qrank
    • La proporción entre el detalle de ciudades y el detalle de costas está extrañamente inclinada hacia las ciudades. Parece que optaron por meter más ciudades antes que fronteras o costas precisas.
      Una provincia de Netherlands aparece separada del territorio continental del país, como si fuera una isla, cuando en realidad no lo es. Pero, dentro de esa provincia, conoce cinco nombres de ciudades, y algunas casi se superponen.
      Por otro lado, incluir Afsluitdijk me parece personalmente un detalle innecesario, aunque entiendo que es difícil distinguir por programa qué tierra dibujar y qué es simple infraestructura marítima.
      Debería abrir un ticket en el issue tracker, pero no tengo sesión iniciada desde el móvil, así que por ahora un comentario en HN es lo mejor. Si alguien siente algo parecido, puede usar este comentario como base para proponer mejoras como ajustar la proporción, introducir una distancia mínima entre ciudades o reducir el archivo completo.
    • Por esto se vuelve casi inutilizable en islas o regiones de archipiélagos. Philippines también tiene muchas islas, y varias son bastante grandes, pero no sirve como mapa.
      French Polynesia ni siquiera existe en el mapa.
    • Publiqué una versión nightly que elimina los fiordos y pone más detalle en otros lugares. En general también tiene mayor resolución.
      La razón por la que no lo hice así desde el principio fue que los teléfonos viejos, especialmente Firefox for Android, podían crashear al dibujar muchos polígonos. Después optimicé el procedimiento de dibujo, pero hay que tener cuidado.
      [1] https://tinyworldmap.com/beta.html
    • La simplificación en general es descuidada. En el Caribbean faltan países enteros.
      Eso es algo que debería detectarse con un control de calidad básico.
  • Hice algo parecido. Offline-first, muy pequeño y basado en vectores, pero con foco en la internacionalización.
    Está disponible en todos los idiomas de la ONU. Aunque Spanish se me olvidó y quedó fuera, lo cual me da vergüenza porque podría hacerlo en unas horas.
    Los nombres de países y ciudades usan las denominaciones oficiales registradas en la ONU. Por eso el nombre corto oficial de UK es “United Kingdom of Great Britain and Northern Ireland”.
    https://map.ache.one/en

    • Está bien, pero tiene bastantes bugs. “Cape town” aparece en South Sudan, pero el nombre del país ni siquiera aparece, y también falta el nombre de Eritrea. El bloque de Somalia está dividido en dos con colores distintos.
      Dibujar un mapa liviano y manejar la internacionalización fue relativamente fácil, porque existen varias fuentes de datos públicas y bibliotecas.
      La parte realmente difícil es puramente la definición administrativa. Si tienes datos conectados con la mayoría de los países, siempre habrá partes que no coincidan con la fuente del mapa, y al final tienes que hacer un mapa personalizado a mano.
      No hay consenso sobre qué es un “país”. Western Sahara es oficialmente un país, pero en la práctica Morocco lo ha ocupado de forma continua, y Somalia tiene a Somaliland y Puntland funcionando de facto como países independientes, aunque sin reconocimiento oficial. Greenland, Niue y otros están en algún punto intermedio.
    • No encontré una explicación de cómo lo hicieron, pero el mapa es hermoso. En Tiny World Maps también hay algo de información relacionada, aunque allí tampoco explican lo suficiente el método de producción.
      Por mi experiencia haciéndolo a nivel de países, fue un proceso manual con hacks bastante sucios, y lo más difícil fue probar si había quedado bien. En particular, son complicados el nivel de generalización adecuado y la apariencia que la gente espera del mapa de su propia región.
      Me pregunto si consideran que vale la pena el esfuerzo de mejorar mucho este mapa.
    • No sé si el asterisco indica la ciudad más grande o la capital, pero si es lo segundo, Tanzania está mal.
      El asterisco está en Dar Es Salaam, pero la etiqueta dice Dodoma. Dodoma es la capital real, pero está más hacia el centro del país.
    • La abreviatura “i18n” en sí no está muy internacionalizada.
  • Qué lindo. Hace tiempo hice algo no exactamente igual, pero parecido.
    https://web.archive.org/web/20020611095429/http://www.cs.man.ac.uk/~hancockd/CityZen/index.html
    Tenía 20.000 segmentos de línea, 3.350 lugares, y el visor y el quiz incluidos, todo en 162 KB.

  • Gracias por el feedback. Para explicar el contexto de la elección: hasta hace poco, el foco principal de este proyecto no eran las formas de los países.
    Durante mucho tiempo, la versión sin fronteras que estaba en el README fue la única versión, y no creía que fuera posible agregar todo el mundo. Pero sí fue posible.
    Publiqué una versión nightly que elimina los fiordos e incluye islas muy solicitadas, además de poner más detalle en otros lugares. En general, también tiene mayor resolución.
    La razón por la que originalmente no lo hice así fue que, en teléfonos antiguos, especialmente en Firefox for Android, dibujar muchos polígonos podía provocar un crash. Desde entonces optimicé el procedimiento de dibujo, pero hay que tener cuidado.
    [1] https://tinyworldmap.com/beta.html

  • No estoy seguro de que las 10.000 ciudades más pobladas sean el mejor filtro.
    Este enfoque prioriza las ciudades de países grandes, y es probable que la mayoría de las ciudades de países pequeños queden fuera.
    Debería haber un filtro complementario que incluya las X ciudades principales de cada país. Así creo que también se capturarían las ciudades importantes de países pequeños.

    • También hay otras métricas para medir la importancia de una ciudad.
      Criterios como capital nacional, capital regional, ciudad global o centralidad dentro de una región podrían servir para complementar las condiciones básicas.
      Creo que en esta discusión geógrafos y cartógrafos podrían dar consejos más útiles.
  • Me pareció interesante que, al elegir los 10.000 asentamientos más grandes del mundo, se baje hasta 48.000 habitantes.
    Todavía estoy evaluando si esa cifra es sorprendente o no.

    • Desde hace mucho sabía que, si se miran aproximadamente las 100 ciudades principales de EE. UU. ordenadas por población, se baja hasta alrededor de 200.000 habitantes.
      Incluso ampliando a 200, siguen siendo más de 100.000. Según Wikipedia, Daly City, CA, en el puesto #333, tiene 100.007 habitantes: <https://en.wikipedia.org/wiki/List_of_United_States_cities_b...>
      Este tipo de distribución de tamaños, como en muchas otras situaciones de escalamiento, suele ser casi lineal en un gráfico log-log.
      En China hay que llegar hasta el puesto 106 antes de que aparezca una ciudad con menos de 1 millón de habitantes. En EE. UU. solo hay 9 ciudades así.
      Acabo de revisar India: tiene 46 ciudades con más de 1 millón de habitantes; Malegaon, en el puesto 100, tiene 471.000, y Aurangabad, en el puesto 300, todavía supera los 100.000.
      Dicho eso, “ciudad” es una definición muy arbitraria. Algunas de las ciudades más grandes del mundo, según los criterios de otros países, podrían equivaler a áreas metropolitanas, o incluso a estados o provincias.
      Las ciudades más grandes por superficie, en cambio, tienen poblaciones muy pequeñas. Sermersooq, en Greenland, tiene 24.148 habitantes y una superficie de 575.300 km², unas 144 veces Rhode Island; entre los estados de EE. UU., solo Texas y Alaska son más grandes. Alaska es apenas alrededor de un 12% más grande.
      La geografía urbana es un campo complejo, por lo que normalmente se comparan en conjunto varias escalas y definiciones, como áreas estadísticas metropolitanas, superficie urbana y población. Eso ayuda a mitigar la arbitrariedad de las fronteras políticas y a reflejar mejor la población total y el impacto económico.
  • Es bastante sorprendente que el tamaño del archivo sea ese, aun con fronteras tan toscas.
    Parece que el tamaño total de los datos está muy por debajo del punto de equilibrio entre utilidad y tamaño de archivo. Por ejemplo, incluso con el doble de tamaño, las fronteras no se verían tan irregulares.

    • El archivo completo pesa unos 700 KB sin compresión gzip.
      Por la explicación de que “incluye todos los datos de la versión completa excepto fronteras y costas, lo que reduce el tamaño en 200 KB”, se ve que alrededor del 29% corresponde a datos de fronteras y costas, y el 71% a nombres y ubicaciones de ciudades.
      Personalmente, creo que podrían eliminarse muchas ciudades. Especialmente las que se superponen entre sí solo son visibles al hacer suficiente zoom como para ver la masa de tierra gris y los nombres de las ciudades; en su lugar, sería mejor hacer más precisas las líneas de costa.
      Tampoco estoy seguro de con qué frecuencia se necesita una ubicación en un mapa mundial general. Por ejemplo, en el sitio web de un punto de interés que estoy mirando, ¿no haría falta más a menudo un mapa liviano con las autopistas cercanas y las líneas de transporte público para llegar allí?
      Si se hiciera una versión que dividiera todo el planeta en unidades de unos pocos km², creo que podría incluir detalles bastante útiles incluso con una décima parte del tamaño. Un mapa mundial de pocos polígonos también tendría usos, como el seguimiento de la Estación Espacial Internacional, pero parecen mucho menos frecuentes.
  • Aunque tengan menos de 40.000 habitantes, las capitales deben incluirse sí o sí, y de alguna forma deberían marcarse con una estrella.

  • Realmente genial. Impresiona lo rápido que carga en el teléfono.
    La idea de comprimir los datos espaciales como Paths es muy buena.
    Para evitar la licencia ODbL, también sería buena idea usar datos de Natural Earth en vez de OSM.
    Sería excelente incluir también una herramienta para convertir datos espaciales a Paths.