{{{ #!rule meta { title: "Osmose Validations"; version: "[[revision]]_[[date]]"; description: "Checks for errors based on Osmose tag checks"; author: "Dave Manzer"; watch-modified: true; link: "https://wiki.openstreetmap.org/wiki/Osmose/issues"; } /* not-connected highway/cycleway -- OSMOSE Item 1210 */ /* Set connected_node */ way[highway] node:connection { set connected_node; } /* set nodes in downloaded area */ way[highway] node:in-downloaded-area { set downloaded; } /* set new_feature */ way[highway] node:new { set new_feature; } /* Unconnected Cycleway */ way[highway=cycleway]!:closed!.connected_node.downloaded >[index=1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking], way[highway=cycleway]!:closed!.connected_node.downloaded >[index=-1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking], way[highway=cycleway]!:closed!.connected_node.new_feature >[index=1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking], way[highway=cycleway]!:closed!.connected_node.new_feature >[index=-1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking] { throwWarning: tr("1210: Unconnected Cycleway"); group: "OSMOSE"; } /* Unconnected Road -- Motorway to Residential */ way[highway=~/^(motorway|trunk|primary|secondary|tertiary|unclassified)$/]!:closed!.connected_node.downloaded >[index=-1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking][highway!=turning_circle], way[highway=~/^(motorway|trunk|primary|secondary|tertiary|unclassified)$/]!:closed!.connected_node.downloaded >[index=1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking][highway!=turning_circle], way[highway=~/^(motorway|trunk|primary|secondary|tertiary|unclassified)$/]!:closed!.connected_node.new_feature >[index=-1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking][highway!=turning_circle], way[highway=~/^(motorway|trunk|primary|secondary|tertiary|unclassified)$/]!:closed!.connected_node.new_feature >[index=1] node[noexit!=yes][amenity!=parking_entrance][amenity!=parking][highway!=turning_circle] { throwWarning: tr("1210: Unconnected Highway"); group: "OSMOSE"; } /* 1-member-relation -- OSMOSE Item 1200 */ relation[type] >[index=-1] way { set member; } relation[type] >[index=1].member way { throwWarning: tr("1200: One Member Relation; Check for other members"); group: "OSMOSE"; } /* Bad link highway -- OSMOSE Item 1110 */ /*class 2*/ way[highway*="_link"][eval(waylength()) > 1000] { throwWarning: tr("1110/2: Bad *_link Highway; highway too long for a *_link"); group: "OSMOSE"; } /* Bridge to tag -- OSMOSE Item 7012 */ way[bridge=yes][!/^bridge:/][eval(waylength()) > 500] { throwWarning: tr("7012: Bridge to Tag; bridge deserving of more detail"); group: "OSMOSE"; } /* on junction = roundabout -- OSMOSE Item 4020 */ *[junction=roundabout][oneway] { throwWarning: tr("4020: On junction=roundabout; Unnecessary oneway tag"); group: "OSMOSE"; fixRemove: "oneway"; } *[junction=roundabout][ref] { throwWarning: tr("4020: On junction=roundabout; Unnecessary ref tag"); group: "OSMOSE"; fixRemove: "ref"; } *[junction=roundabout][area] { throwWarning: "tr(4020: On junction=roundabout; Unnecessary area tag"); group: "OSMOSE"; fixRemove: "area"; } /* Oneway -- OSMOSE Item 2030 */ /*-------Class 2-------*/ way[highway] node:connection { set highway_node; } way[junction=roundabout] node.highway_node { set junc_node } /* Typically does not apply node[junction=roundabout] < way[highway][!oneway][eval(waylength()) < 100] { throwError: tr("2030/2: Missing Oneway - Check highway entering/exiting roundabout"); group: tr("OSMOSE"); } */ way[highway][!junction][!oneway][eval(waylength()) < 100] node.junc_node { throwWarning: tr("2030/2 Oneway; Missing Oneway - Check highway entering/exiting roundabout"); group: "OSMOSE"; } /* ----- Class 20301 ------ */ way[cycleway=opposite][!oneway], way[cycleway=opposite_lane][!oneway] { throwWarning: tr("2030/20301 Oneway; Opposite cycleway without oneway"); group: "OSMOSE"; } /* source -- OSMOSE Item 2040 -- administrative boundary does not contain tag source=* */ way[boundary=administrative][!source]{ throwError: tr("2040: Source; administrative boundary does not have source tag"); group: "OSMOSE"; } /* Highway Roundabout OSMOSE Item 3010 */ /* Class 1 -- Wrong highway on roundabout */ /*---------- SET CLASSES ---------- */ way[highway=primary] node:connection, way[highway=primary_link] node:connection { set primary_junc; } way[highway=secondary] node:connection, way[highway=secondary_link] node:connection { set secondary_junc; } way[highway=tertiary] node:connection, way[highway=tertiary_link] node:connection { set tertiary_junc; } /*---------- VALIDATIONS ---------- */ /*Primary*/ way[highway=secondary][junction=roundabout] node:connection.primary_junc, way[highway=tertiary][junction=roundabout] node:connection.primary_junc, way[highway=unclassified][junction=roundabout] node:connection.primary_junc, way[highway=residential][junction=roundabout] node:connection.primary_junc, way[highway=living_street][junction=roundabout] node:connection.primary_junc { throwWarning: tr("3010/1: Highway Roundabout; highway tag on roundabout must match highest level of connected routes"); group: "OSMOSE"; } /*Secondary*/ way[highway=tertiary][junction=roundabout] node:connection.secondary_junc, way[highway=unclassified][junction=roundabout] node:connection.secondary_junc, way[highway=residential][junction=roundabout] node:connection.secondary_junc, way[highway=living_street][junction=roundabout] node:connection.secondary_junc { throwWarning: tr("3010/1: Highway Roundabout; highway tag on roundabout must match highest level of connected routes"); group: "OSMOSE"; } /*Tertiary*/ way[highway=unclassified][junction=roundabout] node:connection.tertiary_junc, way[highway=residential][junction=roundabout] node:connection.tertiary_junc, way[highway=living_street][junction=roundabout] node:connection.tertiary_junc { throwWarning: tr("3010/1: Highway Roundabout; highway tag on roundabout must match highest level of connected routes"); group: "OSMOSE"; } /* Class 4 -- Roundabout crossing */ way[highway][!junction] >[index=-1] node, way[highway][!junction] >[index=1] node { set crossing; } way[highway][junction] >[index=-1] node, way[highway][junction] >[index=1] node { set junc_to_junc; } way[highway][junction=roundabout] node:connection!.crossing!.junc_to_junc { throwWarning: tr("3010/4: Highway Roundabout; highway crossing roundabout without stopping"); group: "OSMOSE"; } }}}