in modules/validations/crossing_ways.js [186:271]
function findCrossingsByWay(way1, graph, tree) {
var edgeCrossInfos = [];
if (way1.type !== 'way') return edgeCrossInfos;
var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
if (way1FeatureType === null) return edgeCrossInfos;
var checkedSingleCrossingWays = {};
// declare vars ahead of time to reduce garbage collection
var i, j, nodeIndex;
var extent;
var n1, n2, nA, nB;
var segment1, segment2;
var oneOnly;
var intersected, way2, way2FeatureType, way2Nodes;
var way1Nodes = graph.childNodes(way1);
var comparedWays = {};
for (i = 0; i < way1Nodes.length - 1; i++) {
n1 = way1Nodes[i];
n2 = way1Nodes[i + 1];
extent = geoExtent([
[
Math.min(n1.loc[0], n2.loc[0]),
Math.min(n1.loc[1], n2.loc[1])
],
[
Math.max(n1.loc[0], n2.loc[0]),
Math.max(n1.loc[1], n2.loc[1])
]
]);
intersected = tree.intersects(extent, graph);
for (j = 0; j < intersected.length; j++) {
way2 = intersected[j];
if (way2.type !== 'way') continue;
// don't check for self-intersection in this validation
if (way2.id === way1.id) continue;
// skip if this way was already checked and only one issue is needed
if (checkedSingleCrossingWays[way2.id]) continue;
// mark this way as checked even if there are no crossings
comparedWays[way2.id] = true;
// only check crossing highway, waterway, building, and railway
way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
if (way2FeatureType === null ||
isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
continue;
}
// create only one issue for building crossings
oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
segment1 = [n1.loc, n2.loc];
way2Nodes = graph.childNodes(way2);
for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
nA = way2Nodes[nodeIndex];
nB = way2Nodes[nodeIndex + 1];
if (nA.id === n1.id || nA.id === n2.id ||
nB.id === n1.id || nB.id === n2.id) {
// n1 or n2 is a connection node; skip
continue;
}
segment2 = [nA.loc, nB.loc];
var point = geoLineIntersection(segment1, segment2);
if (point) {
edgeCrossInfos.push({
ways: [way1, way2],
featureTypes: [way1FeatureType, way2FeatureType],
edges: [[n1.id, n2.id], [nA.id, nB.id]],
crossPoint: point
});
if (oneOnly) {
checkedSingleCrossingWays[way2.id] = true;
break;
}
}
}
}
}
return edgeCrossInfos;
}