UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

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