Tag-Keys mit _1, _2, ...: neue Syntax, Fehler oder ...?

Liebe erfahrene Mapper,

bei der Suche nach Tippfehlern in Tags mit http://keepright.at/ fällt mir seit einiger Zeit eine neue Mode auf: Tags, deren Key/Schlüssel aus einem geläufigen Wert wie name, amenity, shop, cuisine etc. sowie einem angehängten Suffix _1, _2 etc. besteht (in einem Fall ging das bis _5!).

Das Ergebnis sind Kombinationen wie (Bsp. 1):

name=Gemeindewald
name_1=Communwald

Bzw., etwas interessanter (Bsp. 2):

name=Stetten ob Lontal
name_1=Stetten o. L.
name_2=Stetten Lontal

Oder bei einem Gebäude, das sowohl Kindergarten als auch Grundschule umfasst (Bsp. 3):

amenity=kindergarten
amenity_1=school

Oder an Restaurants (Bsp. 4):

cuisine=italian
cuisine_1=pizza

Oder bei einem Autohändler mit Werkstatt (Bsp. 5):

shop=car
shop_1=car_repair

Oder an einem Punkt, an dem sich offenbar sowohl eine Bank als auch ein Mülleimer befindet (Bsp. 6):

amenity=bench
amenity_1=waste_basket

Oder generell gerne bei Firmen mit mehreren Telefonnummern (Bsp. 7):

phone=...
phone_1=...

Oder, wirklich absurd (Bsp. 8):

building=yes
building_1=house

Ich nenne dies eine “neue Mode”, weil mir früher das Suffix _1, _2 nur beim Tag note=* begegnet ist: manche Mapper haben, wenn ihr Kommentar nicht in das Tag note=* passte, die Fortsetzung des Textes eben in den Tags *note_1=*, note_2= etc. untergebracht.

Nun ist meine Frage an Euch: wie ist diese neue Mode einzuschätzen? Handelt es sich um eine neue generelle Syntax-Regel für die Angabe mehrerer, alternativer Values/Werte für einen Key/Schlüssel? Wenn ja, wurde diese neue Syntax irgendwo diskutiert oder gar definiert? Und wie sieht dann das Verhältnis dieser neuen Syntax-Regel zur alten Regel aus: mehrere, auf dasselbe Objekt zutreffende Werte eines Schlüssels werden durch Semikola getrennt – also z.B. phone=…;… oder cuisine=italian;pizza? Oder handelt es sich schlicht um Fehler? Oder … um was sonst?

Meine bisherige Einschätzung ist, dass diese neue Mode zumindest in vielen Fällen als Anfängerfehler anzusehen ist. (Ich sage “Anfängerfehler”, weil die meisten dieser Tags von Mappern mit eher wenigen Changesets und meist mit dem Editor iD eingegeben wurden.)

Das gilt ganz klar in Fällen wie Beispiel (8): da house ein genauerer Wert für building=* ist als yes, sind die beiden Tags natürlich zu building=house zusammenzuführen.

Ähnlich klar sind Beispiele wie (1), wo der alternative Name entweder als alt_name=* oder, wenn möglich, semantisch aussagekräftiger als *old_name=, local_name= oder official_name= zu taggen ist – all diese Tags haben ja eine klare Bedeutung und sind daher weit aussagekräftiger als *name_1=**. Dasselbe dürfte wohl auch für Beispiel (2) gelten, bei dem die Zuordnung zu alt_name und official_name nur etwas schwieriger ist (notfalls bleibt aber immer noch die Semikolon-Syntax: alt_name=Stetten o. L.;Stetten Lontal).

Beispiel (6) würde ich ebenfalls als klaren Fehler ansehen: eine Bank und ein Mülleimer sollten als separate Objekte gemappt und getaggt werden, schon damit klar ist, worauf etwaige weitere Attribut wie material=* zutreffen. (Woher weiß ich sonst, ob die Bank oder der Mülleimer aus dem angegebenen Material ist? Eine Angabe mit material_1=, material_2=, bei der dann die Suffix-Ziffern mit denen von amenity_1=, amenity_2= übereinstimmen müssten, wäre m.E. keine Lösung, sondern monströs.)

Für Fälle wie Beispiel (4) und (7) haben wir bisher die Semikolon-Syntax benutzt, sprich, ich würde sie (falls die Angabe der alternativen Werte hier überhaupt sinnvoll ist!) als cuisine=italian;pizza bzw. phone=…;… taggen. Tools wie tagwatch zeigen ja, dass die Verwendung der Semikolon-Syntax in diesen Fällen gut etabliert ist.

Einige Instanzen dieser Fälle habe ich daher, wo sie mir über den Weg liefen (v.a. in Baden-Württemberg und angrenzenden Gebieten), gleich entsprechend geändert. Ich hoffe, ich war nicht zu voreilig; aber Dinge wie in Beispiel (1) und (8) scheinen mir einfach Fehler zu sein.

Die übrigen Fälle sind schwieriger, auch bei ihnen kann man aber, wenn überhaupt, die Semikolon-Syntax benutzen, um mehrere alternative Werte anzugeben, oder die Tags auf getrennte Objekte verteilen.

Ich sehe daher schlicht keine Notwendigkeit, eine neue Syntax einzuführen. Und während man neue konkrete Tags jederzeit einführen und definieren kann (OSM hat ja keine vorgegebene Ontologie), wäre ich mit dem Einführen neuer Syntax-Regeln vorsichtiger: eine der Stärken des Tagging-Modells von OSM ist m.E. gerade seine Einfachheit.

Ich frage mich insbesondere, ob die Angabe mit _1 etc. nicht schwieriger auszuwerten ist als die Semikolon-Syntax. Wenn ein auswertendes Programm auf einen Tag-Wert trifft, der ein oder mehrere ‘;’ enthält, muss es den Wert eben an ‘;’ splitten; das ist sehr einfach. Alle alternativen Werte bleiben so auf jeden Fall zusammen. Die “neue Syntax” mit Suffixen würde es dagegen nötig machen, zuerst alle Tags, deren Schlüssel vor dem Suffix übereinstimmt, zusammenzusuchen, und erst dann über die Anzeige zu entscheiden. Das ist nicht ganz so trivial. Denn was hindert einen fidelen Mapper daran (wenn sich diese neue Syntax etablieren sollte) Kombinationen wie

name=Stetten
name_1001=Stetten a.H.
name_7=Stetten am Heuchelberg

anzuwenden? Um dergleichen zu verhindern, müsste die “neue” Syntax schon sehr genau definiert werden …

(Fälle wie Bsp. (8), das ja wirklich absurd aussieht, haben mich übrigens auf den Gedanken gebracht, ob hinter diesen Fällen einfach ein Software-Fehler in iD steckt, das den alten Wert von building=* nicht geändert, sondern den neuen Wert unter building_1=* gespeichert hat. Ich habe ein bisschen den Eindruck, dass ein solcher Fehler in einer oder mehreren iD-Versionen zwischen 1.4 und 1.6 vielleicht überhaupt erst dazu geführt hat, dass die _1-Suffixe so populär geworden sind. Weiß jemand zufällig, ob es einen solchen Fehler in iD gegeben hat?)

Kurz und gut: was haltet Ihr von dieser neuen Mode? Soll man sie akzeptieren (also eine neue Syntax definieren), soll sie die alte Semikolon-Syntax gar ersetzen, oder handelt es sich um eine lässliche Variante, die man also nicht übernehmen, aber auch nicht ändern sollte, oder wollen wir sie (in den meisten Fällen) als Fehler behandeln und die entsprechenden Tags, wo wir über sie stolpern, ändern?

Viele Grüße und vielen Dank im Voraus für Eure Meinung –

Chrysopras

PS: Sorry für den langen Post, aber ich fand es wichtig, die Angelegenheit möglichst genau darzustellen :wink:

Nix, aber auch garnix.

Das läuft auf variable (unbestimmte) Keys hinaus und diese sind im Gegensatz zu variablen Values sehr schwer auszuwerten. Bequeme Eingabe, extrem schwierige Auswertung.

Kenne iD nicht: Könnte das eventuell eine Änderung dort sein? Irgendwas, was uns die Entwickler untergejubelt haben?

Gruss
walter

@ wambacher/Walter:
Danke für Deine schnelle und sehr klare Antwort!

Gibt es noch andere Meinungen? Zustimmung, Widerspruch, Anmerkungen? Hm, meine allzu detaillierte Beschreibung des Problems hat wohl eher abschreckend auf die Mitwirkung am Meinungsbild gewirkt … :frowning:

Falls sich jemand fragt, ob diese Geschichte überhaupt wichtig ist: Overpass Turbo fördert auf Wunsch allerhand Treffer für name_1, amenity_1, phone_1 und Co. zu Tage, jedenfalls in D/CH. Es wären zumindest in Südwestdeutschland noch deutlich mehr, wenn ich nicht einige besonders klare Fälle bereits (*) beseitigt hätte :slight_smile:

Viele Grüße, Chrysopras

(*) Bevor mir klar wurde, dass es sich um ein systematisches Problem handelt, sodass man es hier mal diskutieren sollte.

Jemand Lust auf Keys wie destination:13=*? http://overpass-turbo.eu/s/8Rx :confused:

Ein (kleines) Problem, dass ich in diesem Zusammenhang sehe, ist die Beschränkung der Länge von Tags auf 255 Zeichen. Bei großen Wegweisern kann das schonmal eng werden.

Ich hab keine Probleme mit Wegweisern. Routing-Software braucht die nicht und ich erfasse die nicht.

Gut, dann habe ich auch keine Probleme mit “cuisine_1”. Ich erfasse die nicht und ich brauche die nicht. :roll_eyes:

Routing-Software braucht sie nicht, aber Routing-Software-User profitieren davon. Und als Wanderer weiß ich auch gerne, welchem Wegweiser ich folgen muss ohne ständig auf die Karte schauen zu müssen.

Ich muss mich sehr anstrengen um einen Anwendungsfall zu finden (sprich: ich hab noch keinen gefunden), in dem name_1 notwendig ist.

Auch wenns der Unterschied zwischen Pest und Cholera ist, finde ich alt_name=Erstername;Zweitername besser als alt_name_1=Erstername, alt_name_2=Zweitername, denn im Semikolon-Fall muss ich nur einen Key auswerten und am Semikolon splitten, im zweiten Fall muss ich irgendwelche Logik wie

if key exists "alt_name_1" then ... ;
if key exists "alt_name_2" then ...;
// undsoweiter

implementieren. Das ist nicht KISS.

Ich sehe kein Problem mit note_1, note_2 etc., da dort ja (hoffentlich) keine Attribute drin stecken.

Bei allen “echten” tags halte ich aufzählende Varianten wie _1, _2, aber auch :1, :2 ebenfalls für problematisch.
Dafür gibt es ja “;”.
So ist es auch im Wiki für den key “destination” beschrieben, also nicht destination_2 oder destination:2.

Die Subtags sollten echten Untereigenschaften wie source:geometry vorbehalten bleiben oder es sollten nur etablierte Varianten wie old_name, local_name verwendet werden.

Finde ich auch nicht gut. Allerdings könnte man so natürlich auch vielleicht das ein oder andere Problem lösen. Bspw. mit

amenity=school
amenity_1=kindergarten
name=Grundschule XY
name_1=AB-Kindergarten

+1

Ein Tag mit _1 ist einfach ein anderes, undefiniertes Tag, das niemand auswertet. Doppelt schlecht weil

  • Inhalt von frei erfundenem Tag ist unzugänglich
  • sehr schlechtes Schema weil extrem schwer auszuwerten

bye
Nop

Dito.

Hallo Chrysopras,

könntest du ein paar Beispiele (Changeset- oder Node-/Way-IDs) nennen, damit man sich das mal mit Achavi anschauen kann? Vielleicht kann man dann durch gezieltes Mergen von Objekten in iD den Bug reproduzieren.

Sollte das ein absichtliches Feature von iD sein, dann bestätigt das mein Bild der iD-Entwickler.

Viele Grüße

Michael

Hier eine längere Diskussion dazu in talk.

Hier mal eine zufällige Auswertung der POI:



 -- Beispiel einer Abfrage
select * from (
   select osm_id,skeys(tags) "key"
     from planet_osm_point limit 100000000
   ) tags 
where key like '%\_3'
order by osm_id;

  osm_id   |           key           
------------+-------------------------
  501454437 | alt_name_1
  501518801 | alt_name_1
  501519345 | alt_name_1
 1096391136 | alt_name_1
 1538882779 | highway_1
 1562369220 | amenity_1
 2312676153 | website_1
 2312676153 | shop_1
 2754996975 | cuisine_1
 2756001790 | email_1
 2826218483 | name_1
 3049300115 | name_1
 3053351433 | fire_hydrant:position_1
 3124416274 | inscription_1
 3293164669 | shop_1
 3294569636 | shop_1
 3325205294 | historic_1
 3334330742 | alt_name_1
 3343587614 | historic_1
 3399326431 | public_transport_1
 3399326438 | public_transport_1
 3400211945 | name_1
 3400211946 | name_1
 3400508828 | phone_1
 3413066740 | highway_1
 3415858965 | highway_1
 3415858966 | highway_1
 3415873411 | shop_1
 3433367130 | cuisine_1
(29 Zeilen)

   osm_id   |              key               
------------+--------------------------------
   86002384 | name_2
  424298019 | country_code_iso3166_1_alpha_2
 2479805447 | note_2
 2746287284 | phone_2
 3035532659 | name_2
 3056956365 | alt_name_2
 3353704076 | alt_name_2
 3458015761 | name_2
(8 Zeilen)

   osm_id   |      key      
------------+---------------
   26608622 | name_3
   26608799 | name_3
   26608892 | name_3
   29907324 | name_3
   44998843 | alt_name_3
  318156802 | url_3
  501264779 | alt_name_3
  501411625 | alt_name_3
  501450705 | alt_name_3
  538190758 | ref_3
  538283595 | ref_3
  538292790 | ref_3
  857474778 | inscription_3
 1405220443 | name_3
 1606236757 | field_3
 1606236758 | field_3
 1606236759 | field_3
 1606236760 | field_3
 1606236766 | field_3
 1739119083 | description_3
 2037291057 | Doctor_3
 2074694277 | image_3
 2123443833 | leisure_3
 2129660694 | alt_name_3
 2189951896 | alt_name_3
 2565033190 | note_3
 2565131821 | note_3
 2565150429 | note_3
 2569766698 | inscription_3
 2569766724 | inscription_3
 2576028073 | note_3
 2879593532 | name_3
 2885341038 | source_3
 2973222270 | phone_3
 2999520670 | amenity_3
 2999520670 | shop_3
 3023074972 | alt_name_3
 3025479896 | name_3
 3059124627 | sport_3
 3085823200 | Doctor_3
 3085833328 | Doctor_3
 3145759297 | source_3
 3215726369 | name_3
 3241127149 | name_3
 3257065341 | object_3
 3265513124 | website_3
 3282593487 | alt_name_3
 3283272336 | note_3
 3302317973 | website_3
 3304283861 | amenity_3
 3312097227 | cuisine_3
 3337030493 | website_3
 3355807321 | name_3
 3385717144 | addr:street_3
 3396913308 | website_3
 3408511027 | name_3
 3409392953 | inscription_3
 3413212933 | amenity_3
 3413452046 | inscription_3
 3429829064 | name_3
(60 Zeilen)

%_1 in 1 Mio, %_2 in 10 Mio und %_3 in 100 Mio zufällig ausgewählter Tags, weil allzu häufig sind die wohl nicht.
Eine Auswertung über alle Tags würde “etwas länger” brauchen, ist aber natürlich machbar. Nur fragen.
Gruss
walter

Wenn ich sowas wie http://www.openstreetmap.org/way/253224206 sehe, dann weiss ich, wieso ich gegen das “_n”-Schema bin.

Die einzelnen Adressen gehören an die Eingänge. Wenn man dann will, kann man eine Site-Relation für das “Quartier 17” einbauen. Aber mit addr:street_3 wird kein Router was anfangen können…

Ich schaue mir gerade die name_1=* in Deutschland an. Sie stammen meist (nicht immer von iD-Usern). Entweder ist das ein übler versteckter, nicht beabsichtigter Bug von iD oder die User haben das absichtlich eingegeben.

Wieso denn so optimistisch? Das könnte auch Absicht (in iD) sein, da einen Bug, der an das, was der Anwender eingibt, einfach _N dranhängt, ist mir schwer vorstellbar.
Ich schau mir mal die Sourcen an.

Gruss
walter

Bingo: In iD/js/id/ui/raw_tag_editor.js gibt es eine Funktion, die wohl genau sowas macht.


        function keyChange(d) {
            var kOld = d.key,
                kNew = this.value.trim(),
                tag = {};

            if (kNew && kNew !== kOld) {
                var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
                    base = match[1],
                    suffix = +(match[2] || 1);
                while (tags[kNew]) {  // rename key if already in use
                    kNew = base + '_' + suffix++;                                  // <-----------  da
                }
            }
            tag[kOld] = undefined;
            tag[kNew] = d.value;
            d.key = kNew; // Maintain DOM identity through the subsequent update.
            this.value = kNew;
            event.change(tag);
        }

Hallo,

Ich habe den Bug jetzt reproduzieren können. In der folgenden Anleitung lernt ihr, wie ihr einen Node anlegen könnt, der eine doppelte Ampel ist.

highway=traffic_signals
highway_1=traffic_signals
  1. iD öffenen.
  2. einen Node (Button “Punkt”) anlegen
  3. Im Suchfeld links “Punkt” eingeben und “Punkt” auswählen, damit keine Objektvorlage verwendet wird.
  4. Unter “Alle Eigenschaften” einen Key eintragen (z.B. “highway”), mit TAB quittieren, damit der Cursor in das Value-Feld springt. Dort den Value, z.B. “traffic_signals” eintragen. Die Autovervollständigung sollte verwendet werden. Auch hier mit TAB quittieren, damit der Cursor in die nächste Zeile (Key-Feld) springt.
  5. Nun erneut “highway” eintragen und wie bei Schritt 4 einen Value eintragen (mit TAB springen). Habt ihr es gesehen? So kommt ein key_1 zustande.

Jetzt ist mir auch klar, warum Newbies, von denen ich nicht erwarte, dass sie im Wiki nach einem Tagging für zwei Namen suchen, name_1 usw. verwenden. Sie geben einen Namen ein und geben, weil sie nicht wissen, dass Keys bloß einmal pro Objekt erlaubt sind, erneut den Key ein. iD macht daraus ein name_1 und perfekt ist der Quark.

Jetzt guck ich mal in den Bugtracker und melde es ggf. Wahrscheinlich werde ich aber auch eine Torte backen und eine Kerze anzünden müssen. :slight_smile:

Viele Grüße

Michael

Hat sich überschnitten. Das ist kein Bug - das ist ein Feature. Siehe meinen vorherigen Beitrag.

Gruss
walter

Ja, es ist ein Feature. Danke für den Blick in den Code. Aber es ist ein IMHO bescheuertes Feature.

JOSM löst das anders. Wenn ein Objekt schon name=* hat und ich bei der Tag-Eingabe wieder “name” eingebe, wird kein “name” vorgeschlagen, sondern alles andere, was mit “name” beginnt, z.B. “name:de”.

In iD wäre das zu lösen, indem man entweder wie JOSM agiert oder vor oder nach der Eingabe des Values dem User eine Warnung anzeigt und spätestens beim Wechsel zum nächsten Tag die Fehleingabe, die derzeit als name_1 gespeichert werden würde, sich in Luft auflöst. Ich würde Lösung 2 bevorzugen, da Lösung 1 für einen Newbie-Editor Risiken bzgl. der Datenqualität birgt. Wenn dem User, der einen Zweitnamen eingeben will, “name:de” präsentiert wird, dann tippt der eben blind und unwissend, wie er ist, den Zweitnamen bei name:de ein.