UNPKG

2.22 kBJavaScriptView Raw
1var getCoord = require('@turf/invariant').getCoord;
2//http://en.wikipedia.org/wiki/Haversine_formula
3//http://www.movable-type.co.uk/scripts/latlong.html
4
5/**
6 * Takes two {@link Point|points} and finds the geographic bearing between them,
7 * i.e. the angle measured in degrees from the north line (0 degrees)
8 *
9 * @name bearing
10 * @param {Feature<Point>} start starting Point
11 * @param {Feature<Point>} end ending Point
12 * @param {boolean} [final=false] calculates the final bearing if true
13 * @returns {number} bearing in decimal degrees, between -180 and 180 degrees (positive clockwise)
14 * @example
15 * var point1 = {
16 * "type": "Feature",
17 * "properties": {},
18 * "geometry": {
19 * "type": "Point",
20 * "coordinates": [-75.343, 39.984]
21 * }
22 * };
23 * var point2 = {
24 * "type": "Feature",
25 * "properties": {},
26 * "geometry": {
27 * "type": "Point",
28 * "coordinates": [-75.534, 39.123]
29 * }
30 * };
31 *
32 * var bearing = turf.bearing(point1, point2);
33 *
34 * //addToMap
35 * var addToMap = [point1, point2]
36 * point1.properties['marker-color'] = '#f00'
37 * point2.properties['marker-color'] = '#0f0'
38 * point1.properties.bearing = bearing
39 */
40
41function bearing(start, end, final) {
42 if (final === true) return calculateFinalBearing(start, end);
43
44 var degrees2radians = Math.PI / 180;
45 var radians2degrees = 180 / Math.PI;
46 var coordinates1 = getCoord(start);
47 var coordinates2 = getCoord(end);
48
49 var lon1 = degrees2radians * coordinates1[0];
50 var lon2 = degrees2radians * coordinates2[0];
51 var lat1 = degrees2radians * coordinates1[1];
52 var lat2 = degrees2radians * coordinates2[1];
53 var a = Math.sin(lon2 - lon1) * Math.cos(lat2);
54 var b = Math.cos(lat1) * Math.sin(lat2) -
55 Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
56
57 var bear = radians2degrees * Math.atan2(a, b);
58
59 return bear;
60}
61
62/**
63 * Calculates Final Bearing
64 * @private
65 * @param {Feature<Point>} start starting Point
66 * @param {Feature<Point>} end ending Point
67 * @returns {number} bearing
68 */
69function calculateFinalBearing(start, end) {
70 // Swap start & end
71 var bear = bearing(end, start);
72 bear = (bear + 180) % 360;
73 return bear;
74}
75
76module.exports = bearing;