in modules/validations/crossing_ways.js [80:120]
function isLegitCrossing(tags1, featureType1, tags2, featureType2) {
// assume 0 by default
var level1 = tags1.level || '0';
var level2 = tags2.level || '0';
if (taggedAsIndoor(tags1) && taggedAsIndoor(tags2) && level1 !== level2) {
// assume features don't interact if they're indoor on different levels
return true;
}
// assume 0 by default; don't use way.layer() since we account for structures here
var layer1 = tags1.layer || '0';
var layer2 = tags2.layer || '0';
if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
// crossing bridges must use different layers
if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
} else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
// crossing tunnels must use different layers
if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
} else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
// don't flag crossing waterways and pier/highways
if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
if (featureType1 === 'building' || featureType2 === 'building') {
// for building crossings, different layers are enough
if (layer1 !== layer2) return true;
}
return false;
}