UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 1.93 kB
import{getAngle as x,lineAngle as y,lineCenter as G,lineLength as h,rotatePoint as L,shiftPoint as B}from"simple-geometry";import{fpGeo as R}from"../data/fpGeo";import b from"../tools/logger";import{haversineDistance as u}from"./haversineDistance";const g=6371e3,S=-180,T=180;let v=n=>n*Math.PI/180,d=n=>n*180/Math.PI;export function bearing(n,l,t,s){const a=n*Math.PI/180,r=t*Math.PI/180,e=(s-l)*Math.PI/180,o=Math.sin(e)*Math.cos(r),c=Math.cos(a)*Math.sin(r)-Math.sin(a)*Math.cos(r)*Math.cos(e);return(Math.atan2(o,c)*180/Math.PI+360)%360}export function isValidPointCoords(n){return typeof n=="number"&&Number.isFinite(n)}export function convertGpsToLocal({lat:n,lng:l,angle:t},s){if(!(isValidPointCoords(n)&&isValidPointCoords(l)))return null;let{p0:a,p2:r}=s;const e=u(a.lat,a.lng,r.lat,r.lng),o=bearing(a.lat,a.lng,r.lat,r.lng),c=h(a,r),i=y(a,r);let p=u(a.lat,a.lng,n,l),M=bearing(a.lat,a.lng,n,l)-o;if(!isValidPointCoords(e)||e<=0)return b.warn("Invalid GPS config: zero or negative distance",{fullGpsDistance:e,p0:a,p2:r}),null;let I=p/e,m=L(M,B(a,c*I,i),a.x,a.y),A=h(m,G(s.p0,s.p2)),D=h(s.p0,s.p2);return A>5*D?(b.warn("Current position too far"),null):{...m,angle:t}}export function convertLocalToGps(n,l,t){var s=-x(t.p0,t.p2,{x:t.p0.x+1e4,y:t.p0.y}),a=-x(t.p0,{x:n,y:l},{x:t.p0.x+1e4,y:t.p0.y}),r=a-s,e=h(t.p2,t.p0),o=h(t.p0,{x:n,y:l}),c=o/e,i=u(t.p0.lat,t.p0.lng,t.p2.lat,t.p2.lng),p=c*i,P=bearing(t.p0.lat,t.p0.lng,t.p2.lat,t.p2.lng),M=w(t.p0.lat,t.p0.lng,p,P+r);return M}function w(n,l,t,s){var a=t/g,r=v(s),e=v(n),o=v(l),c=Math.asin(Math.sin(e)*Math.cos(a)+Math.cos(e)*Math.sin(a)*Math.cos(r)),i=o+Math.atan2(Math.sin(r)*Math.sin(a)*Math.cos(e),Math.cos(a)-Math.sin(e)*Math.sin(c)),p=d(i);return(p<S||p>T)&&(i=(i+3*Math.PI)%(2*Math.PI)-Math.PI,p=d(i)),[p,d(c)]}export function calculateRelativeBearing(n){const l=R?.properties?.config?.bearing??0;return n?.angle===null?0:(((n.angle-l)%360+360)%360-90+360)%360}