9 Punkte von GN⁺ 2024-04-22 | 1 Kommentare | Auf WhatsApp teilen
  • tinyworldmap ist eine Weltkarte für Offline-first- und Low-Bandwidth-Web-Apps und ist für die Nutzung mit Leaflet konzipiert
  • Sie unterstützt alle Zoomstufen; die vollständigste Version ist 450 KB gzip groß. Clientseitiges Rendering wurde auf zehn Jahre alten Low-End-Smartphones profiliert und getestet, ohne spürbare Verzögerung
  • Die Standardkarte zeigt die 10.000 bevölkerungsreichsten Städte, die in OpenStreetMap hinzugefügt wurden; zum Zeitpunkt der Erstellung umfasst dies Städte und Orte ab 48.000 Einwohnern
  • Es gibt zwei Nutzungsweisen: als Basemap, die OpenStreetMap-Tiles ersetzt, oder als Fallback-Karte, die im Offline-Zustand OSM-Tile-Anfragen durch lokal erzeugte Tiles ersetzt
  • Die Kartendaten stehen wie OpenStreetMap unter der ODBL-Lizenz; eine Namensnennung von OpenStreetMap und tinyworldmap ist etwa im Leaflet-Footer erforderlich

Zweck und Umfang von tinyworldmap

  • tinyworldmap ist eine Weltkarte für Offline-first- und Low-Bandwidth-Web-Apps
  • Sie ist für die Nutzung mit Leaflet konzipiert und unterstützt alle Zoomstufen
  • Die vollständigste Version ist 450 KB gzip groß, entpackt 1,1 MB
  • Das clientseitige Rendering wurde auf zehn Jahre alten Low-End-Smartphones umfangreich profiliert und getestet; es gab keine spürbare Verzögerung
  • Demos gibt es als Nightly demo, Stable demo und v3 announcement

Standard-Kartendaten

  • In der Standardeinstellung werden die 10.000 bevölkerungsreichsten Städte angezeigt, die in OpenStreetMap hinzugefügt wurden
  • Zum Zeitpunkt der Erstellung umfasst dieser Bereich alle Städte und Orte mit 48.000 oder mehr Einwohnern

Zwei Nutzungsarten in Leaflet

  • Nutzung als Basemap

    • Um tinyworldmap als Leaflet-Basemap zu verwenden, fügt man das Distributionsskript in das head-Tag ein
    • Das Skript der stabilen Version ist https://tinyworldmap.com/dist/v3/tiny-world-all-10000.js und enthält alle Daten zur Kartenanzeige
    • Statt eines Leaflet-Tile-Layers fügt man L.GridLayer.TinyWorld in folgender Form hinzu
    new L.GridLayer.TinyWorld({maxZoom: 19}).addTo(map)
    
  • Nutzung als Offline-Fallback-Karte

    • In Offline-first-Web-Apps ist es wegen der großen Zahl an Tiles nicht praktikabel, bildbasierte Karten für alle Zoomstufen zu cachen; die Gesamtgröße liegt oft im Terabyte-Bereich
    • Dieses Repository stellt einen Service Worker für Offline-Funktionen von Web-Apps mit Karten bereit
    • Wenn der Service Worker installiert ist, wird die Fallback-Karte vorgeladen
    • Besuchte Seiten werden gecacht
    • Die Basemap wird vom Cache ausgeschlossen
    • Wenn der Server erreichbar ist, werden keine Cache-Daten verwendet
    • Ist der Nutzer offline, wird die Website aus dem Cache bereitgestellt, und der Service Worker fängt Anfragen an OSM-Tile-Server ab und ersetzt sie durch lokal mit tinyworldmap erzeugte Ersatz-Tiles
    • Vor der Registrierung des Service Workers müssen alle im Service Worker mit IMPORTANT markierten Abschnitte angepasst werden
    • Nach der Registrierung muss die Attribution des Leaflet-Tile-Layers sowohl OpenStreetMap als auch tinyworldmap enthalten
    • Hitchmap ist ein Beispiel für eine Produktions-App, die tinyworldmap als Fallback nutzt
    • Öffnet man die Website in einem Browser mit Service-Worker-Unterstützung, wartet kurz, schaltet dann das Internet ab und lädt neu, sollte die App mit der Fallback-Karte normal funktionieren
    • Die Installation des Service Workers kann einige Zeit dauern

Kartenstil und angepasste Karten

  • Der Konstruktor akzeptiert die Option render, mit der sich das Aussehen der Karte ändern lässt
  • Die Option style jeder Ebene wird auf Canvas’ CanvasRenderingContext2D angewendet
  • Beispielsweise kann man dem Layer state_borders ein fillStyle zuweisen, um den Stil zu ändern
let render = {
    state_borders: {
        style: {fillStyle: '#f00'}
    }
}

new L.GridLayer.TinyWorld({maxZoom: 19, render}).addTo(map)
  • Wenn eine Organisation eine Straßenkarte, Stadtkarte, Karte in einer anderen Sprache oder eine Karte mit maßgeschneiderten Inhalten einschließlich OSM- oder Nicht-OSM-Daten benötigt, kann sie unter business@tinyworldmap.com ein Angebot anfragen

Optionen für kleinere Kartendateien

  • Version ohne Grenzen

    • tiny-world-cities-10000.js(on) enthält die Daten der vollständigen Version ohne Bundesstaatsgrenzen, Ländergrenzen und Küstenlinien
    • Diese Version spart 300 KB gzip bzw. 825 KB entpackt
    • Der Vorteil der Version ohne Grenzen ist, dass alle enthaltenen Daten präzise sind
    • Die Ländergrenzen der vollständigen Version sind bei hohen Zoomstufen nicht genau, sodass Overlays mit Formen, die an Ländergrenzen oder Küstenlinien ausgerichtet sind, unpassend wirken können
    • In solchen Fällen sieht die Version ohne Grenzen oft besser aus
  • Version ohne Stadtlabels

    • Es gibt zwei Dateien ohne Stadtlabels
    • tiny-world-borders.js(on): lässt Bundesstaatsgrenzen weg
    • tiny-world-nocities.js(on): behält Bundesstaatsgrenzen bei
    • Stadtlabels belegen entpackt 410 KB und komprimiert 172 KB
  • Version mit weniger Städten

    • Dateien mit Stadtlabels sind auch in Versionen mit 2.000 und 4.000 Städten verfügbar
    • Dazu ersetzt man im Dateinamen 10000 durch 2000 oder 4000
    • | Anzahl enthaltener Städte | Bevölkerungsgrenze |
    • | --- | --- |
    • | 10.000 | über 48.000 Einwohner |
    • | 4.000 | über 137.000 Einwohner |
    • | 2.000 | über 287.000 Einwohner |

Lizenz und Attribution

  • Die Daten von tinyworldmap stehen wie OpenStreetMap-Daten unter der ODBL-Lizenz
  • ODBL verlangt Attribution
  • Wenn die Einrichtung wie beschrieben erfolgt ist, sollte der Leaflet-Footer die Attribution für OpenStreetMap und tinyworldmap enthalten
  • Andernfalls muss die Attribution für OpenStreetMap und tinyworldmap separat hinzugefügt werden

1 Kommentare

 
GN⁺ 2024-04-22
Meinungen auf Hacker News
  • Mir gefällt die Idee. Sie löst das Problem, dass man sehr weit herauszoomt und dann warten muss, bis der Server die gerade angeforderten Kontinent-Kacheln rendert.
    Allerdings verstehe ich nicht ganz, welcher Use Case es ist, bei dem man die relative Lage von West Bloomfield Township und Waterford Charter Township, Vororten von Detroit, erkennen kann, aber nicht weiß, in welchem Bundesstaat sie liegen oder dass die Great Lakes existieren.
    Ich fände es besser, deutlich mehr Daten für Küstenlinien zu verwenden und deutlich weniger für die Unterteilung von Metropolregionen.

    • Die Richtung stimmt, aber wichtige geografische Elemente wie die 100 größten Inseln, 50 größten Seen und 200 größten Flüsse sollten meiner Meinung nach unbedingt enthalten sein.
    • Gleiches gilt für Straßen und Eisenbahnen. Für eine Straßenkarte im Auto braucht man sie, aber sonst muss man selten wissen, wo Straßen verlaufen.
      Sie verdecken zu viele andere mögliche Informationen.
    • Aus Neugier habe ich ein paar Stellen angeklickt: Alexandria in Virginia, USA, liegt auf der anderen Flussseite, und Bahrain sieht ziemlich katastrophal aus.
    • Dieser Teil wurde in v2 verbessert.
  • Schön, aber die Küstendetails sind viel zu gering. Einige Orte im Vereinigten Königreich schweben im Meer, während Greenland und Northern Canada umgekehrt alle Eckpunkte abbekommen.
    Der Detailgrad entsprechend der Mercator-Projektion scheint bereits berücksichtigt zu sein, aber es wäre gut, Regionen mit kaum Bevölkerung niedriger zu priorisieren.

    • Gutes Projekt. Wenn bei der Auswahl der aufzunehmenden Orte auch QRank von Wikidata verwendet würde, könnten auch berühmte Inseln mit geringer Bevölkerung auftauchen.
      Die SQLite-DB von QRank war früher auch schon einmal auf HN.
      [1] https://qrank.wmcloud.org/
      [2] https://github.com/hikeratlas/qrank
    • Das Verhältnis zwischen Stadtdetails und Küstendetails ist seltsam stark zugunsten der Städte verschoben. Es wirkt so, als würden eher mehr Städte aufgenommen als präzise Grenzen oder Küstenlinien.
      Eine Provinz der Netherlands wird vom Festland des Landes abgetrennt und wie eine Insel dargestellt, obwohl das tatsächlich nicht so ist. Gleichzeitig kennt die Karte in dieser Provinz fünf Städtenamen, von denen einige fast überlappen.
      Andererseits erscheint mir die Aufnahme des Afsluitdijk persönlich als unnötiges Detail, aber ich verstehe, dass es programmgesteuert schwer ist, zwischen Land, das gezeichnet werden soll, und einfacher maritimer Infrastruktur zu unterscheiden.
      Eigentlich müsste ich im Issue-Tracker ein Ticket eröffnen, aber da ich auf dem Handy nicht eingeloggt bin, ist ein HN-Kommentar im Moment das Beste. Wenn jemand ähnlich empfindet, kann er gern auf Grundlage dieses Kommentars Verbesserungen vorschlagen, etwa eine Anpassung des Verhältnisses, einen Mindestabstand zwischen Städten oder eine Verkleinerung der Gesamtdatei.
    • Dadurch wird die Karte auf Inseln oder in Archipelregionen fast unbrauchbar. Die Philippines haben zwar viele Inseln, aber darunter sind mehrere ziemlich große; als Karte ist das trotzdem kaum brauchbar.
      French Polynesia existiert auf der Karte nicht einmal.
    • Es wurde eine Nightly-Version veröffentlicht, die Fjorde entfernt und an anderen Stellen mehr Details einfügt. Insgesamt ist auch die Auflösung höher.
      Der ursprüngliche Grund, es nicht so zu machen, war, dass ältere Smartphones, insbesondere Firefox for Android, beim Zeichnen vieler Polygone abstürzen konnten. Seitdem wurde der Zeichenprozess optimiert, aber Vorsicht ist weiterhin nötig.
      [1] https://tinyworldmap.com/beta.html
    • Die Vereinfachung ist insgesamt schlampig. In der Caribbean fehlen ganze Länder.
      Das ist etwas, das bei grundlegender Qualitätskontrolle auffallen müsste.
  • Ich habe etwas Ähnliches gebaut. Offline-first, sehr klein und vektorbasiert, mit Schwerpunkt auf Internationalisierung.
    Es ist in allen UN-Sprachen verfügbar. Spanish habe ich allerdings einfach vergessen und ausgelassen; es ließe sich in ein paar Stunden erstellen, was mir peinlich ist.
    Für Länder- und Städtenamen werden die bei der UN registrierten offiziellen Bezeichnungen verwendet. Deshalb lautet der offizielle Kurzname des UK „United Kingdom of Great Britain and Northern Ireland“.
    https://map.ache.one/en

    • Nicht schlecht, aber es gibt ziemlich viele Bugs. „Cape town“ wird in South Sudan angezeigt, während der Landesname selbst fehlt, und auch bei Eritrea fehlt der Name. Der Somalia-Block ist in zwei verschiedenfarbige Teile geteilt.
      Eine leichte Karte zu zeichnen und Internationalisierung zu handhaben war vergleichsweise einfach, weil es mehrere offene Datenquellen und Libraries dafür gibt.
      Der wirklich schwierige Teil sind rein administrative Definitionen. Wenn man Daten hat, die mit den meisten Ländern verknüpft sind, gibt es zwangsläufig Abweichungen zur Kartenquelle, und am Ende muss man eine eigene angepasste Karte erstellen.
      Es gibt keinen Konsens darüber, was ein „Land“ ist. Western Sahara ist offiziell ein Land, wird faktisch aber weiterhin von Morocco besetzt; Somalia hat mit Somaliland und Puntland Gebiete, die faktisch wie unabhängige Staaten agieren, aber nicht offiziell anerkannt sind. Greenland, Niue und andere liegen irgendwo dazwischen.
    • Ich konnte keine Erklärung finden, wie es gebaut wurde, aber die Karte ist schön. Auch bei Tiny World Maps gibt es dazu etwas, aber auch dort reicht die Beschreibung der Erstellung nicht aus.
      Aus eigener Erfahrung auf Länderebene war es ein manueller Prozess mit schmutzigen Hacks, und am schwierigsten war es, zu testen, ob alles richtig passt. Besonders schwierig sind ein angemessener Generalisierungsgrad und das, was Menschen von einer Karte ihrer eigenen Region erwarten.
      Mich würde interessieren, ob du den Aufwand für eine deutliche Verbesserung dieser Karte für lohnenswert hältst.
    • Ich weiß nicht, ob der Stern die größte Stadt oder die Hauptstadt bedeutet, aber falls Letzteres gemeint ist, ist Tanzania falsch.
      Der Stern steht bei Dar Es Salaam, das Label lautet aber Dodoma. Dodoma ist tatsächlich die Hauptstadt, liegt aber weiter in Richtung Landesmitte.
    • Die Abkürzung „i18n“ selbst ist nicht besonders internationalisiert.
  • Niedlich. Ich habe früher einmal etwas Ähnliches gebaut, wenn auch nicht ganz dasselbe.
    https://web.archive.org/web/20020611095429/http://www.cs.man.ac.uk/~hancockd/CityZen/index.html
    20.000 Liniensegmente, 3.350 Orte, Viewer und Quiz eingeschlossen: insgesamt 162 KB.

  • Danke für das Feedback. Zur Erklärung der Auswahl: Bis vor Kurzem lag der Hauptfokus dieses Projekts nicht auf Länderformen.
    Lange Zeit war die Version ohne Grenzen, die im README stand, die einzige Version, und ich dachte nicht, dass es möglich wäre, die ganze Welt hinzuzufügen. Aber es war möglich.
    Ich habe eine Nightly-Version veröffentlicht, in der die Fjorde entfernt wurden und dafür an anderer Stelle mehr Details enthalten sind, darunter häufig gewünschte Inseln. Insgesamt ist auch die Auflösung höher.
    Der ursprüngliche Grund, es nicht so zu machen, war, dass ältere Smartphones, insbesondere mit Firefox for Android, beim Zeichnen vieler Polygone abstürzen konnten. Seitdem habe ich den Zeichenablauf optimiert, aber Vorsicht ist weiterhin geboten.
    [1] https://tinyworldmap.com/beta.html

  • Ich bin mir nicht sicher, ob die 10.000 bevölkerungsreichsten Städte der beste Filter sind.
    Dieser Ansatz bevorzugt Städte in großen Ländern, während in kleinen Ländern die meisten Städte wahrscheinlich herausfallen.
    Es sollte einen zusätzlichen Filter geben, der die jeweils größten X Städte pro Land aufnimmt. So würden wohl auch die wichtigsten Städte kleiner Länder erfasst.

    • Es gibt auch andere Maßstäbe für die Bedeutung einer Stadt.
      Kriterien wie nationale Hauptstadt, regionale Hauptstadt, Weltstadt oder Zentralität innerhalb einer Region könnten die Grundvoraussetzungen sinnvoll ergänzen.
      In dieser Diskussion könnten Geografen und Kartografen vermutlich nützlichere Ratschläge geben.
  • Interessant fand ich, dass man bei der Auswahl der 10.000 größten Siedlungen der Welt bis zu 48.000 Einwohnern hinunterkommt.
    Ich bin noch dabei einzuordnen, ob diese Zahl überraschend ist oder nicht.

    • Mir ist schon lange bekannt, dass man bei den etwa 100 größten US-Städten nach Einwohnerzahl ungefähr bei 200.000 Einwohnern landet.
      Selbst wenn man auf 200 erweitert, liegt man immer noch über 100.000. Laut Wikipedia hat Daly City, CA, auf Platz 333 eine Bevölkerung von 100.007: <https://en.wikipedia.org/wiki/List_of_United_States_cities_b...>
      Solche Größenverteilungen sind, wie in vielen anderen Skalierungssituationen, in einem Log-Log-Diagramm im Allgemeinen nahezu linear.
      In China muss man bis Platz 106 gehen, bevor eine Stadt mit weniger als 1 Mio. Einwohnern auftaucht. In den USA gibt es nur 9 solche Städte.
      Bei India habe ich gerade nachgesehen: Es gibt 46 Städte mit mehr als 1 Mio. Einwohnern; Malegaon auf Platz 100 hat 471.000 Einwohner, und Aurangabad auf Platz 300 liegt immer noch über 100.000.
      Allerdings ist „Stadt“ eine sehr willkürliche Definition. Einige der größten Städte der Welt würden nach den Maßstäben anderer Länder als Metropolregionen gelten, teils sogar als Bundesstaaten oder Provinzen.
      Die flächenmäßig größten Städte haben dagegen sehr wenige Einwohner. Sermersooq in Greenland hat 24.148 Einwohner und eine Fläche von 575.300 km², etwa 144-mal so groß wie Rhode Island; unter den US-Bundesstaaten sind nur Texas und Alaska größer. Alaska ist auch nur etwa 12 % größer.
      Stadtgeografie ist ein komplexes Feld, in dem man üblicherweise mehrere Skalen und Definitionen wie Metropolregionen, bebaute Fläche und Bevölkerung gemeinsam vergleicht. So lässt sich die Willkür politischer Grenzen abmildern und die gesamte Bevölkerungs- und Wirtschaftswirkung besser abbilden.
  • Es ist ziemlich erstaunlich, dass die Dateigröße trotz derart grober Grenzen so niedrig ist.
    Die Gesamtdatenmenge scheint deutlich unter dem Punkt zu liegen, an dem Nutzen und Dateigröße gut ausbalanciert wären. Bei doppelter Größe wären die Grenzen zum Beispiel wohl nicht so zackig.

    • Die gesamte Datei ist ohne gzip-Komprimierung etwa 700 KB groß.
      Aus der Beschreibung „enthält alle Daten der vollständigen Version außer Grenzen und Küstenlinien, wodurch die Größe um 200 KB sinkt“ ergibt sich, dass etwa 29 % auf Grenz- und Küstendaten entfallen und 71 % auf Städtenamen und Positionen.
      Persönlich glaube ich, dass man viele Städte entfernen könnte. Besonders Städte, die sich gegenseitig überlappen, sieht man ohnehin erst, wenn man so weit hineinzoomt, dass die graue Landmasse und die Stadtnamen sichtbar werden; stattdessen wäre es besser, die Küstenlinien genauer zu machen.
      Ich bin auch nicht sicher, wie oft man die Position auf einer allgemeinen Weltkarte wirklich braucht. Wäre nicht zum Beispiel auf der Website eines Points of Interest, den man gerade ansieht, häufiger eine schlanke Karte mit den umliegenden Autobahnen und ÖPNV-Linien nützlich, um dorthin zu gelangen?
      Wenn man eine Version erstellt, die die gesamte Erde in Einheiten von einigen km² unterteilt, könnte man wohl schon mit einem Zehntel der Größe ziemlich nützliche Details unterbringen. Eine globale Low-Polygon-Karte der ganzen Erde hat zwar Anwendungsfälle wie das Tracking der Internationalen Raumstation, scheint aber viel seltener gebraucht zu werden.
  • Auch wenn die Einwohnerzahl unter 40.000 liegt, sollten Hauptstädte unbedingt enthalten sein und in irgendeiner Form mit einem Stern markiert werden.

  • Wirklich großartig. Es ist beeindruckend, wie schnell das auf dem Smartphone lädt.
    Die Idee, Geodaten als Paths zu komprimieren, ist sehr gut.
    Wenn man die ODbL-Lizenz vermeiden will, wäre es auch gut, statt OSM Natural-Earth-Daten zu verwenden.
    Es wäre wirklich schön, wenn auch ein Tool enthalten wäre, das Geodaten in Paths umwandelt.