geolib
Version:
Library to provide basic geospatial operations like distance calculation, decoding of sexagesimal coordinates etc.
1 lines • 2.43 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _getLatitude=_interopRequireDefault(require("./getLatitude"));var _getLongitude=_interopRequireDefault(require("./getLongitude"));var _toRad=_interopRequireDefault(require("./toRad"));var _constants=require("./constants");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const getDistance=function(start,end){let accuracy=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;accuracy=!isNaN(accuracy)?accuracy:1;const startLat=(0,_getLatitude.default)(start);const startLon=(0,_getLongitude.default)(start);const endLat=(0,_getLatitude.default)(end);const endLon=(0,_getLongitude.default)(end);const b=6356752.314245;const ellipsoidParams=1/298.257223563;const L=(0,_toRad.default)(endLon-startLon);let cosSigma;let sigma;let sinAlpha;let cosSqAlpha;let cos2SigmaM;let sinSigma;const U1=Math.atan((1-ellipsoidParams)*Math.tan((0,_toRad.default)(parseFloat(startLat))));const U2=Math.atan((1-ellipsoidParams)*Math.tan((0,_toRad.default)(parseFloat(endLat))));const sinU1=Math.sin(U1);const cosU1=Math.cos(U1);const sinU2=Math.sin(U2);const cosU2=Math.cos(U2);let lambda=L;let lambdaP;let iterLimit=100;do{const sinLambda=Math.sin(lambda);const cosLambda=Math.cos(lambda);sinSigma=Math.sqrt(cosU2*sinLambda*(cosU2*sinLambda)+(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma===0){return 0}cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;sigma=Math.atan2(sinSigma,cosSigma);sinAlpha=cosU1*cosU2*sinLambda/sinSigma;cosSqAlpha=1-sinAlpha*sinAlpha;cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;if(isNaN(cos2SigmaM)){cos2SigmaM=0}const C=ellipsoidParams/16*cosSqAlpha*(4+ellipsoidParams*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*ellipsoidParams*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)))}while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0);if(iterLimit===0){return NaN}const uSq=cosSqAlpha*(_constants.earthRadius*_constants.earthRadius-b*b)/(b*b);const A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));const B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));const deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));const distance=b*A*(sigma-deltaSigma);return Math.round(distance/accuracy)*accuracy};var _default=exports.default=getDistance;