x

MkgMap: Vergleich Inhalt von zwei Tags (name und name:de)


  1. MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 18.05.2013 08:30 · [flux]

    Hallo,

    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?

    Gruß, Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · aighes (Gast) · 18.05.2013 08:51 · [flux]

      Wenn du die Adresssuche nutzt kannst du folgendes machen:

      name=*␣&␣name:de=*␣&␣mkgmap:country!=DEU␣{␣set␣name='${name}␣(${name:de})'␣}
      

    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · chris66 (Gast) · 18.05.2013 08:55 · [flux]

      Eventuell ist die name-tag-list Option dafür gedacht?


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · aighes (Gast) · 18.05.2013 09:02 · [flux]

      Bei name-tag-list kommt am Ende nur ein name raus. Da würde dann aus einem gewünschten Lisboa (Lissabon) ein einfaches Lissabon.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 18.05.2013 09:18 · [flux]

      aighes wrote:

      Wenn du die Adresssuche nutzt kannst du folgendes machen:

      name=*␣&␣name:de=*␣&␣mkgmap:country!=DEU␣{␣set␣name='${name}␣(${name:de})'␣}
      

      Danke, die Adresssuche nutze ich bislang nicht. Somit funktioniert es so auch leider nicht.

      Was ist eigentlich falsch an

      name␣!=␣'${name:de}'␣{␣set␣name='${name}␣(${name:de})'␣}
      

      (MkgMap meckert bei der Anweisung nicht)

      Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · aighes (Gast) · 18.05.2013 09:25 · [flux]

      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)


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 18.05.2013 09:59 · [flux]

      aighes wrote:

      ...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)

      Ok, hab mal was gemailt. Mal sehen, was rauskommt. Danke für den Tipp.

      Bin etwas verwundert, dass es die Möglichkeit eines Tag-Vergleichs nicht gibt. Eventuell hat hier noch jemand eine Idee?

      Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 23.05.2013 09:08 · [flux]

      Bislang kein Feedback von mkgmap-dev.

      Habe mittlerweilen versucht, mein Problem anderweitig zu lösen. Leider ohne Erfolg. Eventuell kann mir hier jemand von den "Spezialisten" helfen?

      Gruß, Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · couchmapper (Gast) · 23.05.2013 09:46 · [flux]

      softcake wrote:

      Habe mittlerweilen versucht, mein Problem anderweitig zu lösen. Leider ohne Erfolg. Eventuell kann mir hier jemand von den "Spezialisten" helfen?

      Kein "Spezialist" hier, sorry, aber hast Du mal eine Vorverarbeitung der .pbf-Dateien mit osmium probiert? Soll wohl mit C++ oder Javascript klappen:

      If you want to generate maps for specific languages, you have to look at several different tags to decide which name you want to use for labelling: "name", "name:LANGUAGE", "local_name", etc. Depending on what you want to do exactly, you might prefer one of the other name, etc.

      http://wiki.openstreetmap.org/wiki/Osmium

      Edit: Klappt nur mit C++


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 23.05.2013 10:22 · [flux]

      Hi couchmapper,

      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.

      Danke & Gruß, Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · couchmapper (Gast) · 23.05.2013 10:24 · [flux]

      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.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · Oli-Wan (Gast) · 23.05.2013 10:56 · [flux]

      couchmapper wrote:

      Kein "Spezialist" hier, sorry, aber hast Du mal eine Vorverarbeitung der .pbf-Dateien mit osmium probiert?

      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:

      #define␣OSMIUM_WITH_PBF_INPUT
      #include␣<osmium.hpp>
      #include␣<osmium/input/pbf.hpp>
      #include␣<osmium/output.hpp>
      #include␣<osmium/output/pbf.hpp>
      
      template␣<class␣THandler>␣class␣JoinNameTagsHandler␣:␣public␣Osmium::Handler::Forward<THandler>␣{
      public:
      void␣joinNameTags␣(Osmium::OSM::TagList&␣t)␣{
      if␣(t.get_value_by_key␣("name")␣&&␣t.get_value_by_key␣("name:de")
      &&␣strcmp␣(t.get_value_by_key␣("name"),␣t.get_value_by_key␣("name:de")))␣{
      Osmium::OSM::TagList␣newTagList;
      std::string␣name␣=␣std::string␣(t.get_value_by_key␣("name:de"))
      +␣std::string␣("␣(")␣+␣std::string␣(t.get_value_by_key␣("name"))␣+␣std::string␣(")");
      newTagList.add␣("name",␣name.c_str␣());
      for␣(Osmium::OSM::TagList::const_iterator␣i␣=␣t.begin␣();␣i␣!=␣t.end␣();␣++i)␣{
      if␣(strcmp␣(i->key(),␣"name")␣&&␣strcmp␣(i->key(),␣"name:de"))
      newTagList.add␣(i->key␣(),␣i->value␣());
      }
      t.clear();
      t␣=␣newTagList;
      }
      }
      void␣node␣(const␣shared_ptr<Osmium::OSM::Node>&␣node)␣{
      shared_ptr<Osmium::OSM::Node>␣copy␣(new␣Osmium::OSM::Node␣(*node));
      joinNameTags␣(copy->tags␣());
      Osmium::Handler::Forward<THandler>::node␣(copy);
      }
      void␣way␣(const␣shared_ptr<Osmium::OSM::Way>&␣way)␣{
      shared_ptr<Osmium::OSM::Way>␣copy␣(new␣Osmium::OSM::Way␣(*way));
      joinNameTags␣(copy->tags␣());
      Osmium::Handler::Forward<THandler>::way␣(copy);
      }
      void␣relation␣(const␣shared_ptr<Osmium::OSM::Relation>&␣relation)␣{
      shared_ptr<Osmium::OSM::Relation>␣copy␣(new␣Osmium::OSM::Relation␣(*relation));
      joinNameTags␣(copy->tags␣());
      Osmium::Handler::Forward<THandler>::relation␣(copy);
      }
      JoinNameTagsHandler<THandler>␣(THandler&␣next)␣:␣Osmium::Handler::Forward<THandler>␣(next)␣{}
      };
      
      int␣main␣(void)␣{
      Osmium::OSMFile␣infile;
      Osmium::OSMFile␣outfile;
      infile.set_type_and_encoding␣("pbf");
      outfile.set_type_and_encoding␣("pbf");
      Osmium::Output::Handler␣out␣(outfile);
      JoinNameTagsHandler<Osmium::Output::Handler>␣h␣(out);
      Osmium::Input::read␣(infile,␣h);
      return␣0;
      }
      

      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.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 23.05.2013 13:07 · [flux]

      Oli-Wan wrote:

      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.

      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...

      Gruß, Thomas


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · couchmapper (Gast) · 23.05.2013 13:11 · [flux]

      softcake wrote:

      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...

      Das ganze als Javascript mit osmjs wäre cool, das würde bestimmt vielen Leuten weiterhelfen, die sich mit C/C++ eher die Finger brechen.

      -> klappt leider nicht, nur CSV und Shapefile werden als Export aus Javascript heraus unterstützt.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · Oli-Wan (Gast) · 23.05.2013 13:34 · [flux]

      softcake wrote:

      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.

      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.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · quasilotte (Gast) · 23.05.2013 14:35 · [flux]

      Fehlpost


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · aighes (Gast) · 23.05.2013 15:47 · [flux]

      softcake wrote:

      Mir wird wohl nichts anderes übrig bleiben, als mich in die osmium-Thematik einzuarbeiten. Das Wetter ist ja eh gerade bescheiden...

      Da halte ich das Nutzen der Adresssuche für deutlich einfacher.
      Herunterladen von den vorgerechneten Grenzen.

      location-autofill=is_in,nearest
      index
      bounds=./data/bounds.zip
      

      Obige 3 Parameter hinzufügen und die zusätzlichen Zeilen für den Style aus dem default-style kopieren und dann siehe #2. Aber das musst du wissen.


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · softcake (Gast) · 24.05.2013 07:42 · [flux]

      aighes wrote:

      Da halte ich das Nutzen der Adresssuche für deutlich einfacher.
      Herunterladen von den vorgerechneten Grenzen.

      location-autofill=is_in,nearest
      index
      bounds=./data/bounds.zip
      

      Obige 3 Parameter hinzufügen und die zusätzlichen Zeilen für den Style aus dem default-style kopieren und dann siehe #2. Aber das musst du wissen.

      Klingt erst mal einfacher und weniger zeitintensiv.

      Mal dumm gefragt: Woher bekomme ich die bounds.zip?


    • Re: MkgMap: Vergleich Inhalt von zwei Tags (name und name:de) · aighes (Gast) · 24.05.2013 08:45 · [flux]

      Beispielsweise von dort: http://www.navmaps.eu/boundaries