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 | *
|
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 | */
|
40 | function 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 | */
|
68 | function calculateFinalBearing(start, end) {
|
69 | // Swap start & end
|
70 | var bear = bearing(end, start);
|
71 | bear = (bear + 180) % 360;
|
72 | return bear;
|
73 | }
|
74 |
|
75 | module.exports = bearing;
|