MapCSS regels voor Nederland (JOSM validator)

Dag allen,

Het leek mij handig om de validatorregels die ik privé heb en welke ook nooit in JOSM terecht zullen komen (omdat ze (nog) niet internationaal geaccepteerd zijn, of op basis van de Nederlandse taal of verkeersborden) een keer openbaar te maken. Deze staan nu allen hier.

Te verkrijgen via: JOSM voorkeuren (F12) → gegevensvalidator → Regels voor tagcontrole → Dutch specific rules → Arrow button

Natuurlijk is elke feedback welkom; net als pull requests of wanneer je toegang wilt om zelf het bestand te bewerken / PR’s goed te keuren. Hopelijk hebben jullie hier iets aan!

Groeten,
Famlam

p.s. de (meeste) resultaten zijn ook te bekijken op Osmose: kaart, lijst

Zeer waardevol! Ga er de komende tijd eens mee aan de slag. Bedankt!

Mooi.

Zou je daar de:
G11 fietspaden, waar een van de nodes een barrier=bollard heeft aan kunnen geven dat op de bollard geen mofa=yes aanwezig is.
G12a brom- fietspaden, waar een van de nodes een barrier=bollard heeft aan kunnen geven dat op de bollard geen mofa=yes moped=yes aanwezig is.

Zo ook andere barrier op de node, waar nodig.

Hmm, ik zou die aan JOSM voorstellen, of deze Osmose check uitbreiden. Dit heeft nl. niet per se met G11/G12a te maken, maar geldt voor elke highway met een bepaalde access-tag=designated/yes en daarop een barrière die een toegangsverbod impliceert of erop heeft. Dus ook onderstaande voorbeelden:

way:
 highway=residential 
 motor_vehicle=no
 mofa=yes
 moped=yes
 bus=yes

met daarop node:
 barrier=bus_trap
 (missend: mofa=yes/moped=yes)

of

way:
 highway=service
 access=destination
 hgv=yes

met daarop node:
 barrier=bollard
 bollard=rising
 (missend: hgv=yes, access=destination)

naast jouw voorbeeld

way:
 highway=cycleway
 mofa=yes
 moped=designated
 traffic_sign=NL:G12a

met daarop node:
 barrier=bollard
 (missend: mofa=yes/moped=yes)

Dat is veel efficiënter en algemener te doen in Java/SQL dan via mapcss vermoed ik. Echter, je zou kunnen suggereren het volgende toe te voegen, om de meeste situaties (inclusief de G11 en G12a) af te vangen:

way[access=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=bollard][!access],
way[vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=bollard][!vehicle][!access],
way[motor_vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!motor_vehicle][!vehicle][!access],
way[agricultural=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!agricultural][!motor_vehicle][!vehicle][!access],
way[bus=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=bollard][!bus][!motor_vehicle][!vehicle][!access],
way[emergency=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!emergency][!motor_vehicle][!vehicle][!access],
way[goods=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!goods][!motor_vehicle][!vehicle][!access],
way[hgv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!hgv][!motor_vehicle][!vehicle][!access],
way[hov=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!hov][!motor_vehicle][!vehicle][!access],
way[mofa=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!mofa][!motor_vehicle][!vehicle][!access],
way[moped=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!moped][!motor_vehicle][!vehicle][!access],
way[motor_cycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!motor_cycle][!motor_vehicle][!vehicle][!access],
way[motorcar=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!motorcar][!motor_vehicle][!vehicle][!access],
way[psv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=bollard][!psv][!motor_vehicle][!vehicle][!access],
way[taxi=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][barrier=~/^(bus_trap|bollard)$/][!taxi][!motor_vehicle][!vehicle][!access] {
  throwWarning: tr("{0} without {1} on a way with {1}=yes/designated/destination", "{0.tag}", "{2.key}");
  group: tr("Inconsistent access");
}
way[access=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/],
way[vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!vehicle],
way[motor_vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!motor_vehicle][!vehicle],
way[foot=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!foot],
way[bicycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!bicycle][!vehicle],
way[horse=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!horse],
way[agricultural=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!agricultural][!motor_vehicle][!vehicle],
way[bus=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!bus][!motor_vehicle][!vehicle],
way[emergency=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!emergency][!motor_vehicle][!vehicle],
way[goods=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!goods][!motor_vehicle][!vehicle],
way[hgv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!hgv][!motor_vehicle][!vehicle],
way[hov=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!hov][!motor_vehicle][!vehicle],
way[mofa=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!mofa][!motor_vehicle][!vehicle],
way[moped=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!moped][!motor_vehicle][!vehicle],
way[motor_cycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!motor_cycle][!motor_vehicle][!vehicle],
way[motorcar=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!motorcar][!motor_vehicle][!vehicle],
way[psv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!psv][!motor_vehicle][!vehicle],
way[taxi=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][access][access=~/^(no|use_sidepath|private)$/][!taxi][!motor_vehicle][!vehicle] {
  throwWarning: tr("{0} without {1} on a way with {1}=yes/designated/destination", "{0.tag}", "{2.key}");
  group: tr("Inconsistent access");
}
way[access=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/],
way[vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/],
way[motor_vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!motor_vehicle],
way[bicycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!bicycle],
way[agricultural=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!agricultural][!motor_vehicle],
way[bus=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!bus][!motor_vehicle],
way[emergency=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!emergency][!motor_vehicle],
way[goods=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!goods][!motor_vehicle],
way[hgv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!hgv][!motor_vehicle],
way[hov=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!hov][!motor_vehicle],
way[mofa=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!mofa][!motor_vehicle],
way[moped=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!moped][!motor_vehicle],
way[motor_cycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!motor_cycle][!motor_vehicle],
way[motorcar=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!motorcar][!motor_vehicle],
way[psv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!psv][!motor_vehicle],
way[taxi=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][vehicle][vehicle=~/^(no|use_sidepath|private)$/][!taxi][!motor_vehicle] {
  throwWarning: tr("{0} without {1} on a way with {1}=yes/designated/destination", "{0.tag}", "{2.key}");
  group: tr("Inconsistent access");
}
way[access=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/],
way[vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/],
way[motor_vehicle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/],
way[agricultural=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!agricultural],
way[bus=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!bus],
way[emergency=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!emergency],
way[goods=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!goods],
way[hgv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!hgv],
way[hov=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!hov],
way[mofa=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!mofa],
way[moped=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!moped],
way[motor_cycle=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!motor_cycle],
way[motorcar=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!motorcar],
way[psv=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!psv],
way[taxi=~/^(yes|designated|destination)$/] >[index!=1][index!=-1] node[barrier][motor_vehicle][motor_vehicle=~/^(no|use_sidepath|private)$/][!taxi] {
  throwWarning: tr("{0} without {1} on a way with {1}=yes/designated/destination", "{0.tag}", "{2.key}");
  group: tr("Inconsistent access");
}

Edit: missende ~ toegevoegd
Edit2: betere waarschuwing

Ik dacht dat het een Nederlandse controle is op basis van de Nederlandse traffic_sign=NL:G12a / traffic_sign=NL:G11, wat dan niet thuis hoort in een algemene controle opzet.

Hmm, ja, maar dat komt door de mofa/moped=* op de weg, wat internationaal (of i.i.g. Europees) gangbaar is, niet per se direct door het verkeersbord. Maar als JOSM een algemene check afwijst, wil ik 'm gerust toevoegen hoor! Of als er veel steun voor is (dus een PR zou handig zijn, dan kunnen mensen een positieve of negatieve review doen dat dit forumtopic op den duur een mengsel van verzoeken wordt. Bij voorkeur op basis van de access tags, niet op basis van de verkeersborden (wat in principe hetzelfde effect zal hebben, maar algemener is).

P.s. met G11 en mofa wordt 't in Amsterdam ook oppassen, met het “snorfietsers op de rijbaan”-beleid

We hebben een Nederlandse preset gemaakt, wat niet iedereen gebruikt, andere kunnen ook traffic_sign=NL:G12a gebruiken.
Na overleg is er voor moped=designated en mofa=designated gekozen, wat op een bepaald tijdstip tot verandering van preset heeft geleid. Voor die tijd staat er meer moped=yes en mofa=yes.
Niet iedereen zet bij een traffic_sign=NL:G12a een moped=designated, maar ook moped=yes, zo ook mofa.
Deze controle is ook een Nederlandse aangelegenheid.

traffic_sign tag geeft wat meer zekerheid wat er op de way zou moeten staan, betreffende access voor de vervoersvormen.
access is een afgeleide van het verkeersbord.

traffic_sign=NL:G12a is herkenbaarder als text of bordicoon, dan de combinatie van access tags, dat is ook de reden dat we een aantal jaren geleden met traffic_sign zijn begonnen. Is dit nu een bromfietspad? Zoekend, selectie, tussen alle tags die mogelijk zijn op een way. Met traffic_sign=NL:G12a meer controleerbaarder.

Ik zou me kunnen voorstellen dat iemand de verkeersborden data neemt NDW, dit vergelijkt of er binnen een bepaalde afstand een way ligt met traffic_sign=NL:G12a en daarna de access bekijkt. Een controle werkwijze.

NL controle en algemene controle zou goed naast elkaar kunnen werken.

Ik snap de relevantie niet helemaal van wat je nu zegt. Immers, als je NL:G12a hebt getagd en geen moped, krijg je sowieso een melding dat je moped moet toevoegen, en daarna triggert de voorgestelde regel. En zonder moped/mofa=yes/designated rijdt er geen enkele moped/mofa op een fietspad, dan maakt de bollard-tagging erop ook niet uit. Dus waarom het per se niet in JOSM moet komen maar selectief aangepast zodat het gelimiteerd is tot NL…?

Klopt, daarom stel ik juist voor dat je het aan de algemene controleregels toe laat voegen. Of desnoods een pull request maakt op Github, ik ben echt niet te beroerd om (niet-controversiële, foutloze) dingen toe te voegen hoor, maar uit eigen initiatief doe ik geen dingen alleen voor NL als je de hele wereld ook blij kunt maken door hetzelfde elders toe te laten voegen op een universele manier :wink:

Cool dat je dit hebt gemaakt, ik ga hem gebruiken!

Ook mooi om te zien dat je dit op Github beschikbaar maakt en open staat voor samenwerking. Als ik nog iets tegen kom qua regels zal ik eens een pull request sturen.

3 posts were split to a new topic: Mofa/moped=no op barrier=bollard

Voor de gebruikers van deze validatorregels voor JOSM, ik heb een foutje gemaakt waardoor een paar steden een stortvloed van meldingen krijgen. De fix is al live, maar als JOSM de lijst al bijgewerkt had, kan het een paar dagen(?)/even duren voor JOSM het opnieuw automatisch bijwerkt.

Excuses hiervoor!

Thanks voor de heads-up. Het werkt ook door in osmose. Ik heb bijv. nu een waslijst van dit soort meldingen op m’n naam staan ineens:

https://osmose.openstreetmap.fr/en/issue/f802f196-11aa-1369-3402-c6751fbda856

Weet je toevallig of die ook weer vanzelf verdwijnen @Famlam?

Ja, ze moeten deze PR accepteren en vervolgens ook live zetten:
Update Josm_DutchSpecific.py by Famlam · Pull Request #2382 · osm-fr/osmose-backend · GitHub

Edit: de fix wordt uitgerold, alles zou over ~24 uur weer goed moeten zijn

1 Like

De regels hebben met al regelmatig geholpen bij foutjes in maxspeed mappen :+1:

Wat denk, ik denk, niet zo is zoals gewenst is is dat highway=footway/path/cycleway + living_street=yes een warning geeft:

Screenshot_20241214_153210

Wat denk, ik denk, niet zo is zoals gewenst is is dat highway=footway/path/cycleway + living_street=yes een warning geeft:

Voor highway=footway is deze regel niet ingeschakeld.

Waarschijnlijk moet ik 'm voor (fiets/ruiter/“algemene”)paden beperken tot paden met moped=yes/designated/...? Ik dacht dat brommers etc namelijk ook maar 15 mochten in een (fietspad binnen een) woonerf? Wat denk jij/denken jullie?

Ja, volgens mij geldt 15 km/h binnen woonerven en 30 km/h binnen 30 km zones ook voor fietsers/brommers etc.

Even gekeken maar (Taginfo-NL heeft op dit moment geen getallen) maar overpass kan vertellen dat inderdaad highway=cycleway met maxspeed is gemapt, zelfs 16 maal met maxspeed=80…

Maar hiervoor heb ik nooit een warning voor gezien maar dat is natuurlijk omdat de validator niet weet of een fietspad binnen een 30 km/h zone is. Er is ook maar een heel beperkt aantal wegbeheerders ook een 30 km zone bord langs een fietspad zetten, zie hier.

Ik heb de “living_street=yes without maxspeed=15”-regel voor (fiets)paden nu beperkt tot paden met moped-toegang. (Voor serviceweggetjes e.d. verandert er niks). Dus voor (fiets)paden met enkel (snor)fiets-toegang komt er geen waarschuwing meer.

Even gekeken maar (Taginfo-NL heeft op dit moment geen getallen) maar overpass kan vertellen dat inderdaad highway=cycleway met maxspeed is gemapt, zelfs 16 maal met maxspeed=80…

Als het goed is zou maxspeed=80 op fietspaden al wel een validatorwaarschuwing op moeten leveren, gezien het een vrij onwaarschijnlijke combi is, zie bijvoorbeeld Way: ‪Waaldijk‬ (‪440084088‬) | OpenStreetMap. Alleen als er bijvoorbeeld motor_vehicle=destination bij staat, dan niet.

1 Like

Dat stukje Waaldijk is naar mijn mening foutief gemapt. De ‘echte’ Waaldijk loopt daarboven over de dijk. Stukje onderlangs heet ook Waaldijk en bestaat uit 2 doodlopende wegen (bord L08 aan beide kanten).
Die 2 wegen zijn over een afstand van 38m met elkaar verbonden via een paadje van 0,50m breed, wel geasfalteerd.
Aan westzijde staan 2 schrikhekken waar je zigzag door heen kunt. Weg oost staat in osm op maxspeed=50 (kan ik me iets bij voorstellen), weg west staat in osm op maxspeed=80 (kan ik me niks bij voorstellen). Staan verder geen borden voor wandelaars of fietsers.
Ik zou dat paadje mappen als highway=path met surface en wandelaars/fietsers op yes, of highway=footway met bicycle=yes. Maxspeed weghalen. En op een node ter plaatse van de schrikhekken een barrier zetten met cycle_barrier ofzo.

1 Like