@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 1.72 kB
JavaScript
import{fpGeo as h}from"../../../data/fpGeo";import{svgArea as s}from"../../../data/svg";import{uiState as M}from"../../../store";import{convertLocalToGps as m}from"../../../utils/gps";export const MAP_BOUNDS_PADDING_FACTOR=3,MAP_BOUNDS_MIN_PADDING_DEGREES=.02,INITIAL_FIT_ZOOM_ADJUSTMENT=.15;export function deriveVenueMapBounds(t){const n=[[s.x1,s.y1],[s.x2,s.y1],[s.x2,s.y2],[s.x1,s.y2]].map(([r,p])=>m(r,p,t));if(!n.every(([r,p])=>Number.isFinite(r)&&Number.isFinite(p)))return;const o=n.map(([r])=>r),i=n.map(([,r])=>r),a=Math.min(...o),e=Math.max(...o),c=Math.min(...i),u=Math.max(...i),x=Math.max((e-a)*MAP_BOUNDS_PADDING_FACTOR,MAP_BOUNDS_MIN_PADDING_DEGREES),f=Math.max((u-c)*MAP_BOUNDS_PADDING_FACTOR,MAP_BOUNDS_MIN_PADDING_DEGREES);return[[a-x,c-f],[e+x,u+f]]}export function getLocalRectGeoBounds(t,n){const o=[m(t.x1,t.y1,n),m(t.x2,t.y1,n),m(t.x2,t.y2,n),m(t.x1,t.y2,n)],i=o.map(([e])=>e),a=o.map(([,e])=>e);return[[Math.min(...i),Math.min(...a)],[Math.max(...i),Math.max(...a)]]}export function getVisibleRectFitPadding(t=0){const n=M.canvasVisibleRectPx,o=M.screenSize;return!n||!o?{top:t,bottom:t,left:t,right:t}:{top:Math.max(0,n.y1)+t,bottom:Math.max(0,o.height-n.y2)+t,left:Math.max(0,n.x1)+t,right:Math.max(0,o.width-n.x2)+t}}export function deriveGeoConfig(){if(!h?.properties?.config)return null;const t=h.properties.config,n=(t.p0.lng+t.p2.lng)/2,o=(t.p0.lat+t.p2.lat)/2;return{center:[n,o],bearing:t.bearing??0,zoom:16,gpsConfig:t}}export function fitMapToLocalRect(t,n,o,i={}){if(!t||!n||!o||n.h===1/0||n.w===1/0||n.h<=0||n.w<=0)return;const a=getLocalRectGeoBounds(n,o.gpsConfig),e=getVisibleRectFitPadding(i.padding??50);t.fitBounds(a,{padding:e,duration:i.duration??1e3,bearing:o.bearing})}