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:
https://raw.githubusercontent.com/Famlam/OsmMapcssValidationNL/main/netherlands.validator.mapcss

Als jullie denken dat dit bruikbaar is, voeg ik ze toe aan de JOSM webpagina met validatorregels zodat ze in het lijstje komen; voor nu zou je ze toe kunnen voegen via: JOSM voorkeuren (F12) → gegevensvalidator → Regels voor tagcontrole → “+” → voer de URL in → ok → ok
Edit: nu 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

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