UNPKG

geolib

Version:

Library to provide basic geospatial operations like distance calculation, decoding of sexagesimal coordinates etc.

1 lines 9.96 kB
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.geolib=e():t.geolib=e()}(this,()=>(()=>{"use strict";var t={d:(e,n)=>{for(var a in n)t.o(n,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{DEG_TO_RAD:()=>u,MAXLAT:()=>i,MAXLON:()=>s,MINLAT:()=>r,MINLON:()=>o,RAD_TO_DEG:()=>l,altitudeKeys:()=>d,areaConversion:()=>m,computeDestinationPoint:()=>D,convertArea:()=>F,convertDistance:()=>C,convertSpeed:()=>k,decimalToSexagesimal:()=>j,distanceConversion:()=>g,earthRadius:()=>a,findNearest:()=>B,getAreaOfPolygon:()=>X,getBounds:()=>$,getBoundsOfDistance:()=>_,getCenter:()=>G,getCenterOfBounds:()=>K,getCompassDirection:()=>Z,getCoordinateKey:()=>f,getCoordinateKeys:()=>y,getDistance:()=>R,getDistanceFromLine:()=>V,getGreatCircleBearing:()=>z,getLatitude:()=>W,getLongitude:()=>I,getPathLength:()=>H,getPreciseDistance:()=>J,getRhumbLineBearing:()=>Y,getRoughCompassDirection:()=>Q,getSpeed:()=>U,isDecimal:()=>p,isPointInLine:()=>tt,isPointInPolygon:()=>et,isPointNearLine:()=>nt,isPointWithinRadius:()=>at,isSexagesimal:()=>N,isValidCoordinate:()=>P,isValidLatitude:()=>L,isValidLongitude:()=>E,latitudeKeys:()=>h,longitudeKeys:()=>c,orderByDistance:()=>q,sexagesimalPattern:()=>n,sexagesimalToDecimal:()=>v,timeConversion:()=>M,toDecimal:()=>w,toDeg:()=>A,toRad:()=>O,wktToPolygon:()=>rt});const n=/^([0-9]{1,3})°\s*([0-9]{1,3}(?:\.(?:[0-9]{1,}))?)['′]\s*(([0-9]{1,3}(\.([0-9]{1,}))?)["″]\s*)?([NEOSW]?)$/,a=6378137,r=-90,i=90,o=-180,s=180,u=Math.PI/180,l=180/Math.PI,c=["lng","lon","longitude",0],h=["lat","latitude",1],d=["alt","altitude","elevation","elev",2],g={m:1,km:.001,cm:100,mm:1e3,mi:1/1609.344,sm:1/1852.216,ft:100/30.48,in:100/2.54,yd:1/.9144},M={m:60,h:3600,d:86400},m={m2:1,km2:1e-6,ha:1e-4,a:.01,ft2:10.763911,yd2:1.19599,in2:1550.0031};m.sqm=m.m2,m.sqkm=m.km2,m.sqft=m.ft2,m.sqyd=m.yd2,m.sqin=m.in2;const f=(t,e)=>{if(null==t)throw new Error(`'${t}' is no valid coordinate.`);return e.reduce((e,n)=>Object.prototype.hasOwnProperty.call(t,n)&&void 0!==n&&void 0===e?(e=n,n):e,void 0)},p=t=>{const e=t.toString().trim();return!isNaN(parseFloat(e))&&parseFloat(e)===Number(e)},N=t=>n.test(t.toString().trim()),v=t=>{const e=new RegExp(n).exec(t.toString().trim());if(null===e)throw new Error("Given value is not in sexagesimal format");const a=Number(e[2])/60||0,r=Number(e[4])/3600||0,i=parseFloat(e[1])+a+r;return["S","W"].includes(e[7])?-i:i},y=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{longitude:c,latitude:h,altitude:d};const n=f(t,e.longitude),a=f(t,e.latitude),r=f(t,e.altitude);return{latitude:a,longitude:n,...r?{altitude:r}:{}}},S=t=>{if(p(t)){const e=parseFloat(t);return!(e>i||e<r)}return!!N(t)&&S(v(t))},L=S,b=t=>{if(p(t)){const e=parseFloat(t);return!(e>s||e<o)}return!!N(t)&&b(v(t))},E=b,P=t=>{const{latitude:e,longitude:n}=y(t);if(Array.isArray(t)&&t.length>=2)return E(t[0])&&L(t[1]);if(void 0===e||void 0===n)return!1;const a=t[n],r=t[e];return void 0!==r&&void 0!==a&&L(r)&&E(a)},x=t=>{if(p(t))return Number(t);if(N(t))return v(t);if(P(t)){const e=y(t);return Array.isArray(t)?t.map((t,e)=>[0,1].includes(e)?x(t):t):{...t,...e.latitude&&{[e.latitude]:x(t[e.latitude])},...e.longitude&&{[e.longitude]:x(t[e.longitude])}}}return Array.isArray(t)?t.map(t=>P(t)?x(t):t):t},w=x,W=(t,e)=>{const n=f(t,h);if(null==n)return;const a=t[n];return!0===e?a:w(a)},I=(t,e)=>{const n=f(t,c);if(null==n)return;const a=t[n];return!0===e?a:w(a)},O=t=>t*u,A=t=>t*l,D=function(t,e,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:6371e3;const r=W(t),i=I(t),u=e/a,l=O(n),c=O(r),h=O(i),d=Math.asin(Math.sin(c)*Math.cos(u)+Math.cos(c)*Math.sin(u)*Math.cos(l));let g=h+Math.atan2(Math.sin(l)*Math.sin(u)*Math.cos(c),Math.cos(u)-Math.sin(c)*Math.sin(d)),M=A(g);return(M<o||M>s)&&(g=(g+3*Math.PI)%(2*Math.PI)-Math.PI,M=A(g)),{latitude:A(d),longitude:M}},F=function(t){const e=m[arguments.length>1&&void 0!==arguments[1]?arguments[1]:"m"];if(e)return t*e;throw new Error("Invalid unit used for area conversion.")},C=function(t){const e=g[arguments.length>1&&void 0!==arguments[1]?arguments[1]:"m"];if(e)return t*e;throw new Error("Invalid unit used for distance conversion.")},k=function(t){switch(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"kmh"){case"kmh":return t*M.h*g.km;case"mph":return t*M.h*g.mi;default:return t}},j=t=>{const[e,n]=t.toString().split("."),a=Math.abs(Number(e)),r=60*Number("0."+(n||0)),i=r.toString().split("."),o=Math.floor(r),s=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:4;const n=Math.pow(10,e);return Math.round(t*n)/n}(60*Number("0."+(i[1]||0))).toString(),[u,l="0"]=s.split(".");return a+"° "+o.toString().padStart(2,"0")+"' "+u.padStart(2,"0")+"."+l.padEnd(1,"0")+'"'},T=t=>t>1?1:t<-1?-1:t,R=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=isNaN(n)?1:n;const r=O(W(t)),i=O(W(e)),o=O(I(t)-I(e)),s=Math.acos(T(Math.sin(i)*Math.sin(r)+Math.cos(i)*Math.cos(r)*Math.cos(o)))*a;return Math.round(s/n)*n},q=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:R;return n="function"==typeof n?n:R,e.slice().sort((e,a)=>n(t,e)-n(t,a))},B=(t,e)=>q(t,e)[0],X=t=>{let e=0;if(t.length>2){let n,r,i;for(let a=0;a<t.length;a++){a===t.length-2?(n=t.length-2,r=t.length-1,i=0):a===t.length-1?(n=t.length-1,r=0,i=1):(n=a,r=a+1,i=a+2);const o=I(t[n]),s=W(t[r]),u=I(t[i]);e+=(O(u)-O(o))*Math.sin(O(s))}e=e*a*a/2}return Math.abs(e)},$=t=>{if(!1===Array.isArray(t)||0===t.length)throw new Error("No points were given.");return t.reduce((t,e)=>{const n=W(e),a=I(e);return{maxLat:Math.max(n,t.maxLat),minLat:Math.min(n,t.minLat),maxLng:Math.max(a,t.maxLng),minLng:Math.min(a,t.minLng)}},{maxLat:-1/0,minLat:1/0,maxLng:-1/0,minLng:1/0})},_=(t,e)=>{const n=W(t),u=I(t),l=O(n),c=O(u),h=e/a;let d=l-h,g=l+h;const M=O(i),m=O(r),f=O(s),p=O(o);let N,v;if(d>m&&g<M){const t=Math.asin(Math.sin(h)/Math.cos(l));N=c-t,N<p&&(N+=2*Math.PI),v=c+t,v>f&&(v-=2*Math.PI)}else d=Math.max(d,m),g=Math.min(g,M),N=p,v=f;return[{latitude:A(d),longitude:A(N)},{latitude:A(g),longitude:A(v)}]},G=t=>{if(!1===Array.isArray(t)||0===t.length)return!1;const e=t.length,n=t.reduce((t,e)=>{const n=O(W(e)),a=O(I(e));return{X:t.X+Math.cos(n)*Math.cos(a),Y:t.Y+Math.cos(n)*Math.sin(a),Z:t.Z+Math.sin(n)}},{X:0,Y:0,Z:0}),a=n.X/e,r=n.Y/e,i=n.Z/e;return{longitude:A(Math.atan2(r,a)),latitude:A(Math.atan2(i,Math.sqrt(a*a+r*r)))}},K=t=>{const e=$(t),n=e.minLat+(e.maxLat-e.minLat)/2,a=e.minLng+(e.maxLng-e.minLng)/2;return{latitude:parseFloat(n.toFixed(6)),longitude:parseFloat(a.toFixed(6))}},Y=(t,e)=>{let n=O(I(e))-O(I(t));const a=Math.log(Math.tan(O(W(e))/2+Math.PI/4)/Math.tan(O(W(t))/2+Math.PI/4));return Math.abs(n)>Math.PI&&(n=n>0?-1*(2*Math.PI-n):2*Math.PI+n),(A(Math.atan2(n,a))+360)%360},Z=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Y;const a="function"==typeof n?n(t,e):Y(t,e);if(isNaN(a))throw new Error("Could not calculate bearing for given points. Check your bearing function");switch(Math.round(a/22.5)){case 1:return"NNE";case 2:return"NE";case 3:return"ENE";case 4:return"E";case 5:return"ESE";case 6:return"SE";case 7:return"SSE";case 8:return"S";case 9:return"SSW";case 10:return"SW";case 11:return"WSW";case 12:return"W";case 13:return"WNW";case 14:return"NW";case 15:return"NNW";default:return"N"}},V=function(t,e,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;const r=R(e,t,a),i=R(t,n,a),o=R(e,n,a),s=Math.acos(T((r*r+o*o-i*i)/(2*r*o))),u=Math.acos(T((i*i+o*o-r*r)/(2*i*o)));return 0===r||0===i?0:0===o||s>Math.PI/2?r:u>Math.PI/2?i:Math.sin(s)*r},z=(t,e)=>{const n=W(e),a=I(e),r=W(t),i=I(t);return(A(Math.atan2(Math.sin(O(a)-O(i))*Math.cos(O(n)),Math.cos(O(r))*Math.sin(O(n))-Math.sin(O(r))*Math.cos(O(n))*Math.cos(O(a)-O(i))))+360)%360},H=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:R;return t.reduce((t,n)=>("object"==typeof t&&null!==t.last&&(t.distance+=e(n,t.last)),t.last=n,t),{last:null,distance:0}).distance},J=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=isNaN(n)?1:n;const r=W(t),i=I(t),o=W(e),s=I(e),u=6356752.314245,l=1/298.257223563,c=O(s-i);let h,d,g,M,m,f;const p=Math.atan((1-l)*Math.tan(O(parseFloat(r)))),N=Math.atan((1-l)*Math.tan(O(parseFloat(o)))),v=Math.sin(p),y=Math.cos(p),S=Math.sin(N),L=Math.cos(N);let b,E=c,P=100;do{const t=Math.sin(E),e=Math.cos(E);if(f=Math.sqrt(L*t*(L*t)+(y*S-v*L*e)*(y*S-v*L*e)),0===f)return 0;h=v*S+y*L*e,d=Math.atan2(f,h),g=y*L*t/f,M=1-g*g,m=h-2*v*S/M,isNaN(m)&&(m=0);const n=l/16*M*(4+l*(4-3*M));b=E,E=c+(1-n)*l*g*(d+n*f*(m+n*h*(2*m*m-1)))}while(Math.abs(E-b)>1e-12&&--P>0);if(0===P)return NaN;const x=M*(a*a-u*u)/(u*u),w=x/1024*(256+x*(x*(74-47*x)-128)),A=u*(1+x/16384*(4096+x*(x*(320-175*x)-768)))*(d-w*f*(m+w/4*(h*(2*m*m-1)-w/6*m*(4*f*f-3)*(4*m*m-3))));return Math.round(A/n)*n},Q=t=>/^(NNE|NE|NNW|N)$/.test(t)?"N":/^(ENE|E|ESE|SE)$/.test(t)?"E":/^(SSE|S|SSW|SW)$/.test(t)?"S":/^(WSW|W|WNW|NW)$/.test(t)?"W":void 0,U=function(t,e){return(arguments.length>2&&void 0!==arguments[2]?arguments[2]:R)(t,e)/(Number(e.time)-Number(t.time))*1e3},tt=(t,e,n)=>R(e,t)+R(t,n)===R(e,n),et=(t,e)=>{let n=!1;const a=e.length;for(let r=-1,i=a-1;++r<a;i=r)(I(e[r])<=I(t)&&I(t)<I(e[i])||I(e[i])<=I(t)&&I(t)<I(e[r]))&&W(t)<(W(e[i])-W(e[r]))*(I(t)-I(e[r]))/(I(e[i])-I(e[r]))+W(e[r])&&(n=!n);return n},nt=(t,e,n,a)=>V(t,e,n)<a,at=(t,e,n)=>R(t,e,.01)<n,rt=t=>{if(!t.startsWith("POLYGON"))throw new Error("Invalid wkt.");return t.slice(t.indexOf("(")+2,t.indexOf(")")).split(", ").map(t=>{const[e,n]=t.split(" ");return{longitude:parseFloat(e),latitude:parseFloat(n)}})};return e})());