UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 1.22 kB
import{haversineDistance as m,lineCenter as x,lineLength as d,pointDistance as v,projectGpsToLocal as b,projectLocalToGps as G}from"@expofp/geometry";import{fpGeo as y}from"../data/fpGeo";import p from"../tools/logger";import{planBearing as L}from"./planBearing";function c(e){return[{local:{x:e.p0.x,y:e.p0.y},geo:{lat:e.p0.lat,lng:e.p0.lng}},{local:{x:e.p2.x,y:e.p2.y},geo:{lat:e.p2.lat,lng:e.p2.lng}}]}export function isValidPointCoords(e){return typeof e=="number"&&Number.isFinite(e)}export function convertGpsToLocal({lat:e,lng:n,angle:o},l){if(!(isValidPointCoords(e)&&isValidPointCoords(n)))return null;let{p0:t,p2:r}=l;const i=m(t,r);if(!isValidPointCoords(i)||i<=0)return p.warn("Invalid GPS config: zero or negative distance",{fullGpsDistance:i,p0:t,p2:r}),null;const[s,u]=c(l);let a=b({lat:e,lng:n},s,u),g=d({p0:a,p1:x({p0:t,p1:r})}),f=v(t,r);return g>5*f?(p.warn("Current position too far"),null):{...a,angle:o}}export function convertLocalToGps(e,n,o){const[l,t]=c(o),{lat:r,lng:i}=G({x:e,y:n},l,t);return[i,r]}export function calculateRelativeBearing(e){const n=y?.properties?.config,o=n?L(n.p0,n.p2):NaN,l=Number.isFinite(o)?o:n?.bearing??0;return e?.angle===null?0:(((e.angle-l)%360+360)%360-90+360)%360}