User:Baiuvarius/Topo 50

From OpenStreetMap Wiki
Jump to navigation Jump to search

Dies sind Maperitive-Regeln und -Skripte zur Erstellung von topographischen Karten. Die Gestaltung orientiert sich an den amtlichen topographischen Karten der deutschen Länder vor der Einführung der DTK.

User:Baiuvarius/Topo 50/Topo 50.mrules

Besonderheiten

  • Hoher Kontrast für Ausdrucke
  • Typische Symbole topographischer Karten
  • Höhenlinien und Schummerung
  • Unterscheidung von Gemeinden und Gemeindeteilen
  • Schriftgrößen abhängig von Flächeninhalten
  • Darstellung von Flügelstrichen an Brücken und von Symbolen für Tunnelportale
  • Bahnhofsymbole werden in Gleisrichtung gedreht
  • "Selektives Freistellen": Schrift wird von schwarzen Linien, aber nicht von Flächensignaturen freigestellt

Legende

Legende

Höhenlinien und Schummerung

Die Höhenlinien und die Schummerung werden aus SRTM-Höhendaten erzeugt.

Höhenlinien

generate-contours interval=5

Schummerung

Die Schummerung besteht aus einer grauen Schattierung mit Beleuchtung aus NW und einer gelben Schattierung mit Beleuchtung aus SE.

generate-relief-igor
generate-relief-igor color=yellow sun-azimuth=135

Unterscheidung von Gemeinden und Gemeindeteilen

Namen von Orten, die selbstständige Städte und Gemeinden sind, werden in aufrechter Schrift dargestellt, andere kursiv. Ein Ort wird als selbstständige Gemeinde aufgefasst, wenn es eine gleichnamige Grenzrelation auf Gemeindeebene gibt. Um auch die Orte von Gemeinden darzustellen, die keinen gleichnamigen Place-Knoten (im Kartenausschnitt) haben, werden die entsprechenden Grenzrelationen in Multipolygone umgewandelt. Die so manipulierten Daten werden natürlich nicht zu OSM hochgeladen!

from maperipy import *
from maperipy.osm import *

osm = None
osm_layer= None
layer_index=0
for layer in Map.layers:
	layer_index += 1
	if layer.layer_type == "OsmLayer":
		osm = layer.osm
		break
if osm == None:
	raise AssertionError("There are no OSM map souces.")

for relation in osm.find_relations(lambda x: x.has_tag("boundary","administrative") and ((x.has_tag("admin_level","6") and x.has_tag("de:place","city")) or x.has_tag("admin_level","8"))):
	for node in osm.find_nodes(lambda x : x.has_tag("place","city") or x.has_tag("place","town") or x.has_tag("place","village") or x.has_tag("place","municipality")):
		if node.has_tag("name") and relation.has_tag("name"):
			if node.get_tag("name")==relation.get_tag("name"):
				node.set_tag("gemeinde","yes")
				break
			else:
				if node.has_tag("official_name"):
					if node.get_tag("official_name")==relation.get_tag("name"):
						node.set_tag("gemeinde","yes")
						break
	else:
		relation.set_tag("type","multipolygon")
		relation.set_tag("gemeinde","yes")

Flächeninhaltsabhängige Schriftgrößen

Die Schriftgrößen der Beschriftung von flächenartigen Objekten richtet sich nach dem Flächeninhalt der jeweiligen Objekte. Details: Flächenberechnung

Drehung von Punktsymbolen

Einige Punktsymbole werden in die Richtung der Wege gedreht, auf oder an denen sie liegen. Das betrifft z. B. Bahnhöfe, Brücken, Tunnel, Wasserfälle und Wehre. Details: Drehung von Punktsymbolen

Selektives Freistellen

Schrift und Symbole nicht freigestellt: schlecht lesbar
Schrift und Symbole mit weißem Rand freigestellt: gut lesbar, aber viel Hintergrund abgedeckt
Hintergrundebene: Flächenfüllungen
Gewässerkonturen, Gewässerschrift und Symbole
Straßendecker
Schrift, Symbole, schwarze Konturen und Flächen
Schrift und Symbole nur von dunklen Hintergrundobjekten freistellt: gut lesbar, wenig unnötige Abdeckung, harmonische Erscheinung

Das besondere Merkmal dieser Karte! Die Beschriftungen und Symbole werden zur besseren Lesbarbeit von den schwarzen Flächen (Gebäude) und Linien (Straßenkonturen, Bahnlinien) freigestellt. Dazu erhalten sie einen weißen "Rand" ("Halo"). Auf relativ hellen Flächensignaturen wie Wasser- und Waldflächen und auf den gelben und orangen Straßendeckern sieht das aber nicht schön aus, und es geht unnötig viel Information verloren. Daher wird die Karte mehrfach in Bitmaps exportiert, die dann noch bearbeitet und wie Folien übereinandergelegt werden.

Die Beschriftungen und Symbole erhalten einen Rand in der Farbe #fefefe (254,254,254). Dieser überdeckt die schwarzen Linien und Flächen in derselben Folie und wird im zweiten Schritt (s. u.) transparent gemacht, sodass die darunterliegenden Flächen durchscheinen.

Das folgende Python-Skript lässt Maperitive die einzelnen Ebenen exportieren. Der Hintergrund wird mit 100 dpi und im Maßstab 1:10.000, die übrigen Ebenen werden mit 200 dpi und in 1:20.000 generiert. Das ergibt bei einer Druckauflösung von 500 dpi eine Karte im Maßstab 1:50.000. Am Bildschirm ist die 2,5-fache Größe, also 1:20.000 sinnvoll, um alle Feinheiten zu erkennen. Die Bitmaps für Flächenfüllungen haben in Maperitive immer 100 dpi, das lässt sich auch nicht ändern. Für eine höhere Auflösung im Druck wird der Hintergrund daher in 1:10.000 generiert und dann verkleinert.

from maperipy import Map
from maperipy.commands import ExportBitmapCommand

for layer in Map.layers:
	if layer.layer_type=="WebMapLayer":
		layer.visible=False

with Map.init_workflow() as workflow:
	workflow.cycles_to_output(100,501).cycles_to_output(521)
cmd = ExportBitmapCommand()
cmd.bitmap_file = "output/bitmap/hintergrund.png"
cmd.dpi=100
cmd.map_scale=10000
cmd.execute()
with Map.init_workflow() as workflow:
	workflow.cycles_to_output(510,531).cycles_to_output(700,791)
cmd.bitmap_file = "output/bitmap/wasser.png"
cmd.dpi=200
cmd.map_scale=20000
cmd.execute()
with Map.init_workflow() as workflow:
	workflow.cycles_to_output(531,671).cycles_to_output(700,801)
cmd.bitmap_file = "output/bitmap/schwarz.png"
cmd.execute()
with Map.init_workflow() as workflow:
	workflow.cycles_to_output(601).cycles_to_output(611).cycles_to_output(621)
	.cycles_to_output(631).cycles_to_output(641).cycles_to_output(651)
cmd.bitmap_file = "output/bitmap/strassendecker.png"
cmd.execute()
with Map.init_workflow() as workflow:
	workflow.cycles_to_output(0,1001)

In den dadurch entstandenen Einzelebenen "Wasser" und "Schwarz" werden mit Irfanview die Freistellungen für die darunterliegenden Ebenen transparent gemacht. In Irfanview muss dafür die Hintergrundfarbe (254,254,254) eingestellt sein.

"C:\Program Files\IrfanView\i_view64.exe" wasser.png /transpcolor=(254,254,254) /convert=wasser1.png
"C:\Program Files\IrfanView\i_view64.exe" schwarz.png /transpcolor=(254,254,254) /convert=schwarz1.png

Die bearbeiteten Einzelebenen werden schließlich mit Magick übereinandergelegt. Optional kann ein Maßstab in der unteren rechten Ecke eingefügt werden.

magick.exe composite wasser1.png hintergrund.png map.png
magick.exe composite strassendecker.png map.png map.png
magick.exe composite schwarz1.png map.png map.png
#magick.exe composite scale50000.png -gravity SouthEast map.png map.png