in modules/validations/crossing_ways.js [130:203]
function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) {
var featureType1 = getFeatureType(entity1, graph);
var featureType2 = getFeatureType(entity2, graph);
var geometry1 = entity1.geometry(graph);
var geometry2 = entity2.geometry(graph);
var bothLines = geometry1 === 'line' && geometry2 === 'line';
if (featureType1 === featureType2) {
if (featureType1 === 'highway') {
var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
// one feature is a path but not both
var roadFeature = entity1IsPath ? entity2 : entity1;
if (nonCrossingHighways[roadFeature.tags.highway]) {
// don't mark path connections with certain roads as crossings
return {};
}
var pathFeature = entity1IsPath ? entity1 : entity2;
if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
// if the path is a crossing, match the crossing type
return bothLines ? { highway: 'crossing', crossing: pathFeature.tags.crossing } : {};
}
// don't add a `crossing` subtag to ambiguous crossings
return bothLines ? { highway: 'crossing' } : {};
}
return {};
}
if (featureType1 === 'waterway') return {};
if (featureType1 === 'railway') return {};
} else {
var featureTypes = [featureType1, featureType2];
if (featureTypes.indexOf('highway') !== -1) {
if (featureTypes.indexOf('railway') !== -1) {
if (!bothLines) return {};
var isTram = entity1.tags.railway === 'tram' || entity2.tags.railway === 'tram';
if (osmPathHighwayTagValues[entity1.tags.highway] ||
osmPathHighwayTagValues[entity2.tags.highway]) {
// path-tram connections use this tag
if (isTram) return { railway: 'tram_crossing' };
// other path-rail connections use this tag
return { railway: 'crossing' };
} else {
// path-tram connections use this tag
if (isTram) return { railway: 'tram_level_crossing' };
// other road-rail connections use this tag
return { railway: 'level_crossing' };
}
}
if (featureTypes.indexOf('waterway') !== -1) {
// do not allow fords on structures
if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
if (highwaysDisallowingFords[entity1.tags.highway] ||
highwaysDisallowingFords[entity2.tags.highway]) {
// do not allow fords on major highways
return null;
}
return bothLines ? { ford: 'yes' } : {};
}
}
}
return null;
}