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.
-- 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;
%_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
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);
}
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
iD öffenen.
einen Node (Button “Punkt”) anlegen
Im Suchfeld links “Punkt” eingeben und “Punkt” auswählen, damit keine Objektvorlage verwendet wird.
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.
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.
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.
Sarkasmus Eine Warnung im iD? Wo gibts denn sowas? /Sarkasmus
Deine Idee (“name” überschreiben, wenn nochmal der Key “name” eingetippt wird) halte ich für wirklich gut.
Im Idealfall würde man direkt über dem Feld mit der Fehleingabe so ein kleines Popup setzen, das sinngemäß “Jeder Tag kann nur einmal pro Objekt vergeben werden; bitte erzeuge für jedes reale Objekt ein OSM-Objekt” sagt. Aber das ist schwierig kurz und prägnant zu formulieren, so das es ein newbie versteht.
iD.validate = function(changes, graph) {
var warnings = [];
// https://github.com/openstreetmap/josm/blob/mirror/src/org/
// openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
function tagSuggestsArea(change) {
if (_.isEmpty(change.tags)) return false;
var tags = change.tags;
var presence = ['landuse', 'amenities', 'tourism', 'shop'];
for (var i = 0; i < presence.length; i++) {
if (tags[presence[i]] !== undefined) {
return presence[i] + '=' + tags[presence[i]];
}
}
if (tags.building && tags.building === 'yes') return 'building=yes';
}
if (changes.deleted.length > 100) {
warnings.push({
message: t('validations.many_deletions', { n: changes.deleted.length })
});
}
for (var i = 0; i < changes.created.length; i++) {
var change = changes.created[i],
geometry = change.geometry(graph);
if ((geometry === 'point' || geometry === 'line' || geometry === 'area') && !change.isUsed(graph)) {
warnings.push({
message: t('validations.untagged_' + geometry),
tooltip: t('validations.untagged_' + geometry + '_tooltip'),
entity: change
});
}
var deprecatedTags = change.deprecatedTags();
if (!_.isEmpty(deprecatedTags)) {
warnings.push({
message: t('validations.deprecated_tags', {
tags: iD.util.tagText({ tags: deprecatedTags })
}), entity: change });
}
if (geometry === 'line' && tagSuggestsArea(change)) {
warnings.push({
message: t('validations.tag_suggests_area', {tag: tagSuggestsArea(change)}),
entity: change
});
}
}
return warnings;
};
Kurzfassung: 53 Zeilen “Code”, Warnung wenn mehr als 100 Objekte gelöscht werden sollen, alte Tags verwendet werden oder ein Area-Tag fehlt. Eine weitere Überprüfung wohl auf taglose Objekte?
Ich bin immer wieder überwältigt über die Engstirnigkeit mancher Entwickler.
Gruss
walter
jaja, jetzt kommt: “Bau es doch ein” - nee , mach ich net. Da die “Doku” noch schlimmer ist als bei Josm, hab ich eh kein Chance. Oder seht ihr hier einen einzigen Comment?
Ich habe den Bugreport noch nicht verfasst, sondern wollte erst noch eure Meinungen zu der Thematik abwarten. Den Bugreport werde ich vsl. erst heute spätabends oder morgen verfassen.
herzlichen Dank für Euer Engagement und Gratulation zu Eure tollen Funden beim Festnageln der iD-Problematik – jetzt wissen wir also, wie dieses Übel in die Welt gekommen ist! Ja ja, die schlimmsten Bugs sind oft diejenigen, die als oberschlaue Features gedacht waren …
Bitte entschuldigt, dass ich, obwohl ich diesen Thread hier eröffnet habe, Euch nicht geantwortet habe – zumindest ein paar Dankesworte wären angebracht gewesen! – ich hatte gerade jetzt zuviel anderes zu tun und wollte die Sache erst nochmal selbst in Ruhe in iD ausprobieren (das ich nicht gut kenne), um wirklich zu kapieren, was da vor sich geht.
Man muss diese Schritte übrigens nicht einmal exakt befolgen – iD ist großzügig genug, auf vielen Wegen _1-Tags zu erzeugen :). So kann man z.B. auch ein Node mit einer beliebigen Objektvorlage formatieren (das ist es ja, was Newbies meistens machen werden). Wenn man dann unter “Alle Eigenschaften” einfach einen schon vorhandenen Key nochmals eingibt, hängt iD sein _1, _2 usw. dran. (Z.B.: lege neuen “Punkt” an, wähle Vorlage “Park”, scrolle zu “Alle Eigenschaften”, wo korrekt leisure=park angezeigt wird, tippe dort links erneut leisure ein, springe mit dem Tab nach rechts – voilà, schon benennt iD unser neues leisure in leisure_1 um.)
Ich schließe mich Lösung 2 an, fände es aber wirklich wichtig, dass zuerst eine deutliche Warnung angezeigt wird, bevor die Tags …_1, …_2 etc. verschwinden. Denn: wenn ein Benutzer Tags wie tag=x, tag_1=y verwendet, dann ist ja nicht klar, welcher Wert (x oder y) nun beibehalten werden soll! Ich habe mehrfach Fälle gesehen wie building=yes, building_1=house, in denen offenbar jemand den zuerst eingegebenen Wert verbessern wollte – wenn man building_1=house einfach (stillschweigend bzw. ohne klare Warnung) löschen würde, würde in diesen Fällen gerade der falsche Wert beibehalten. Doch man kann auch nicht umgekehrt einfach den Wert aus tag_1=* in tag=* übertragen. Daher muss der User selbst entscheiden – und deshalb ist eine klare Warnung nötig.
Diese Lösung hätte den großen Vorteil, dass diese _1, _2 etc.-Tags gar nicht erst angelegt würden! Sofort, wenn ich (bei schon vorhandenem *name=**) links erneut name eintippe und den Tab drücke oder irgendwo außerhalb klicke, sollte das Popup erscheinen und das eingetippte name rot o.Ä. markiert und ausgewählt werden; beim nächsten Klick, wenn das Popup verschwindet, würde am besten das eingegebene name gelöscht und der Kursor erneut dort plaziert, als deutliche Aufforderung, einen anderen Wert einzutippen. Das ist aufwändig umzusetzen, wäre aber vielleicht die eleganteste und zugleich penetranteste Lösung, die ganz deutlich werden lässt, dass es nicht so geht :).
Aber schlagt vor, was Ihr für richtig haltet – hauptsache iD hört auf, unsere Daten mit diesem Sch… vollzumüllen und die Leute auf dumme Gedanken zu bringen! Denn, was man nicht vergessen darf: nur ein Teil der _1-Tags wird von iD automatisch erzeugt – ein anderer Teil wird von fortgeschrittenen Newbies angelegt, die eben von iD “gelernt” haben, dass man beliebige Tags mit _1, _2 etc. anlegen kann und sogar soll. Das sind die Folgen dieses dummen Features, und gerade deshalb (weil es sozusagen “die Jugend verdirbt”) halte ich es für einen dicken fetten Bug.
Vielleicht sollte man so etwas (natürlich netter formuliert) auch in den Bug-Report schreiben, damit die iD-Jungs (und Mädels?) kapieren, was sie da anrichten.
Vielen Dank! Kann ich Dich irgendwie unterstützen, z.B. mit einem Kuchen und Kerzen? Im Ernst: wenn es helfen würde, um diesen Blödsinn aus der Welt zu schaffen, backe ich Dir gerne einen Kuchen (soweit meine Künste reichen)! Ich kann ihn Dir per DHL zusenden (dann sollte es aber ein recht stabiler Kuchen werden, nix mit Sahne), oder Du kannst mal in Bad Rappenau vorbeikommen …