1 | var 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 {Geometry|Feature<Point>|Array<number>} start starting Point
|
11 | * @param {Geometry|Feature<Point>|Array<number>} 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 |
|
41 | function 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 | */
|
69 | function calculateFinalBearing(start, end) {
|
70 | // Swap start & end
|
71 | var bear = bearing(end, start);
|
72 | bear = (bear + 180) % 360;
|
73 | return bear;
|
74 | }
|
75 |
|
76 | module.exports = bearing;
|