UNPKG

haversine-position

Version:

Convert GPS coordinates into local coordinate system relative to the origin with output of [x, y] in meter, bearing(degree) and distance(m)

375 lines (374 loc) 11 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for haversine.ts</title> <meta charset="utf-8" /> <link rel="stylesheet" href="prettify.css" /> <link rel="stylesheet" href="base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="index.html">All files</a> haversine.ts </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>30/30</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Branches</span> <span class='fraction'>0/0</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>7/7</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>30/30</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">9x</span> <span class="cline-any cline-yes">9x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Util } from './util'; import { GpsPoint } from './gpsPoint'; &nbsp; const wgs84 = require('wgs84'); &nbsp; export class Haversine { private origin: GpsPoint; private R: number; constructor(origin: GpsPoint) { this.R = wgs84.RADIUS; this.origin = origin; } &nbsp; /** * Get the distance of the next point relative to the origin * @param origin the origin gps coordinate * @param next next gps coordinate * @returns distance in meter (m) */ static getDistance(origin: GpsPoint, next: GpsPoint): number { const haversine = new Haversine(origin); &nbsp; return haversine.getDistance(next); } &nbsp; /** * Get the bearing of the next point relative to the origin * @param origin the origin gps coordinate * @param next next gps coordinate * @returns bearing in degree (deg) */ static getBearing(origin: GpsPoint, next: GpsPoint): number { const haversine = new Haversine(origin); &nbsp; return haversine.getBearing(next); } &nbsp; /** * Get the next gps coordinate position relative to the origin * @param origin the origin gps coordinate * @param next the next gps coordinate * @returns [x, y] in meter (m) relative to the origin */ static getPosition(origin: GpsPoint, next: GpsPoint): number { const haversine = new Haversine(origin); &nbsp; return haversine.getPosition(next); } &nbsp; /** * Get the next gps coordinate position relative to the origin * @param next the next gps coordinate * @returns [x, y] in meter (m) relative to the origin */ getPosition(next: GpsPoint): any { const distance = this.getDistance(next); const bearing = this.getBearing(next); &nbsp; const x = distance * Math.sin(Util.toRadian(bearing)); const y = distance * Math.cos(Util.toRadian(bearing)); &nbsp; return [x, y]; } &nbsp; /** * Get the distance of the next point relative to the origin * @param next next gps coordinate * @returns distance in meter (m) */ getDistance(next: GpsPoint): number { const dLat = Util.toRadian(next.lat - this.origin.lat); const dLong = Util.toRadian(next.lng - this.origin.lng); &nbsp; const lat1 = Util.toRadian(this.origin.lat); const lat2 = Util.toRadian(next.lat); &nbsp; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLong/ 2) * Math.sin(dLong / 2) * Math.cos(lat1) * Math.cos(lat2); &nbsp; const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); &nbsp; return this.R * c; } &nbsp; /** * Get the bearing of the next point relative to the origin * @param next next gps coordinate * @returns bearing in degree (deg) */ getBearing(next: GpsPoint): number { const lat1 = Util.toRadian(this.origin.lat); const lat2 = Util.toRadian(next.lat); &nbsp; const long1 = Util.toRadian(this.origin.lng); const long2 = Util.toRadian(next.lng); &nbsp; &nbsp; const y = Math.sin(long2 - long1) * Math.cos(lat2); const x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(long2 - long1); &nbsp; return (Util.toDegree(Math.atan2(y, x)) + 360) % 360; } }</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Mar 31 2017 00:32:43 GMT+0900 (Tokyo Standard Time) </div> </div> <script src="prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="sorter.js"></script> </body> </html>