Zum Inhalt springen

#30DayMapChallenge 2025

Die #30DayMapChallenge ist ein Social-Media-Event, bei dem Kartenbegeisterte im Laufe des Novembers täglich Karten zu vorgegebenen Themen erstellen. Weitere Details gibt es auf der Website 30daymapchallenge.com.

Nachdem ich die Challenge schon viele Jahre beobachtet hatte, habe ich 2025 zum ersten Mal selbst mitgemacht.

Ich wollte die Challenge nutzen, um grundlegende Konzepte besser zu verstehen. Dabei ging es mir nicht in erster Linie darum, besonders schöne oder auffällige Karten zu erstellen. Vielmehr arbeite ich an einem kleinen Projekt, bei dem ich Vector Tiles von kleinen Gebieten erstelle – meist unter Verwendung freier Software und offener Formate wie Shortbread und Versatiles. Gleichzeitig experimentiere ich zunehmend auch mit selbst erstellten Vector Tiles und eigenen Stilen. Für die Tiles verwende ich bisher Tilekiln oder Tilemaker und beim Stil habe ich zum ersten Mal Glug genutzt. Weil ich auch Leaflet mag, habe ich dort, wo das besser passt, eine Leaflet-Karte.

In diesem Artikel möchte ich mit meinen Entwürfen experimentieren und dabei Fragen klären, die in meinen To-dos noch offen sind oder einfach einmal etwas Neues ausprobieren.

#30DayMapChallenge 2025

Ich beginne mit fertigen Shortbread Tiles und einem Style, der bisher lediglich Wasserstraßen enthält. Darauf aufbauend füge ich Burgen und Ruinen im deutschen Stil hinzu und zeige, falls in den OpenStreetMap-Daten vorhanden, deren Namen direkt darunter.

Dazu erstelle ich zunächst eigene Sprites mit basemaps-sprites, die ich dann in der style.json referenziere via "sprite": "http://127.0.0.1:8081/sprites":

{
"version": 8,
"name": "vwk",
"glyphs": "http://127.0.0.1:8081/fonts/{fontstack}/{range}.pbf",
"sprite": "http://127.0.0.1:8081/sprites",
"sources": { ... }
}

Mein Ziel war es herauszufinden, wie ich eigene Icons nutzen kann: Im Style kann ich diese Icons jetzt über die Eigenschaft icon-image referenzieren.

#30DayMapChallenge 2025

Klassische Herausforderung: Lineare Merkmale kartieren (z. B. Straßen, Flüsse, Migrationswege, Flusslinien). Erkunde Linienstärke, Farbe und Richtung, um Informationen zu vermitteln.

Heute habe ich die Straßen auf der Karte gefärbt. Dabei habe ich mich wieder an openstreetmap-carto-de orientiert. Auch wenn ich noch nicht weit gekommen bin, wirkt die Karte inzwischen deutlich bunter.

#30DayMapChallenge 2025

Eigentlich ging ich davon aus, dass openstreetmap-carto-de den deutschen amtlichen Stil umsetzt. Das muss ich bei Gelegenheit aber noch einmal genauer recherchieren. maps.rlp.de färbt die Straßen nämlich anders.

Klassische Herausforderung: Erstelle eine Karte, die Flächenmerkmale zeigt (z. B. Verwaltungsgebiete, Landnutzung, Grenzen). Nutze Füllungen, Muster und Choroplethen-Techniken.

Heute habe ich mich an Flächen versucht und zunächst nur Wälder relativ transparent in der Farbe des OpenStreetMap Carto-Projekts dargestellt.

#30DayMapChallenge 2025

Flächen sind für mich besonders herausfordernd, weil man genau überlegen muss, welche Flächen sich überlagern, wie ihre Transparenz, Farbintensität und Reihenfolge die Ansicht beeinflussen. Selbst in einem überschaubaren Gebiet ist das schon schwierig – für die ganze Welt erscheint mir das fast unmöglich.

Karte mit eigenen Daten erstellen. Visualisiere GPS-Spuren, deinen Arbeitsweg oder ein einzigartiges, kleines selbst erstelltes Dataset. (Braucht einfache Daten? Probiere geojson.io)

Mir geht es darum, mit Vector Tiles zu experimentieren. Deshalb habe ich mir heute aus Neugier angesehen, wie ich eine GPX-Datei in Vector Tiles integrieren kann. Ich habe den GPX-Track der heutigen Hunderunde via ogr2ogr in meine Datenbank importiert und auf dieser Grundlage jeden Punkt in Vector Tiles überführt.

Im Stil habe ich als Symbol eine SVG-Datei gewählt, die Fußstapfen für jeden Punkt zeigt. Wenn möglich (genügend Platz), steht neben den Fußstapfen die Höhenangabe. Ich wollte das ausprobieren und habe dabei gelernt, wie wichtig es ist, beim Import von GPX-Daten auf die Projektionen zu achten – in meinem Fall ist ST_AsMVTGeom(ST_Transform(geom, 3857)) entscheidend. Das Umwandeln wäre wahrscheinlich vorher auch schon mit ogr2ogr möglich gewesen. Da hatte ich das aber noch nicht auf dem Schirm.

SELECT
ST_AsMVTGeom(ST_Transform(geom, 3857), {{unbuffered_bbox}}, {{extent}}, {{buffer}}) AS geom,
ele
FROM trackpunkte
WHERE ST_Transform(geom, 3857) && {{bbox}}

#30DayMapChallenge 2025

Klassische Elemente ¼: Fokus auf das Greifbare und Bodenständige. Kartiere Landschaftsformen, Geologie, Boden, Landwirtschaft, Höhenlagen oder alles Solide unter deinen Füßen.

Für mich sind Höhen und Höhenlinien auf einer Karte wichtig. Deshalb habe ich mir heute angesehen, wie ich ST_Contour in Vector Tiles integrieren kann.

#30DayMapChallenge 2025

Karte jenseits von 2D. Visualisiere Daten mit 3D-Modellen, Extrusionen (Gebäudehöhen), Tiefe, Zeit (als Dimension) oder einem unkonventionellen multivariaten Ansatz.

Heute erstelle ich einen Stil, bei dem die Gebäude Schatten bekommen – ausschließlich über den Stil, ohne dass echte Höhenangaben oder Etagenzahlen vorliegen. Zum Vergleich habe ich die ursprüngliche Version der Gebäude ohne Schatten-Layer beigefügt.

#30DayMapChallenge 2025

#30DayMapChallenge 2025

Kartiere, wie Menschen (oder Dinge) sich fortbewegen. Visualisiere Reisezeiten, Hindernisse, inklusives Design, Erreichbarkeit öffentlicher Verkehrsmittel oder erstelle eine besonders zugängliche Karte.

Barrierefreiheit gibt es in meinen Augen nicht, sondern bestenfalls Barrierearmut. Gerade bei Karten spielt Sprache eine wesentliche Rolle, wenn es um Zugänglichkeit geht. Deshalb habe ich untersucht, wie sich bevorzugte Sprachtags nutzen lassen.

Dazu habe ich mit
wget -O seoul.osm https://overpass-api.de/api/map?bbox=126.802826,37.467229,127.137222,37.641422
Daten rund um Seoul heruntergeladen und weiterverarbeitet.

Ein Deutscher kann im nächsten Bild den Städtenamen der Node 서울특별시 vermutlich weniger gut zuordnen als die Bezeichnung „Seoul“ im übernächsten Bild. Erreicht habe ich dies, indem ich – sofern vorhanden – name:de, alternativ name:en und als Fallback name (also die Bezeichnung in der Landessprache) importiert habe.

#30DayMapChallenge 2025

#30DayMapChallenge 2025

Ich bin dann noch einen Schritt weiter gegangen: Da OpenStreetMap oft ein buntes Durcheinander persönlicher Vorlieben bei den Bezeichnungen ist, habe ich mir überlegt, wie sich bestimmte Schreibweisen vereinheitlichen lassen, damit sie für alle verständlicher sind. Die Regel habe ich mir bei github.com/giggls/osml10n abgeschaut.

Ich habe damit begonnen, das Wort Straße zu vereinheitlichen, da es in meinem Land häufig unterschiedlich geschrieben wird. In der ersten Karte sind die Straßennamen vollständig ausgeschrieben, in der zweiten Karte einheitlich gekürzt.

#30DayMapChallenge 2025

#30DayMapChallenge 2025

(Welt-Städtetag) Kartiere die gebaute Umwelt: dichte Straßennetze, Hochhäuser, Zersiedelung, städtische Infrastruktur oder Bevölkerungsdichte in einer Metropolregion.

Heute habe ich mir die Bebauung rund um Koblenz angesehen und dabei besonders darauf geachtet, die Schriftgröße der Städtenamen proportional zur Größe der jeweiligen Stadt zu halten.

#30DayMapChallenge 2025

Weg vom Bildschirm! Erstelle deine Karte mit traditionellen Methoden (z. B. Stift, Bleistift, Farbe, Collage, physische Modelle). Zeige den handgemachten Prozess!

Heute zeige ich eine Karte, die erstellt wurde, um bestimmte Bäume in unserem Wald zu finden.

#30DayMapChallenge 2025

Und so findet man die 7. Schneise vor Ort.

#30DayMapChallenge 2025

Klassische Elemente 2/4: Fokus auf die Atmosphäre. Kartiere Wetter, Windmuster, Flugverkehr, Verschmutzung oder luftgetragene Übertragungen (z. B. Pollen, Geräusche).

Heute habe ich etwas ausprobiert, was ich ohne diese Challenge vermutlich nicht angegangen wäre. Bei der Suche nach Inspirationen bin ich auf die Website openflightmaps.org/ gestoßen und fand die Rasterkarten spannend.

#30DayMapChallenge 2025

Ich habe mir die Gegend rund um Koblenz genauer angesehen.

#30DayMapChallenge 2025

Als Nächstes habe ich überlegt, wie ich die Daten in mein Vector Tiles Projekt integrieren könnte. Dazu habe ich OpenAir-Daten von Deutschland in meine Datenbank eingelesen. Die Dokumentation in der Datei OpenAir_File_Format_Support.pdf habe ich dabei zu Hilfe genommen.

#30DayMapChallenge 2025

Im PostGIS Geometry Viewer habe ich mir die ersten 100 Tabelleneinträge angesehen – das sah für mich gut aus.

#30DayMapChallenge 2025

Anschließend habe ich mich an die Vector Tiles gewagt. Gestylt habe ich sie nicht mehr, aber der MapLibre Inspector zeigt sie korrekt an.

#30DayMapChallenge 2025

Fordere dich heraus, so wenige Elemente wie möglich zu nutzen (Farbe, Linienstärke, Beschriftungen), während die Karte klar, nützlich und informativ bleibt.

An Tag 11 lege ich den Schwerpunkt auf die Namen der Wasserstraßen. Ich zeige die Namen der Flüsse in der Nähe von Koblenz in größerer Schrift; beim Hineinzoomen erscheinen zusätzlich die Bäche.

#30DayMapChallenge 2025

Das hat mich daran erinnert, wie ich vor vielen Jahren gelernt habe, aus welchen Teilen das Rheinische Schiefergebirge besteht.

#30DayMapChallenge 2025

Wie werden Karten in 100 Jahren aussehen? Erstelle eine spekulative Karte dessen, was sein könnte (oder was du dir wünschst).

In bewohnten Gegenden wünsche ich mir, nur Radwege. Wie ich die Straßen einfärbe, habe ich ja bereits gelernt. Für die Radwege finde ich die Farbe Grün passend.

#30DayMapChallenge 2025

Starte den Timer! Die maximale Zeit zum Entwerfen und Erstellen dieser Karte beträgt 10 Minuten. Fokus auf Geschwindigkeit, Einfachheit und Kernkommunikation.

In diesem Monat warte ich darauf, dass LeafletJs 2.0 veröffentlicht wird. Heute habe ich mir die Alpha-Version noch einmal angesehen. Mehr als einen Marker, einen Kreis und ein Dreieck - wie im offiziellen Beispiel - habe ich in der Zeit nicht geschafft. Dafür habe ich diesmal einen Link zur Karte.

#30DayMapChallenge 2025

Nutze OpenStreetMap (OSM) Daten als primäre Quelle. Kartiere dein Lieblingsmerkmal, trage zum Projekt bei oder style die Karte interessant.

Auf meiner Hunderunde gibt es ganz neu zwei fest installierte Hängematten. Davon gibt es entlang des Rheinsteigs inzwischen immer mehr.

#30DayMapChallenge 2025

Heute ist mir eine Wanderin begegnet, die genau diese Hängematten suchte. Das habe ich zum Anlass genommen, sie in OpenStreetMap hinzuzufügen und sie in meinem Projekt sichtbar zu machen.

#30DayMapChallenge 2025

Klassische Elemente ¾: Fokus auf Energie, Licht oder Transformation. Kartiere Hitze, Waldbrände, Energieverbrauch, Bevölkerungsdichte bei Nacht oder vulkanische Aktivität.

Ich habe mich für das Stromnetz in Deutschland interessiert und mich im Wiki informiert. Anschließend habe ich alle Objekte mit dem Tag power=* über Overpass abgerufen:

[out:json][timeout:25];
(
node["power"]({{bbox}});
way["power"]({{bbox}});
relation["power"]({{bbox}});
);
out geom;

#30DayMapChallenge 2025

Meine Vektortiles enthielten das Tag power nicht. Deshalb habe ich diese Daten mithilfe von osm2pgsql und Themepark in die PostGIS-Datenbank geladen. Darauf aufbauend habe ich SQL-Abfragen für Vector Tiles erstellt, sodass die Stromnetz-Features ab Zoom 7 verfügbar sind. Später werde ich den minimalen Zoomwert vermutlich noch erhöhen.

SELECT
ST_AsMVTGeom(
geom,
{{ unbuffered_bbox }},
{{ extent }},
{{ buffer }}
) AS way,
node_id AS id,
power,
ref,
voltage,
operator
FROM power_nodes
WHERE geom && {{ bbox }}
AND {{ zoom }} >= 7

#30DayMapChallenge 2025

Beim Stylen habe ich mich erst einmal mit farbigen Punkten begnügt. Für die Darstellung als Symbol habe ich mir einen Strommast als Icon vorgenommen.

layer(:power_nodes, source: :vwk, source_layer: :power_nodes, type: 'circle') {
circle_color match(get(:power),
'pole', '#1f78b4',
'tower', '#e31a1c',
'#888'
)
circle_radius interpolate([:linear], get(:voltage),
0, 1,
110, 2,
220, 3,
380, 4
)
minzoom 7
}

Dabei habe ich gelernt, dass ein “pole” ein kleiner Holzmast ist, während ein “tower” ein großer Hochspannungsmast darstellt.

#30DayMapChallenge 2025

Kartiere etwas, das aus kleinen, diskreten Einheiten oder Netzwerken besteht. Dies kann eine geographische Zelle (Raster, Tesselation), ein Mobilfunknetz oder ein biologischer/sozialer Prozess sein (z. B. Krankheitsausbreitung).

Eine Burganlage lässt sich in meinen Augen als Netzwerk aus diskreten Einheiten kartieren: Mauern, historische POIs, Wege, Türme, Gebäude, Pflanzen, Innenhöfe und toristische Einrichtungen können als einzelne Elemente dargestellt werden. Die rohen OSM-Daten der Marksburg zeigen mir, wie aufwendig es ist, selbst einen kleinen Bereich so zu kartieren, dass er bei allen Zoomstufen gut sichtbar bleibt.

#30DayMapChallenge 2025

Klassische Herausforderung: Experimentieren ist entscheidend! Erstelle deine Karte mit Software, Sprache, Bibliothek oder Technik, die du noch nie verwendet hast.

In meiner Todo hatte ich Switching a style to glug. Also schlage ich zwei Fliegen mit einer Klappe. Ich arbeite eine Todo ab und bin einen Tag weiter in der Challence.

Nebenbei spare ich Codezeilen. Denn meine Version des Stiles für die Höhenlinien, für die https://github.com/unvt/charites verwende, ist wesentlich länger.

id: contour-lines
type: line
source: vwk
source-layer: contours
minzoom: 10
paint:
line-color:
- interpolate
- [linear]
- [get, elevation]
- 0
- "#f2f0f7"
- 500
- "#cbc9e2"
- 1000
- "#9e9ac8"
- 1500
- "#756bb1"
- 2000
- "#54278f"
line-width:
- interpolate
- [linear]
- [zoom]
- 10
- 0.3
- 14
- 1
- 16
- 1.5
id: contour-labels
type: symbol
source: vwk
source-layer: contours
minzoom: 14
layout:
text-field:
- to-string
- [get, elevation]
text-font:
- !!inc/file style/inc/regular-font.yaml
text-size: 10
symbol-placement: line
paint:
text-color: "#444"
text-halo-color: "#fff"
text-halo-width: 1

Ich kenne Ruby nicht, aber diese Syntax habe ich erstellen können.

layer(:contour_lines, source: :vwk, source_layer: :contours, type: 'line') {
line_color interpolate([:linear],
get(:elevation),
0, '#f2f0f7',
500, '#cbc9e2',
1000, '#9e9ac8',
1500, '#756bb1',
2000, '#54278f'
)
line_width interpolate([:linear], zoom,
10, 0.3,
14, 1,
16, 1.5
)
}
layer(:contour_labels, source: :vwk, source_layer: :contours, type: 'symbol') {
symbol_placement :line
text_field to_string(get(:elevation))
text_font literal(:'Noto Sans Regular')
text_size interpolate([:linear], zoom,
13, 0,
14, 10
)
text_color '#444'
text_halo_color '#fff'
text_halo_width 1
}

Und die Höhenlinien sehen aus wie vorher.

#30DayMapChallenge 2025

Kartiere etwas Nicht-Erdisches: ein Fantasy-Reich, einen Exoplaneten, den Mond, Mars, den Weltraum oder einen rein konzeptuellen Ort (z. B. mentale Karte).

Das Thema heute hat mich an crs-simple erinnert. CRS steht für Coordinate Reference System. Ich habe es schon öfter für ImageMaps genutzt. Hier verwende ich ein Foto der Marksburg und beginne mit einem einfachen Marker. Wenn ich Zeit finde, werde ich die einzelnen Teile der Burg genauer beschreiben, sobald man hineinzoomt.

#30DayMapChallenge 2025

(GIS-Tag) Fokus ausschließlich auf Kartenprojektionen. Wähle eine ungewöhnliche oder wenig verstandene Projektion, um ein Thema hervorzuheben, oder visualisiere Verzerrungen.

Ich verstehe, dass die Oberfläche eines Balls nicht einfach auf einem flachen Blatt Papier angezeigt werden kann. Mir ist auch klar, dass die Erde komplizierter als ein Ball ist. Ich schaue mir gerne Projektionen genauer an. Am liebsten mag ich Bonne.

Das alles ist aber sehr kompliziert und so habe ich nur folgende Gegenüberstellung gewagt equal.bbox.earth/leaflet-eq2merc/ .

#30DayMapChallenge 2025

Link zur Map

Das habe ich in diesem Sommer gelernt: Mercator ist winkeltreu und bildet die Erde rechteckig ab, was Navigation erleichtert und die Karte leicht in Kacheln unterteilbar macht, jedoch Flächen in hohen Breiten stark verzerrt, während Equal Earth die Flächen korrekt darstellt und so realistischere Vergleiche zwischen Ländern und Kontinenten ermöglicht.

Klassische Elemente 4/4: Fokus auf das Flüssige. Kartiere Hydrologie, Ozeane, Strömungen, Wasserzugang, Meeresspiegelanstieg, Niederschlag oder alles Wasserbezogene.

Heute habe ich den ocean layer ergänzt.

#30DayMapChallenge 2025

Dazu nuzte ich Daten von osmdata.openstreetmap.de. Die nächsten beiden Bilder zeigen den Unterschied zwischen der vereinfachten - die in niedrigen Zoomstufen verwendet wird - und der genaueren Version für die näheren Ansichten.

#30DayMapChallenge 2025

#30DayMapChallenge 2025

Erstelle eine Karte, bei der Symbole, Piktogramme oder eigene Icons im Mittelpunkt stehen. Nutze sie, um Punkte von Interesse hervorzuheben oder traditionelle Kartenelemente zu ersetzen.

An Tag 14 hatte ich ja schon ein eigenes Symbol hinzugefügt. Heute habe ich analog dazu weitere Elemente aufgenommen. Die Wegweiser werde ich vermutlich später nur in detailliertere Zoomstufen aufnehmen.

#30DayMapChallenge 2025

Nutze den Natural Earth-Datensatz als primäre Quelle für eine visuell beeindruckende Welt- oder Kontinentkarte im kleinen Maßstab.

Ich nutze die Datei ne_110m_admin_0_boundary_lines_land.zip. „110m“ bezieht sich auf den Maßstab (1:110 000 000) — also eine sehr grobe globale Darstellung.

Inhalt der Datei: Es handelt sich um Vektordaten mit Linien („boundary lines“) der Verwaltungsgrenzen auf Ebene „Admin 0“ (also Ländergrenzen) an Land. Das „an Land“ war zunächst etwas verwirrend, weil ich dachte, nicht alle Daten würden erfasst. Sobald man aber das Wasser hinzufügt, sieht alles gut aus.

Wofür die nützlich ist? Ideal für Weltkarten mit geringem Detailgrad oder Übersichtskarten — also für niedrige Zoomstufen bei den Vektortiles. Für genauere Ansichten kann man auf genauere Quellen zurückgreifen.

#30DayMapChallenge 2025

Eigentlich hatte ich heute vor, alle Länder in unterschiedlichen Farben darzustellen. Dafür waren die Grenzen jedoch nicht passend. Ich brauche Polygone, wie sie zum Beispiel in 10m-admin-0-countries verfügbar sind. Das werde ich vielleicht im nächsten Jahr umsetzen.

Zeige, wie du eine Karte erstellst. Dies kann ein Tutorial, eine Schritt-für-Schritt-Grafik, ein Blogpost, ein Video oder ein Screenshot deiner Arbeitsumgebung sein. Kombiniere es mit einer Karte eines anderen Tages!

Hier eine Schritt-für-Schritt-Anleitung, wie ich an Tag 27 Steilhänge in die Datenbank, die Vector Tiles und den Stil aufnehme.

#30DayMapChallenge 2025

  1. In Lua und osm2pgsql

Zuerst lade ich die Daten aus OpenStreetMap via Themepark in eine PostGIS-Datenbank. Dabei prüft das Skript, ob ein Steilhang als Linie oder Polygon vorliegt. Polygone werden in Linien umgewandelt, damit sie konsistent in den Tiles dargestellt werden können.

themepark:add_table{
name = 'land_cliff',
ids_type = 'way',
geom = 'linestring',
columns = themepark:columns({
{ column = 'kind', type = 'text', not_null = true },
{ column = 'minzoom', type = 'int', not_null = true, tiles = 'minzoom' },
}),
tiles = {
minzoom = 11
},
expire = expire.vwk(11, 14, 'land_cliff', 'full-area')
}
themepark:add_proc('way', function(object, data)
if object.tags.natural == 'cliff' then
local geom = object:as_linestring()
if not geom then
local poly = object:as_area()
if poly then
geom = poly:boundary()
end
end
if not geom then return end
local a = { geom = geom, kind = 'cliff', minzoom = 11 }
themepark:insert('land_cliff', a, object.tags)
end
end)

#30DayMapChallenge 2025

  1. SQL-Abfrage für Vector Tiles

Die Abfrage wandelt die Linien in ST_AsMVTGeom um, damit sie in Mapbox/MapLibre als Vector Tiles genutzt werden können. Zusätzlich filtert sie nach minzoom.

SELECT
ST_AsMVTGeom(
geom,
{{ unbuffered_bbox }},
{{ extent }},
{{ buffer }}
) AS way,
kind
FROM land_cliff
WHERE kind = 'cliff'
AND geom && {{ bbox }}
AND {{ zoom }} >= minzoom
  1. Styling der Steilhänge

Für die Darstellung gibt es zwei Layer:

  • land_cliff zeigt die Linien der Steilhänge, deren Breite sich je nach Zoomstufe anpasst.
  • cliff_triangles platziert kleine Dreiecke entlang der Linie, um die Steilheit visuell zu unterstreichen.
layer(:land_cliff, source: :vwk, source_layer: :land_cliff) {
filter kind == 'cliff'
line_color '#a0a0a0'
line_width interpolate([:linear], zoom, 11, 1, 15, 2)
line_cap 'round'
line_join 'round'
sort_key 100
}
layer(:cliff_triangles, source: :vwk, source_layer: :land_cliff, type: "symbol") {
filter kind == "cliff"
symbol_placement "line"
symbol_spacing 12
icon_allow_overlap true
icon_image "cliff"
icon_size interpolate([:linear], zoom,
12, 0.8,
14, 1.0,
16, 1.1
)
icon_color "#dcdcdc"
symbol_sort_key 31
}

Nun sind die Steilhänge erkennbar und lassen sich in Vector Tiles darstellen. Das Ergebnis zeigt das Bild bei Tag 27.

Fokus auf Toponymie (Ortsnamen). Experimentiere mit Schriftarten, Labelplatzierung, Typografie, mehreren Sprachen oder der Geschichte/Bedeutung eines Namens.

Heute habe ich mit der Schriftgröße in Relation zur Größe der Stadt experimentiert. Als Schriftart selbst mag ich Noto Fonts.

#30DayMapChallenge 2025

Klassische Herausforderung: Nutze hexagonale Binning (Hexbins) oder ein hexagonales Rastersystem, um deine Daten zu visualisieren. Feier diese schöne und effiziente Tesselation!

Heute habe ich mir zum ersten Mal die Funktion https://postgis.net/docs/ST_HexagonGrid.html angesehen. Als Beispiel habe ich die Gebäude verwendet.

Zuerst zeige ich den Kartenausschnitt mit den normalen Gebäuden.

#30DayMapChallenge 2025

Im nächsten Bild sind die Hexagone zu sehen: Bereiche mit vielen Gebäuden sind dunkler dargestellt als jene mit wenigen Gebäuden.

#30DayMapChallenge 2025

Meine Codeschnipsel füge ich hier noch bei:

WITH hex AS (
SELECT (ST_HexagonGrid(50, {{unbuffered_bbox}}::geometry)).geom AS hexgeom
),
binned AS (
SELECT
h.hexgeom,
COUNT(b.geom) AS building_count
FROM hex h
LEFT JOIN buildings b
ON ST_Intersects(b.geom, h.hexgeom)
GROUP BY h.hexgeom
)
SELECT
ST_AsMVTGeom(hexgeom, {{unbuffered_bbox}}, {{extent}}, {{buffer}}) AS geom,
building_count
FROM binned
WHERE hexgeom && {{bbox}}

und

layer(:building_fill, source: :vwk, source_layer: :buildings, type: 'fill') {
fill_color let('count', building_count) <<
interpolate([:linear], var('count'),
0, to_color("#f7fbff"),
20, to_color("#08519c")
)
}

(Welt-Tag des nachhaltigen Transports) Kartiere Mobilität, Verkehrsfluss, öffentliche Verkehrssysteme, Logistikketten oder fördere nachhaltige Transportoptionen.

Bei den ersten Überlegungen zum Layer „public_transport“ ist mir aufgefallen, dass der Rhein (rechts im Bild) mehr Fährverbindungen aufweist als die Mosel (links im Bild). Letztere verfügt dafür über mehr Brücken.

#30DayMapChallenge 2025

Kartiere Trennungslinien – politisch, physisch, ökologisch oder konzeptionell. Erkunde die Bedeutung und Auswirkungen einer Trennung, real oder wahrgenommen.

Bei Grenzen und Barrieren dachte ich zunächst an die Elemente, die in openstreetmap-carto-de mit den Symbolen unter symbols/barrier dargestellt werden.

Heute, bei einer Führung durch die einzige nie zerstörte Höhenburg am Mittelrhein, wurde mir bewusst, dass Höhenunterschiede und unwegsames Gelände eine viel größere Barriere darstellen. Daher habe ich Steilhänge in mein Projekt aufgenommen. Auf dem Bild ist der Steilhang zu sehen, der die Marksburg wohl so gut geschützt hat.

#30DayMapChallenge 2025

(Black Friday) Interpretiere das Thema Schwarz. Die Karte kann rein monochrom sein, Abwesenheit/Dunkelheit darstellen (z. B. Lichtverschmutzung) oder sich auf Konsumthemen beziehen.

Heute habe ich alles in Grau umgewandelt. Im Vergleich zur Farbversion bin ich erstaunt, wie viele Dinge auf der Karte noch klar zu erkennen sind. Das Wasser oder der Fluss sind für mich offensichtlich, obwohl sie nicht in Blau gezeichnet sind.

#30DayMapChallenge 2025

#30DayMapChallenge 2025

Klassische Herausforderung: Kartiere mit Rasterdaten. Fokus auf Satellitenbilder, Höhenmodelle (DEM), Landbedeckung oder pixelbasierte Kunst.

Ich hatte mich bereits damit beschäftigt, wie ich ST_Contour in Vector Tiles integrieren könnte. Heute habe ich ein wenig mit dem Stil experimentiert und fand es spannend, den Rhein nur mit Konturlinien darzustellen.

#30DayMapChallenge 2025

http://localhost:8080/#17.42/50.27376/7.642211

Nimm eine Karte, die du im Monat oder früher erstellt hast, und gestalte sie neu. Fokus auf Verbesserung von Ästhetik, Klarheit oder Datenkommunikation.

Die Art und Weise, wie sich die Straßen überlappen, hat mir immer noch Sorgen bereitet. Ich habe mich heute damit befasst und eine Lösung gefunden.

#30DayMapChallenge 2025

#30DayMapChallenge 2025


Jetzt habe ich viele neue Ideen und ein ziemliches Durcheinander an angefangenen Dingen in meinem Projekt und werde vermutlich ein Jahr brauchen, um alles zu sortieren.

Impressum

Astrid Günther
Dachsenhäuser Str. 46 e
56338 Braubach
Germany
E-Mail: info At astrid-guenther.de

Ich freu mich über Anfragen zu den von mir hier beschriebenen Themen und beantworte diese zeitnah!

Datenschutz

Ich erhebe oder speichere keine personenbezogenen Daten über diese Website. Um den Aufruf dieser Seite zu ermöglichen, speichert der Internet-Provider einige Daten in Server-Log-Files, die ein Browser automatisch weiterleitet: Browsertyp und Browserversion, verwendetes Betriebssystem, Referrer URL, Hostname des zugreifenden Rechners, Uhrzeit der Serveranfrage, IP-Adresse. Die Grundlage für die Datenverarbeitung ist Art. 6 Abs. 1 DSGVO, der die Verarbeitung von Daten zur Erfüllung eines Vertrags oder vorvertraglicher Maßnahmen erlaubt.