UNPKG

2.06 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 *
8 * @name bearing
9 * @param {Feature<Point>} start starting Point
10 * @param {Feature<Point>} end ending Point
11 * @param {boolean} [final=false] calculates the final bearing if true
12 * @returns {number} bearing in decimal degrees
13 * @addToMap point1, point2
14 * @example
15 * var point1 = {
16 * "type": "Feature",
17 * "properties": {
18 * "marker-color": '#f00'
19 * },
20 * "geometry": {
21 * "type": "Point",
22 * "coordinates": [-75.343, 39.984]
23 * }
24 * };
25 * var point2 = {
26 * "type": "Feature",
27 * "properties": {
28 * "marker-color": '#0f0'
29 * },
30 * "geometry": {
31 * "type": "Point",
32 * "coordinates": [-75.534, 39.123]
33 * }
34 * };
35 *
36 * var bearing = turf.bearing(point1, point2);
37 * point1.properties.bearing = bearing
38 * //=bearing
39 */
40function bearing(start, end, final) {
41 if (final === true) return calculateFinalBearing(start, end);
42
43 var degrees2radians = Math.PI / 180;
44 var radians2degrees = 180 / Math.PI;
45 var coordinates1 = getCoord(start);
46 var coordinates2 = getCoord(end);
47
48 var lon1 = degrees2radians * coordinates1[0];
49 var lon2 = degrees2radians * coordinates2[0];
50 var lat1 = degrees2radians * coordinates1[1];
51 var lat2 = degrees2radians * coordinates2[1];
52 var a = Math.sin(lon2 - lon1) * Math.cos(lat2);
53 var b = Math.cos(lat1) * Math.sin(lat2) -
54 Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1);
55
56 var bear = radians2degrees * Math.atan2(a, b);
57
58 return bear;
59}
60
61/**
62 * Calculates Final Bearing
63 * @private
64 * @param {Feature<Point>} start starting Point
65 * @param {Feature<Point>} end ending Point
66 * @returns {number} bearing
67 */
68function calculateFinalBearing(start, end) {
69 // Swap start & end
70 var bear = bearing(end, start);
71 bear = (bear + 180) % 360;
72 return bear;
73}
74
75module.exports = bearing;