atriusmaps-node-sdk
Version:
This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information
2 lines (1 loc) • 1.95 kB
JavaScript
import{area as o}from"@turf/area";import{bboxClip as r}from"@turf/bbox-clip";import{bboxPolygon as t}from"@turf/bbox-polygon";import{polygon as l}from"@turf/helpers";import"@turf/point-to-line-distance";import*as e from"ramda";const n=(o,r)=>{const t=o[0],l=o[1];let e=!1;for(let o=0,n=r.length-1;o<r.length;n=o++){const u=r[o][0],f=r[o][1],i=r[n][0],s=r[n][1];f>l!=s>l&&t<(i-u)*(l-f)/(s-f)+u&&(e=!e)}return e},u=({n:o,s:r,e:t,w:l})=>[[o,t],[o,l],[r,l],[r,t],[o,t]],f={structure:null,floor:null};function i(l,i,s,a,p,m=!1){if(!e.length(l))return f;const h=(l=l.filter((o=>null==o.shouldDisplay||!0===o.shouldDisplay))).map((o=>({structure:o,floor:d(o,a)})));return function(l,i,s,d,a,p){const m=i.filter((o=>o.floor)).filter((o=>n([s,d],u(o.floor.bounds))));if(p){if(0===m.length)return f;const o=m.filter((o=>n([s,d],o.floor.boundsPolygon)));return o.length>=1?e.head(o):f}if(0===m.length){const o=l.filter((o=>n([s,d],u(o.bounds)))).map((o=>({structure:o,floor:null})));return o.length>=1?o[0]:f}if(1===m.length)return m[0];const h=m.filter((o=>n([s,d],o.floor.boundsPolygon))),b=m.map((l=>function({structure:l,floor:e},n,u){const f=c(e.boundsPolygon),i=t(n),s=r(f,n),d=o(s),a=o(i);return d*(u?150:100)/a}(l,a,h.some((o=>o.floor.id===l.floor.id))))),g=Math.max.apply(null,b);return m[b.indexOf(g)]}(l,h,i,s,p,m)}const s=o=>[o[1],o[0]],c=o=>l([o.map(s)]),d=(o,r)=>Object.values(o.levels).find((o=>o.ordinal===r)),a=(o,r)=>o.reduce(((o,t)=>Object.values(t.levels).find((o=>o.id===r))||o),void 0),p=(o,r)=>o.reduce(((o,t)=>m(t,r)?t:o),null),m=(o,r)=>Object.values(o.levels).reduce(((o,t)=>t.id===r||o),!1);function h(o,r,t,l,e,n,u,f){let i=0,s=0,c=0,d=0,a=0;const p=[{x:o,y:r}];for(let m=1,h=0;m<=20;++m)h=m/20,i=1-h,s=i*i,c=s*i,d=h*h,a=d*h,p.push({x:c*o+3*s*h*t+3*i*d*e+a*u,y:c*r+3*s*h*l+3*i*d*n+a*f});return p}export{h as bezierCurveTo,a as getFloor,i as getStructureAndFloorAtPoint,p as getStructureForFloorId,d as ordToFloor,n as pointInPolygon};