meine Karte umfasst das Gebiet Nordbayern/CZ. In CZ gibt es viele Ortschaften, die hier noch unter ihrem alten, deutschen Namen bekannt sind. Hierfür gibt es ja das name:de-Tag, welches auch rege genutzt wird.
Ich möchte den deutschen Namen mit anzeigen lassen, z.B. “Cheb (Eger)”, was prinzipiell kein Problem darstellt:
name:de=* {set name='${name} (${name:de})' }
Das birgt aber den Nachteil, dass auch deutsche Ortschaften mit name:de-Tag entsprechend angezeigt werden, z.B. “Nürnberg (Nürnberg)”. Darum möchte ich das name:de-Tag nur anzeigen, wenn name und name:de nicht identisch sind:
name != '${name:de}' { set name='${name} (${name:de})' }
Leider funktioniert das so nicht. Nürnberg wird immernoch als “Nürnberg (Nürnberg)” angezeigt.
Meine Frage ist nun: Wie vergleiche ich ein Tag mit dem Inhalt eines anderen Tags?
Das du Tag-Abfragen nur innerhalb des Actions-Teils machen kannst. mkgmap interpretiert dein ‘${name:de}’ als simplen String, der nicht in name vorkommen soll. Das hört sich aber egtl. ganz sinnvoll an. Schreib das doch mal als Wunsch an die Mailingliste @mkgmap-dev (die meist auch der bessere Ort für solche Fragen ist, da liest der geballte Sachverstand an Nutzern und Devs mit)
wenn ich das richtig lese, dann kann ich bei osmium wählen, ob ich den deutschen oder anderssprachigen Namen möchte. Das ist aber prinzipiell jetzt schon im mkgmap-style-file möglich. Nur lege ich mich da kartenweit fest.
Am einfachsten wäre es tatsächlich, ich könnte den Inhalt von name:de und name vergleichen und, falls nicht identisch, einen neues name-Tag bilden. Das wäre im style-file ein Einzeiler - wenn es das eben schon gäbe.
Ich denke, das auf der Wiki-Seite ist nur ein Beispiel. Da Osmium ein generisches Framework ist, kann man da wohl mehr oder weniger beliebige Logik einbauen, also auch das was Du gerne abbilden möchtest.
Die Frage stelle ich mir auch jedes Mal, wenn derartige Fragen aufkommen. Warum versuchen, alles mit einem Werkzeug zu machen? Warum keine Vorverarbeitung mit geeigneten Werkzeugen vornehmen? Von einem Programm wie mkgmap kann man kaum erwarten, daß es sämtliche denkbaren Bearbeitungen der vorhandenen Daten unterstützt. Das ist schlichtweg nicht seine Aufgabe.
Mit Osmium ist eine solche Vorverarbeitung in der Tat simpel. Die größte Komplikation ist, daß Osmium::Handler::Base OSM-Objekte nur const& liefert und man sie daher erst kopieren muß. Deshalb hat es auch geschlagene 45 Minuten gedauert, folgendes zu programmieren:
Kompilieren mit dem Osmium-üblichen Bibliotheken-Rattenschwanz -lz -lprotobuf-lite -losmpbf -lpthread. Das Programm liest pbf aus der Standardeingabe und schreibt pbf in die Standardausgabe, aber das läßt sich bei Bedarf natürlich anpassen. Ansonsten sollte es die Aufgabe erfüllen.
Naja, einen Vergleich von zwei Tag-Inhalten halte ich jetzt nicht für derart exotisch.
Jedenfalls danke für den “Code-Schnipsel”. Ich habe schon in C und C# programmiert und verstehe prinzipiell, was der Code bewirkt, wenn auch viel Unbekanntes dabei ist. Mir wird wohl nichts anderes übrig bleiben, als mich in die osmium-Thematik einzuarbeiten. Das Wetter ist ja eh gerade bescheiden…
Der “Code-Schnipsel” ist ein komplettes, kompilierbares Programm auf Osmium-Basis. Das sollte auch deutlich machen, wie simpel der Umgang mit Osmium ist, wenn man erst einmal den Einstieg geschafft hat (für den es leider kein Tutorial oder dergleichen zu geben scheint, nur die API-Dokumentation und die mitgelieferten Beispiele): Für die gängige Aufgabe eines spezialisierten Filterprogramms braucht man beispielsweise nur eine einfache Handler-Klasse auf Basis von Osmium::Handler::Base oder Osmium::Handler::Forward. In main() die OSMFile-Objekte für Ein- und Ausgabe und eine Handler-Instanz anlegen, Osmium::Input::read() aufrufen; alles andere erledigt die Bibliothek. Das obige Beispiel ist für Osmium-Maßstäbe schon relativ kompliziert, weil die Objekte verändert werden sollen und die Osmium-API für die Übergabe an einen Handler nur Referenzen auf const-Objekte vorsieht, wodurch das Kopieren notwendig wird. Ferner erlaubt Osmium::OSM::TagList bzw. Osmium::OSM::Tag keinen Schreibzugriff auf die Tags, daher der etwas mühsame Umweg über die komplette Neuanlage der TagList.