intersectionByPaths method
calculate the geo point of intersection of two given paths
Implementation
Coordinate? intersectionByPaths(
Coordinate l1, Coordinate l2, num b1, num b2) {
num l1LatRadians = degToRadian(l1.y);
num l1LngRadians = degToRadian(l1.x);
num l2LatRadians = degToRadian(l2.y);
num l2LngRadians = degToRadian(l2.x);
num b1Radians = degToRadian(b1 as double);
num b2Radians = degToRadian(b2 as double);
var latRadiansDiff = l2LatRadians - l1LatRadians;
var lngRadiansDiff = l2LngRadians - l1LngRadians;
num angularDistance = 2 *
math.asin(math.sqrt(
math.sin(latRadiansDiff / 2) * math.sin(latRadiansDiff / 2) +
math.cos(l1LatRadians) *
math.cos(l2LatRadians) *
math.sin(lngRadiansDiff / 2) *
math.sin(lngRadiansDiff / 2)));
if (angularDistance == 0) return null;
num initBearingX = math.acos((math.sin(l2LatRadians) -
math.sin(l1LatRadians) * math.cos(angularDistance)) /
(math.sin(angularDistance) * math.cos(l1LatRadians)));
if (initBearingX.isNaN) initBearingX = 0;
num initBearingY = math.acos((math.sin(l1LatRadians) -
math.sin(l2LatRadians) * math.cos(angularDistance)) /
(math.sin(angularDistance) * math.cos(l2LatRadians)));
var finalBearingX = math.sin(l2LngRadians - l1LngRadians) > 0
? initBearingX
: 2 * _PI - initBearingX;
var finalBearingY = math.sin(l2LngRadians - l1LngRadians) > 0
? 2 * _PI - initBearingY
: initBearingY;
var angle1 = b1Radians - finalBearingX;
var angle2 = finalBearingY - b2Radians;
if (math.sin(angle1) == 0 && math.sin(angle2) == 0) return null;
if (math.sin(angle1) * math.sin(angle2) < 0) return null;
num angle3 = math.acos(-math.cos(angle1) * math.cos(angle2) +
math.sin(angle1) * math.sin(angle2) * math.cos(angularDistance));
num dst13 = math.atan2(
math.sin(angularDistance) * math.sin(angle1) * math.sin(angle2),
math.cos(angle2) + math.cos(angle1) * math.cos(angle3));
num lat3 = math.asin(math.sin(l1LatRadians) * math.cos(dst13) +
math.cos(l1LatRadians) * math.sin(dst13) * math.cos(b1Radians));
num lngRadiansDiff13 = math.atan2(
math.sin(b1Radians) * math.sin(dst13) * math.cos(l1LatRadians),
math.cos(dst13) - math.sin(l1LatRadians) * math.sin(lat3));
var l3LngRadians = l1LngRadians + lngRadiansDiff13;
return Coordinate((radianToDeg(l3LngRadians as double) + 540) % 360 - 180,
radianToDeg(lat3 as double));
}