venue-js 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/index.ts","../src/data/constant.ts","../src/data/api/delivery-project.ts","../src/data/utils/geometry-validator.ts","../src/data/utils/match-filters.ts","../src/data/utils/occupant-helper.ts","../src/data/getDataClient.ts","../src/data/populator/index.ts","../src/IndoorMap/IndoorMap.ts","../../../node_modules/@turf/helpers/index.ts","../src/IndoorMap/constants.ts","../src/IndoorMap/utils/createElements.js","../src/IndoorMap/object3d/Billboard.js","../src/IndoorMap/object3d/SpriteMarker.ts","../src/IndoorMap/object3d/NavigationPath.ts","../src/IndoorMap/utils/geometry.ts","../src/IndoorMap/utils/svg.ts","../src/IndoorMap/utils/math.ts","../src/IndoorMap/camera/CameraManager.ts","../../../node_modules/@turf/meta/index.js","../../../node_modules/@turf/bbox/index.ts","../src/IndoorMap/renderer/RendererManager.ts","../src/IndoorMap/renderer/3d/Element3DRenderer.ts","../src/IndoorMap/renderer/3d/objects/GroundLabel.ts","../src/IndoorMap/renderer/3d/element3DRendererOptions.ts","../src/IndoorMap/renderer/3d/utils/get3DRendererOption.ts","../src/IndoorMap/renderer/2d/Element2DRenderer.ts","../src/IndoorMap/renderer/2d/element2DRendererOptions.ts","../src/IndoorMap/renderer/2d/Marker2DRenderer.ts","../src/IndoorMap/renderer/3d/Marker3DRenderer.ts","../src/IndoorMap/renderer/3d/objects/TextSpriteMarker.ts","../src/IndoorMap/renderer/utils/interpolateStops.ts","../src/IndoorMap/renderer/utils/angleBetweenLineString.ts","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/util.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/orient2d.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/orient3d.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/incircle.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/insphere.js","../../../node_modules/point-in-polygon-hao/dist/esm/index.js","../../../node_modules/@turf/invariant/index.ts","../../../node_modules/@turf/boolean-point-in-polygon/index.ts","../src/IndoorMap/renderer/utils/findUnitOnPoint.ts"],"sourcesContent":["export { QueryObserver } from \"@tanstack/query-core\"\n\nexport * from \"./types\"\nexport * from \"./constant\"\nexport * from \"./api/delivery-project\"\nexport * from './utils'\nexport * from \"./getDataClient\"\n","import { FeatureQueryOptions } from \"./types\"\nimport { FeatureType } from \"./types/feature-api\"\n\nexport const DEFAULT_BASE_URL = \"https://service.venue.in.th/api\"\n\nexport const IMDF_FEATURE_TYPES: FeatureType[] = [\n \"address\",\n \"amenity\",\n \"anchor\",\n \"building\",\n \"detail\",\n \"fixture\",\n \"footprint\",\n \"geofence\",\n \"kiosk\",\n \"level\",\n \"occupant\",\n \"opening\",\n \"relationship\",\n \"section\",\n \"unit\",\n \"venue\",\n]\n\nexport const NONIMDF_FEATURE_TYPES: FeatureType[] = [\n \"taxonomy\",\n \"event\",\n \"promotion\",\n \"label\",\n \"privilege\",\n]\n\nexport const GEOJSON_FEATURE_TYPES: FeatureType[] = [\n ...IMDF_FEATURE_TYPES,\n ...NONIMDF_FEATURE_TYPES,\n]\n\nexport const ALL_FEATURE_TYPES: FeatureType[] = [\n ...GEOJSON_FEATURE_TYPES,\n \"sponsored-content\",\n \"element\",\n]\n\nexport const defaultFeatureQueryOptionsMap: Record<\n FeatureType,\n FeatureQueryOptions\n> = {\n // IMDF\n address: {},\n amenity: {},\n anchor: {},\n building: {},\n detail: { enabled: false },\n fixture: {},\n footprint: {},\n geofence: { enabled: false },\n kiosk: {},\n level: {},\n occupant: {\n refetchInterval: 5 * 60 * 1000, // refresh every 5 min\n staleTime: 5 * 60 * 1000,\n },\n opening: {},\n relationship: {},\n section: {},\n unit: {},\n venue: {},\n\n // OTHERS GEOJSON\n taxonomy: {},\n privilege: {},\n event: {},\n promotion: {\n refetchInterval: 0.5 * 60 * 1000, // refresh every 5 min\n staleTime: 0.5 * 60 * 1000,\n },\n label: {},\n\n // NON GEOJSON\n \"sponsored-content\": {\n refetchInterval: 1 * 60 * 1000, // refresh every 5 min\n },\n element: {},\n page: {},\n model3d: {}\n}\n","import type {\n FeatureResponseMap,\n FeatureType,\n SponsoredContentStrapiV4ApiResponse,\n} from \"../types/feature-api\"\nimport { DEFAULT_BASE_URL } from \"../constant\"\n\nexport async function fetchDeliveryApi<T extends FeatureType = FeatureType>(\n projectId: string,\n apiKey: string,\n featureType: FeatureType,\n baseUrl: string = DEFAULT_BASE_URL,\n): Promise<FeatureResponseMap[T][]> {\n // TODO: Update Label Endpoint to match other endpoints\n switch (featureType) {\n case \"label\":\n case \"element\": {\n const pluralFeatureType = `${featureType}s`\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/${pluralFeatureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items\n }\n\n case \"model3d\": {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/${featureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items.features\n }\n\n case \"sponsored-content\": {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/sponsored-content.json?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const jsonRes = await res.json()\n const items = jsonRes.data as SponsoredContentStrapiV4ApiResponse[]\n return items.map((item) => ({\n id: item.id,\n ...item.attributes,\n })) as FeatureResponseMap[T][]\n }\n\n default: {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/imdf/${featureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const collections = await res.json()\n return collections.features\n }\n }\n}\n\n\nexport async function fetchPreviewApi<T extends FeatureType = FeatureType>(\n projectId: string,\n previewToken: string,\n featureType: FeatureType,\n baseUrl: string = DEFAULT_BASE_URL,\n): Promise<FeatureResponseMap[T][]> {\n // TODO: Update Label Endpoint to match other endpoints\n switch (featureType) {\n case \"label\":\n case \"element\": {\n const pluralFeatureType = `${featureType}s`\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/${pluralFeatureType}.geojson`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items\n }\n\n case \"sponsored-content\": {\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/sponsored-content.json`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const jsonRes = await res.json()\n const items = jsonRes.data as SponsoredContentStrapiV4ApiResponse[]\n return items.map((item) => ({\n id: item.id,\n ...item.attributes,\n })) as FeatureResponseMap[T][]\n }\n\n default: {\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/imdf/${featureType}.geojson`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const collections = await res.json()\n return collections.features\n }\n }\n}\n\nexport const safeFetchFeature = async <T extends FeatureType = FeatureType>(\n featureType: FeatureType,\n params: { \n mode: 'delivery' | 'preview',\n projectId: string,\n apiKey: string,\n previewToken?: string,\n baseUrl: string\n } \n): Promise<FeatureResponseMap[T][]> => {\n const mode = params.mode ?? 'delivery'\n const projectId = params.projectId\n const apiKey = params.apiKey\n const previewToken = params.previewToken\n const baseUrl = params.baseUrl ?? DEFAULT_BASE_URL\n\n try {\n let result = []\n \n if (mode === 'delivery') {\n result = await fetchDeliveryApi<T>(\n projectId,\n apiKey,\n featureType,\n baseUrl\n )\n } else if (mode === 'preview') {\n result = await fetchPreviewApi<T>(\n projectId,\n previewToken,\n featureType,\n baseUrl\n )\n }\n return result ?? []\n } catch (e) {\n // Suppress error and return []\n return Promise.resolve([])\n }\n}\n","import { Geometry, GeometryCollection, Position } from \"geojson\"\n\n/**\n * Checks if a point is a valid coordinate pair.\n *\n * @param point - The point to be checked.\n * @return True if the point is a valid coordinate pair, false otherwise.\n */\nexport const isValidCoordinate = (point: Position): boolean => {\n return point.length === 2 && point.every((coord) => typeof coord === \"number\")\n}\n\n/**\n * Checks if a set of points forms a valid linear ring (closed and simple polygon).\n *\n * @param ring - The array of points representing a linear ring.\n * @return True if the linear ring is valid, false otherwise.\n */\nfunction isValidLinearRingCoordinates(ring: Position[]): boolean {\n if (ring.length < 4) {\n return false\n }\n\n return (\n ring.every(isValidCoordinate) &&\n ring[0][0] === ring[ring.length - 1][0] &&\n ring[0][1] === ring[ring.length - 1][1]\n )\n}\n\n/**\n * Checks if an input represents a valid polygon, which may include holes.\n * The input can be a single array of coordinates for simple polygons, or\n * an array of arrays of coordinates for polygons with holes.\n *\n * @param polygon - The input representing a polygon.\n * @return True if the polygon is valid, false otherwise.\n */\nexport const isValidPolygonCoordinates = (\n polygon: Position[] | Position[][]\n): boolean => {\n // Check if it's a simple polygon (without holes)\n if (\n Array.isArray(polygon[0]) &&\n (polygon[0].length === 0 || typeof polygon[0][0] === \"number\")\n ) {\n return isValidLinearRingCoordinates(polygon as Position[])\n }\n\n // Check if it's a polygon with holes\n if (\n Array.isArray(polygon) &&\n polygon.length > 0 &&\n Array.isArray(polygon[0])\n ) {\n // Check the outer ring\n if (!isValidLinearRingCoordinates(polygon[0] as Position[])) {\n return false\n }\n\n // Check each hole\n for (let i = 1; i < polygon.length; i++) {\n if (!isValidLinearRingCoordinates(polygon[i] as Position[])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\n/**\n * Checks if an array of polygons forms a valid MultiPolygon.\n *\n * @param multipolygon - The array of polygons.\n * @return True if the multipolygon is valid, false otherwise.\n */\nexport const isValidMultiPolygonCoordinates = (\n multipolygon: Position[][][]\n): boolean => {\n return multipolygon.every(isValidPolygonCoordinates)\n}\n\n/**\n * Checks if a set of points forms a valid LineString.\n * A valid LineString must have at least two points, each point must be a valid coordinate,\n * and it should not form a closed loop.\n *\n * @param lineString - The array of points representing a LineString.\n * @return True if the LineString is valid, false otherwise.\n */\nexport const isValidLineStringCoordinates = (\n lineString: Position[]\n): boolean => {\n if (!Array.isArray(lineString) || lineString.length < 2) {\n return false\n }\n\n // Check if the first and last points are the same, which would make it a polygon\n const firstPoint = lineString[0]\n const lastPoint = lineString[lineString.length - 1]\n if (firstPoint[0] === lastPoint[0] && firstPoint[1] === lastPoint[1]) {\n return false\n }\n\n return lineString.every(isValidCoordinate)\n}\n\nexport const isValidMultiPolygon = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"MultiPolygon\" && isValidMultiPolygonCoordinates(coordinates)\n}\n\nexport const isValidPolygon = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"Polygon\" && isValidPolygonCoordinates(coordinates)\n}\n\nexport const isValidLineString = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"LineString\" && isValidLineStringCoordinates(coordinates)\n}\n\nexport const isValidPoint = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"Point\" && isValidCoordinate(coordinates)\n}\n","import type { Value, InFilter, Filter, Filters } from '../types/match-filters'\n\nfunction isInFilter(filter: Filter): filter is InFilter {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"$in\" in filter &&\n Array.isArray((filter as any).$in)\n );\n}\n\nconst someIntersect = (a: Value[], b: Value[]) => a.some(v => b.includes(v));\n\nexport function matchFilter(value: Value | Value[], filter: Filter) {\n\n if (Array.isArray(value)) {\n if (isInFilter(filter)) return someIntersect(value, filter.$in);\n \n // Equal\n return value.includes(filter as Value);\n \n } else {\n if (isInFilter(filter)) return filter.$in.includes(value);\n \n // Equal\n return value === filter;\n }\n}\n\nexport function matchFilters<T extends Record<string, any>>(item: T, filters: Filters): boolean {\n return Object.entries(filters).every(([key, filter]) => {\n return matchFilter(item.properties[key], filter)\n });\n}","import { compact } from \"lodash-es\"\nimport { KioskFeaturePopulated, OccupantFeaturePopulated, UnitFeaturePopulated } from \"../types\";\n\nexport const getOccupantMainLocation = (occupant: OccupantFeaturePopulated): UnitFeaturePopulated | KioskFeaturePopulated => {\n return occupant.properties.kiosk || occupant.properties.unit\n}\n\nexport const getOccupantCorrelatedLocations = (occupant: OccupantFeaturePopulated): Array<UnitFeaturePopulated | KioskFeaturePopulated> => {\n\n const allCorrelatedLocations = [\n ...occupant.properties.units,\n ...occupant.properties.kiosks,\n ]\n\n return compact(allCorrelatedLocations) \n}\n\nexport type OccupantMarkerPlacementType = 'ONCE_PER_LEVEL' | 'ALL_LOCATIONS'\n\nexport const getOccupantMarkerLocations = (occupant: OccupantFeaturePopulated, options?: { type: OccupantMarkerPlacementType }): Array<UnitFeaturePopulated | KioskFeaturePopulated> => {\n\n /**\n * Use optiosn.type first\n * THEN occupant.show_name_on_all_units \n */\n const placementType = options?.type ? options.type : occupant.properties.show_name_on_all_units ? 'ALL_LOCATIONS' : 'ONCE_PER_LEVEL'\n\n const mainLocation = getOccupantMainLocation(occupant)\n\n const mainLocationLevel = mainLocation?.properties?.level_id\n const allCorrelatedLocations = getOccupantCorrelatedLocations(occupant)\n\n // IF showNameonAllLocations = true, Show All \n if (placementType === 'ALL_LOCATIONS') {\n return compact([mainLocation, ...allCorrelatedLocations])\n }\n \n // ELSE Show Once per level\n const otherLevelLocations = allCorrelatedLocations.filter((f) => f.properties.level_id !== mainLocationLevel)\n const onePerLevelLocations = [...new Map(otherLevelLocations.map(loc => [loc.properties.level_id, loc])).values()]\n return compact([mainLocation, ...onePerLevelLocations])\n}\n","import { safeFetchFeature } from \"./api/delivery-project\"\nimport { FeatureResponseMap, FeatureType } from \"./types/feature-api\"\nimport {\n EnsureQueryDataOptions,\n QueryClient,\n QueryObserver,\n} from \"@tanstack/query-core\"\nimport {\n FeatureQueryOptions,\n FilterParams,\n FindParams,\n InternalFilterByType,\n InternalFindById,\n PopulatedParams,\n VenueClientOptions,\n VenueDataClient,\n} from \"./types/VenueDataClient\"\nimport { createPopulator } from \"./populator\"\nimport { FeaturePopulatedResponseMap } from \"./types\"\nimport { matchFilters } from \"./utils/match-filters\"\n\nexport const getDataClient = (options: VenueClientOptions): VenueDataClient => {\n const observers = new Map<\n FeatureType,\n { observer: QueryObserver<any, any>, unsubscribe: () => void }\n >()\n\n const queryClient = options.queryClient ?? new QueryClient()\n const { mode = 'delivery', projectId, apiKey, baseUrl, previewToken } = options\n\n if (!projectId)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `projectId` is missing\"\n )\n \n if (mode === 'delivery' && !apiKey)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `apiKey` is missing\"\n )\n\n if (mode === 'preview' && !previewToken)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `previewToken` is missing\"\n )\n\n const createDeliveryApiQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T\n ) => ({\n queryKey: [\"_deliveryapi\", featureType] as const,\n queryFn: () => safeFetchFeature<T>(featureType, { mode, projectId, apiKey, previewToken, baseUrl }),\n })\n\n /**\n * Internal Functions\n * ***********************************/\n const internalFilterByType: InternalFilterByType = async <T extends FeatureType = FeatureType>(\n featureType: T\n ) => {\n try {\n const features = await queryClient.ensureQueryData<\n FeatureResponseMap[T][],\n unknown,\n FeatureResponseMap[T][]\n >(createDeliveryApiQueryOptions(featureType))\n return features\n } catch (error) {\n throw error\n }\n }\n\n const internalFindById: InternalFindById = async <T extends FeatureType = FeatureType>(\n id: string\n ) => {\n if (id === null) return null\n const featureType = id.slice(0, id.lastIndexOf(\"-\")) as FeatureType\n const feature = await queryClient.ensureQueryData<FeatureResponseMap[T]>({\n queryKey: [\"_deliveryapi\", featureType, id],\n queryFn: async () => {\n const features = await internalFilterByType(featureType)\n const feature = features.find(\n (f) => f.id === id\n ) as FeatureResponseMap[T]\n return feature ?? null\n },\n })\n return feature\n }\n\n // Create `Feature Populator` with internal functions\n const populator = createPopulator({ internalFindById, internalFilterByType })\n\n /**\n * Public Functions\n * ***********************************/\n const registerObserver = (\n featureType: FeatureType,\n refetchInterval: number\n ) => {\n if (observers.has(featureType)) {\n console.warn(`Observer for ${featureType} already exists`)\n const record = observers.get(featureType)\n return record.observer\n }\n \n const options = createDeliveryApiQueryOptions(featureType)\n const observer = new QueryObserver(queryClient, {\n ...options,\n refetchInterval,\n })\n const unsubscribe = observer.subscribe(() => {\n console.log(`[venue-js] Listening to ${featureType} changes (interval = ${refetchInterval}ms)`)\n // TODO: add logs or what to do after subscribe\n })\n observers.set(featureType, { observer, unsubscribe })\n\n return observer\n }\n\n const destroyObserver = (featureType: FeatureType) => {\n const record = observers.get(featureType)\n if (!record) return\n\n record.unsubscribe()\n observers.delete(featureType)\n }\n\n const destroyObservers = () => {\n observers.forEach(({ observer, unsubscribe }) => {\n unsubscribe()\n observer.destroy()\n })\n observers.clear()\n }\n\n const createFilterByTypeQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T,\n params: FilterParams = {},\n options: FeatureQueryOptions = {}\n ): EnsureQueryDataOptions<FeatureResponseMap[T][] | FeaturePopulatedResponseMap[T][]> => ({\n queryKey: [featureType, \"list\", params] as const,\n queryFn: async () => {\n const features = await internalFilterByType<T>(featureType)\n \n // Filter \n const filters = params.filters ?? {}\n let result = features\n if (params.filters) {\n result = features.filter(f => matchFilters(f, filters))\n }\n\n // Populate\n return params.populate === true\n ? await Promise.all(result.map((f) => populator[featureType](f)))\n : result\n },\n ...(options ?? {}),\n })\n\n const createFindByIdQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T,\n id: string,\n params: FindParams = {},\n options: FeatureQueryOptions = {}\n ): EnsureQueryDataOptions<FeatureResponseMap[T] | FeaturePopulatedResponseMap[T]> => ({\n queryKey: [featureType, \"detail\", id, params] as const,\n queryFn: async () => {\n const feature = await internalFindById<T>(id)\n return params.populate === true\n ? await populator[featureType](feature)\n : Promise.resolve(feature)\n },\n ...(options ?? {}),\n })\n\n async function filterByType<T extends FeatureType>(featureType: T, params: FilterParams & PopulatedParams): Promise<FeaturePopulatedResponseMap[T][]>\n async function filterByType<T extends FeatureType>(featureType: T, params?: FilterParams): Promise<FeatureResponseMap[T][]>\n async function filterByType<T extends FeatureType>(featureType: T, params?: FilterParams) {\n const filterQueryOptions = createFilterByTypeQueryOptions<T>(\n featureType,\n params\n )\n const features = await queryClient.ensureQueryData(filterQueryOptions)\n return (params?.populate === true) ? features as FeaturePopulatedResponseMap[T][] : features as FeatureResponseMap[T][]\n }\n\n async function findById<T extends FeatureType>(featureType: T, id: string, params: FindParams & PopulatedParams): Promise<FeaturePopulatedResponseMap[T]>\n async function findById<T extends FeatureType>(featureType: T, id: string, params?: FindParams): Promise<FeatureResponseMap[T]>\n async function findById<T extends FeatureType>( featureType: T, id: string, params?: FindParams) {\n const findQueryOptions = createFindByIdQueryOptions<T>(\n featureType,\n id,\n params\n )\n const feature = await queryClient.ensureQueryData(findQueryOptions)\n return feature\n }\n\n return {\n projectId,\n queryClient,\n registerObserver,\n destroyObserver,\n destroyObservers,\n createFilterByTypeQueryOptions,\n createFindByIdQueryOptions,\n filterByType,\n findById,\n }\n}\n","import {\n FeatureResponseMap,\n FeaturePopulatedResponseMap,\n InternalFindById,\n InternalFilterByType,\n SectionFeature,\n} from \"../types\"\n\nimport { booleanWithin } from \"@turf/boolean-within\"\n\ntype CreatePopulatorOptions = {\n internalFindById: InternalFindById\n internalFilterByType: InternalFilterByType\n}\n\ntype PopulatableFeatureType = Extract<\n keyof FeatureResponseMap,\n keyof FeaturePopulatedResponseMap\n>\ntype PopulatorFn<T extends PopulatableFeatureType> = (\n f: FeatureResponseMap[T]\n) => Promise<FeaturePopulatedResponseMap[T]>\n\nexport type Populator = {\n [K in PopulatableFeatureType]?: PopulatorFn<K>\n}\n\nexport const createPopulator = ({\n internalFindById,\n internalFilterByType,\n}: CreatePopulatorOptions): Populator => {\n const populateAddress: PopulatorFn<\"address\"> = (address) =>\n Promise.resolve(address)\n const populateBuilding: PopulatorFn<\"building\"> = (building) =>\n Promise.resolve(building)\n const populateDetail: PopulatorFn<\"detail\"> = (detail) =>\n Promise.resolve(detail)\n const populateFootprint: PopulatorFn<\"footprint\"> = (footprint) =>\n Promise.resolve(footprint)\n const populateGeofence: PopulatorFn<\"geofence\"> = (geofence) =>\n Promise.resolve(geofence)\n const populateRelationship: PopulatorFn<\"relationship\"> = (relationship) =>\n Promise.resolve(relationship)\n const populatePrivilege: PopulatorFn<\"privilege\"> = (privilege) =>\n Promise.resolve(privilege)\n const populateEvent: PopulatorFn<\"event\"> = (event) => Promise.resolve(event)\n\n const populatePromotion: PopulatorFn<\"promotion\"> = async (promotion) => {\n const venue = await internalFindById<\"venue\">(promotion.properties.venue_id)\n return {\n ...promotion,\n properties: {\n ...promotion.properties,\n venue,\n },\n }\n }\n\n const populateAmenity: PopulatorFn<\"amenity\"> = async (amenity) => {\n const units = await Promise.all(\n amenity.properties.unit_ids.map(internalFindById<\"unit\">)\n )\n\n const populatedUnits = await Promise.all(units.map(populateUnit))\n\n const venue = await internalFindById<\"venue\">(amenity.properties.venue_id)\n\n const defaultLevel = populatedUnits[0].properties.level\n\n const kiosks = await internalFilterByType<\"kiosk\">(\"kiosk\")\n const ordinalKiosks = kiosks.filter(\n (kiosk) => kiosk.properties.level_id === defaultLevel.id\n )\n const kiosk = ordinalKiosks.find((kiosk) => booleanWithin(amenity, kiosk))\n return {\n ...amenity,\n properties: {\n ...amenity.properties,\n\n ordinal: defaultLevel.properties.ordinal,\n level_name: defaultLevel.properties.name.en,\n units: populatedUnits,\n venue,\n\n _experimental_kiosk: kiosk ? await populateKiosk(kiosk) : null,\n },\n }\n }\n\n const populateAnchor: PopulatorFn<\"anchor\"> = async (anchor) => {\n const unit = await internalFindById<\"unit\">(anchor.properties.unit_id)\n const level = await internalFindById<\"level\">(unit.properties.level_id)\n\n const sections = await internalFilterByType<\"section\">(\"section\")\n const section = sections.find((section) => booleanWithin(anchor, section))\n\n return {\n ...anchor,\n properties: {\n ...anchor.properties,\n level: await populateLevel(level),\n unit: await populateUnit(unit),\n section: section ? await populateSection(section) : null,\n },\n }\n }\n\n const populateFixture: PopulatorFn<\"fixture\"> = async (fixture) => {\n const level = await internalFindById<\"level\">(fixture.properties.level_id)\n const venue = await internalFindById<\"venue\">(fixture.properties.venue_id)\n const anchor = await internalFindById<\"anchor\">(fixture.properties.anchor_id)\n\n return {\n ...fixture,\n properties: {\n ...fixture.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n level: await populateLevel(level),\n venue: await populateVenue(venue),\n ordinal: level.properties.ordinal,\n }\n }\n }\n\n const populateKiosk: PopulatorFn<\"kiosk\"> = async (kiosk) => {\n const level = await internalFindById<\"level\">(kiosk.properties.level_id)\n const venue = await internalFindById<\"venue\">(kiosk.properties.venue_id)\n const anchor = await internalFindById<\"anchor\">(kiosk.properties.anchor_id)\n\n // Find Kiosk's Unit\n const units = await internalFilterByType<\"unit\">(\"unit\")\n const unit = units.find(\n (unit) =>\n unit.properties.category === \"walkway\" &&\n unit.properties.level_id === kiosk.properties.level_id &&\n booleanWithin(kiosk, unit)\n )\n\n let section: SectionFeature | null = null\n\n if (anchor) {\n const sections = await internalFilterByType<\"section\">(\"section\")\n section = sections.find((section) => booleanWithin(anchor, section))\n }\n\n return {\n ...kiosk,\n properties: {\n ...kiosk.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n level: await populateLevel(level),\n venue: await populateVenue(venue),\n ordinal: level.properties.ordinal,\n\n unit: unit ? await populateUnit(unit) : null,\n section: section ? await populateSection(section) : null,\n },\n }\n }\n\n const populateLevel: PopulatorFn<\"level\"> = async (level) => {\n const venue = await internalFindById<\"venue\">(level.properties.venue_id)\n return {\n ...level,\n properties: {\n ...level.properties,\n venue,\n },\n }\n }\n\n const populateOccupant: PopulatorFn<\"occupant\"> = async (occupant) => {\n const {\n anchor_id,\n venue_id,\n local_category_ids,\n promotion_ids,\n privilege_ids,\n kiosk_id,\n unit_id,\n kiosk_ids = [],\n unit_ids = [],\n } = occupant.properties\n const anchor = await internalFindById<\"anchor\">(anchor_id)\n const venue = await internalFindById<\"venue\">(venue_id)\n\n const localCategories = await Promise.all(\n local_category_ids.map(internalFindById<\"taxonomy\">)\n )\n const promotions = await Promise.all(\n promotion_ids.map(internalFindById<\"promotion\">)\n )\n const privileges = await Promise.all(\n privilege_ids.map(internalFindById<\"privilege\">)\n )\n const kiosk = await internalFindById<\"kiosk\">(kiosk_id)\n const unit = await internalFindById<\"unit\">(unit_id)\n\n const kiosks = await Promise.all(kiosk_ids.map(internalFindById<\"kiosk\">))\n const units = await Promise.all(unit_ids.map(internalFindById<\"unit\">))\n return {\n ...occupant,\n properties: {\n ...occupant.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n local_categories: await Promise.all(\n localCategories.map(populateTaxonomy)\n ),\n venue,\n promotions,\n privileges,\n\n kiosk: kiosk ? await populateKiosk(kiosk) : null,\n unit: unit ? await populateUnit(unit) : null,\n kiosks: await Promise.all(kiosks.map(populateKiosk)),\n units: await Promise.all(units.map(populateUnit)),\n },\n }\n }\n\n const populateOpening: PopulatorFn<\"opening\"> = async (opening) => {\n const venue = await internalFindById<\"venue\">(opening.properties.venue_id)\n const level = await internalFindById<\"level\">(opening.properties.level_id)\n return {\n ...opening,\n properties: {\n venue,\n level: await populateLevel(level),\n ordinal: level.properties.ordinal,\n }\n }\n }\n\n const populateSection: PopulatorFn<\"section\"> = async (section) => {\n const venue = await internalFindById<\"venue\">(section.properties.venue_id)\n const level = await internalFindById<\"level\">(section.properties.level_id)\n return {\n ...section,\n properties: {\n ...section.properties,\n venue,\n level: await populateLevel(level),\n ordinal: level.properties.ordinal,\n },\n }\n }\n\n const populateUnit: PopulatorFn<\"unit\"> = async (unit) => {\n const venue = await internalFindById<\"venue\">(unit.properties.venue_id)\n const level = await internalFindById<\"level\">(unit.properties.level_id)\n\n const sections = await internalFilterByType<\"section\">(\"section\")\n try {\n const section = unit.geometry.type !== 'MultiPolygon' ? sections.find((section) => booleanWithin(unit, section)) : null\n return {\n ...unit,\n properties: {\n ...unit.properties,\n venue,\n ordinal: level.properties.ordinal,\n level: await populateLevel(level),\n section: section ? await populateSection(section) : null,\n },\n }\n } catch (err) {\n console.log(`error finding section `, { unit, sections })\n }\n }\n\n const populateVenue: PopulatorFn<\"venue\"> = (venue) => {\n return Promise.resolve(venue)\n }\n\n const populateTaxonomy: PopulatorFn<\"taxonomy\"> = async (taxonomy) => {\n const venue = await internalFindById<\"venue\">(taxonomy.properties.venue_id)\n return {\n ...taxonomy,\n properties: {\n ...taxonomy.properties,\n venue: venue ? await populateVenue(venue) : null,\n },\n }\n }\n\n const populateFeature = (feature) => Promise.resolve(feature)\n\n return {\n address: populateAddress,\n building: populateBuilding,\n detail: populateDetail,\n fixture: populateFixture,\n footprint: populateFootprint,\n geofence: populateGeofence,\n opening: populateOpening,\n relationship: populateRelationship,\n privilege: populatePrivilege,\n promotion: populatePromotion,\n event: populateEvent,\n label: populateFeature,\n element: populateFeature,\n page: populateFeature,\n\n amenity: populateAmenity,\n anchor: populateAnchor,\n kiosk: populateKiosk,\n level: populateLevel,\n occupant: populateOccupant,\n section: populateSection,\n unit: populateUnit,\n venue: populateVenue,\n\n taxonomy: populateTaxonomy,\n }\n}\n","import {\n ui,\n Map,\n TileLayer,\n VectorLayer,\n LineString,\n Geometry,\n Coordinate,\n OverlayLayer,\n GroupGLLayer,\n GLTFLayer,\n} from \"maptalks-gl\"\nimport '@maptalks/transcoders.draco';\n\nimport { GeoJsonProperties, LineString as LineStringType, Feature } from \"geojson\"\nimport TWEEN from \"@tweenjs/tween.js\"\nimport _ from \"lodash\"\nimport {\n feature as turfFeature,\n lineString,\n point,\n} from \"@turf/helpers\"\nimport turfDistance from \"@turf/distance\"\nimport turfCenter from \"@turf/center\"\nimport { featureCollection } from '@turf/helpers';\n\nimport { PerspectiveCamera } from \"three\"\nimport { ThreeLayer } from \"maptalks.three\"\n\nimport {\n LAYERS,\n LAYER_OPTIONS,\n LAYER_FEATURE_TYPE_OBJ,\n HIGHLIGHT_LAYER_NAME,\n USER_LOCATION_LAYER_NAME,\n ORIGIN_MARKER_ID,\n DESTINATION_MARKER_ID,\n USER_LOCATION_ELEMENT_ID,\n LAST_USER_LOCATION_ELEMENT_ID_PREFIX,\n LOCALE_SYMBOL_KEY,\n DEFAULT_LOCALE,\n VENUE_EVENTS,\n} from \"./constants\"\n\nimport {\n styledFeatureGenerator,\n getExtrudeConfigByFeature,\n} from \"./utils/createElements\"\n\nimport { getBearingBetweenPoints } from \"./utils/math\"\n\nimport {\n NavigationPath,\n Billboard,\n SpriteMarker,\n} from \"./object3d\"\nimport {\n createHighlighBillboardController,\n} from \"./utils/createHighlightElement\"\nimport {\n IMapConfig,\n IndoorMapOptions,\n} from \"./types\"\n\nimport { CameraManager } from \"./camera/CameraManager\"\nimport { RendererManager } from \"./renderer\"\nimport { VenueDataClient } from \"../data\"\n\ntype MapPaddingType = {\n paddingLeft: number;\n paddingRight: number;\n paddingTop: number;\n paddingBottom: number;\n}\n\nconst INITIAL_CENTER = [100.5017051, 13.7572619] // just placeholder\nconst INITIAL_ZOOM = 18.5\nconst CLICK_TOLERANCE = 20\n\nconst defaultOptions: Partial<IndoorMapOptions> = {\n pixelRatio: 1,\n interactions: true,\n locale: DEFAULT_LOCALE,\n}\n\nconst parseMaptalksOptions = (options: IndoorMapOptions) => {\n return {\n centerCross: (options.centerCross ?? false),\n ...(options.interactions === false ? ({\n draggable: false,\n dragPan: false,\n dragRotate: false,\n dragPitch: false,\n scrollWheelZoom: false,\n touchZoom: false,\n doubleClickZoom: false\n }) : {}),\n }\n}\n\nexport class IndoorMap extends EventTarget {\n options: IndoorMapOptions\n //TODO: refac functions; let them do only 1 thing in a function\n\n /** Note: \"#\" means private variables */\n #styler = null\n #featuresInitted = false\n #elementsLoaded = false\n #elements: Record<string, any> = {}\n #features = []\n #markers = []\n #venues = []\n #venueInView: string | null = null\n #ordinals = []\n #mapTheme = {}\n #billboards = []\n #billboardObjects = []\n #spriteMarkerObjects = []\n #mapDecorations = []\n #groundObjects = []\n #navigationGeometries: Record<string, NavigationPath> = {}\n #venueObjects = []\n #glbObjects = []\n #objects = []\n #object3ds = []\n #isClicked = false\n #highlightElementIds = []\n #highlightObjectIds = []\n #highlightObjectControllers = []\n #userLocationGeometry = null\n #userLocationElement = null\n #mapConfig: IMapConfig = {}\n #locale: string = defaultOptions.locale\n #lastUserLocationGeometries = []\n #lastUserLocationElements = []\n\n #isLayersFadingOnZoom = false\n\n #touchStartTarget = null\n #touchStartPoint = null\n\n #onClickElement = (e) => {}\n #animationsToRun = []\n\n map: Map | null = null\n #dataClient: VenueDataClient\n camera: CameraManager\n rendererManager: RendererManager\n\n showVenueObject = false\n threeLayer: ThreeLayer | null = null\n\n onMapReady = () => {}\n onMapLoading = () => {}\n\n constructor(elementId, options: IndoorMapOptions) {\n super()\n const combinedOptions = _.merge({}, defaultOptions, options)\n this.options = combinedOptions\n const {\n onMapReady,\n onMapLoading,\n pixelRatio,\n locale,\n } = combinedOptions\n\n const maptalksOptions = parseMaptalksOptions(combinedOptions)\n\n this.map = new Map(elementId, {\n attribution: false,\n // Temporart set, not really default view\n // Default view is set in camera manager\n center: INITIAL_CENTER,\n zoom: INITIAL_ZOOM,\n clickTimeThreshold: 600,\n ...maptalksOptions,\n baseLayer: new TileLayer(\"base\", {\n urlTemplate:\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n subdomains: [\"a\", \"b\", \"c\", \"d\"],\n opacity: 1.0,\n attribution: \"\",\n hitDetect: false,\n decodeImageInWorker: true,\n errorUrl: \"/assets/img/tile-placeholder.png\",\n }),\n layers: [],\n })\n\n const groupLayer = new GroupGLLayer('group', [], {}).addTo(this.map);\n\n const threeLayer = new ThreeLayer(\"three\", {\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n })\n groupLayer.addLayer(threeLayer)\n\n const gltfLayer = new GLTFLayer('gltf');\n groupLayer.addLayer(gltfLayer);\n\n /** Manage create elements from imdf features */\n this.rendererManager = new RendererManager(this.map, options.dataClient, options.renderer)\n\n /** Manage zoom, bearing, pitch, flyTo, moveCamera to position */\n this.camera = new CameraManager(this.map, options.camera)\n \n this.locale = locale\n this.pixelRatio = pixelRatio\n\n this.onMapReady = onMapReady\n this.onMapLoading = onMapLoading\n this.showVenueObject = false\n\n // Bind events\n // @ts-expect-error\n this.map.on(\"click\", this.handleMapClick)\n\n this.dataClient = options.dataClient\n }\n\n setOptions(options) {\n const combinedOptions = _.merge({}, defaultOptions, options)\n this.options = combinedOptions\n\n const maptalksOptions = parseMaptalksOptions(combinedOptions)\n this.map.setOptions(maptalksOptions)\n }\n\n set dataClient(value) {\n this.#dataClient = value\n \n // If no defaultView is set, get center from dataClient and move map to center\n if (!this.options.camera?.defaultView?.center) {\n this.#dataClient.filterByType(\"venue\")\n .then(venues => {\n /** Find Venue's center */\n const venueCenters = turfCenter(featureCollection(venues));\n const [x, y] = venueCenters.geometry.coordinates\n const center = new Coordinate(x, y)\n\n /** Move Map to center */\n this.camera.setView({ center, pitch: 60, zoom: 19 })\n })\n }\n }\n\n \n\n /**\n * Events\n */\n on(eventName: string, handler) {\n this.map.on(eventName, handler)\n }\n\n handleMapClick = ({ coordinate }) => {\n const { x, y } = coordinate\n console.log(\n `[Coordinates]: x: ${_.round(x, 8)} y: ${_.round(\n y,\n 8\n )}, [Bearing]: ${this.map.getBearing()}, [Pitch]: ${this.map.getPitch()}`\n )\n }\n\n handleMapTouchEnd = ({ containerPoint }) => {\n const { x, y } = containerPoint\n const { x: touchStartX, y: touchStartY } = this.#touchStartPoint\n\n const dis = Math.hypot(x - touchStartX, y - touchStartY)\n // @ts-expect-error \n this.map.off(\"touchend\", this.handleMapTouchEnd)\n\n if (dis > 0 && dis < CLICK_TOLERANCE) {\n console.log(\"Forgiving click\", this.#touchStartTarget.properties.id)\n this.handleClickElement({ target: this.#touchStartTarget })\n }\n\n this.#touchStartTarget = null\n this.#touchStartPoint = null\n }\n\n /**\n * Getters & Setters\n */\n get elementsLoaded() {\n return this.#elementsLoaded\n }\n\n get pixelRatio() {\n return this.map.getDevicePixelRatio()\n }\n\n get locale() {\n return this.#locale\n }\n\n set mapTheme(value) {\n this.#mapTheme = value\n this.#styler = styledFeatureGenerator(this.#mapTheme)\n }\n\n get venues() {\n return this.#venues || []\n }\n\n #findAndSetVenueInView = () => {\n const venueInViewWithDistance = this.findVenueInView()\n if (\n venueInViewWithDistance &&\n (!this.#venueInView ||\n venueInViewWithDistance.venueId !== this.#venueInView)\n ) {\n this.#venueInView = venueInViewWithDistance.venueId\n this.map.fire(VENUE_EVENTS.VENUE_MOVEINTOVIEW, venueInViewWithDistance)\n }\n }\n\n set detectVenueInView(value) {\n if (value) {\n // Set initial venueInView\n this.#findAndSetVenueInView()\n this.map.on(\"moveend\", this.#findAndSetVenueInView)\n } else {\n this.map.off(\"moveend\", this.#findAndSetVenueInView)\n }\n }\n\n set billboards(value) {\n this.#billboards = value\n }\n\n set mapDecorations(value) {\n this.#mapDecorations = value\n }\n\n set pixelRatio(value: number) {\n this.map.setDevicePixelRatio(value)\n }\n\n set onClickElement(func) {\n this.rendererManager.onClickElement = func\n }\n\n set locale(value: string) {\n this.#locale = value || defaultOptions.locale\n\n // Update elements affected by locale changes.\n this.updateUserLocationSymbolByLocale(this.#locale)\n }\n\n /**\n * Private internal methods\n */\n\n #clearElements() {\n LAYERS.forEach((layerKey) => {\n this.#clearAllElementOnLayerByName(layerKey)\n })\n const scene = this.threeLayer.getScene()\n if (scene) {\n scene.children = scene.children.filter(\n (children) => children instanceof PerspectiveCamera\n )\n }\n }\n\n handleClickElement = (e) => {\n if (this.#isClicked) return\n this.#isClicked = true\n const onClickElement = this.#onClickElement\n if (!_.isFunction(onClickElement)) return\n this.#onClickElement(e)\n this.#isClicked = false\n }\n\n async #legacy_createElements() {\n const {\n // 2D\n createOpening,\n createSection,\n createDecoration,\n // 3D\n create3DBillboard,\n create3DAmenityMarker,\n create3DOpeningMarker,\n } = this.#styler\n\n let elements = {}\n let object3ds = []\n\n for (const feature of this.#features) {\n try {\n const { feature_type: featureType, properties, id } = feature\n const layerName = _.get(\n LAYER_FEATURE_TYPE_OBJ,\n featureType,\n featureType\n )\n const layer = this.map.getLayer(layerName)\n let geometry\n const category = _.get(feature, \"properties.category\")\n\n const extrudeConfig = _.get(this.#mapConfig, \"extrude\")\n const textMarkerType = _.get(\n this.#mapConfig,\n \"text_marker_type\",\n \"ui-marker\"\n )\n const featureExtrudeConfig = getExtrudeConfigByFeature(\n extrudeConfig,\n feature\n )\n\n switch (featureType) {\n \n case \"amenity\": {\n if (feature.properties.is_featured) {\n const billboardObj = create3DBillboard(feature, this.threeLayer)\n billboardObj?.on(\"click\", this.handleClickElement)\n this.#billboardObjects.push(billboardObj)\n this.#spriteMarkerObjects.push(billboardObj)\n object3ds.push(billboardObj)\n break\n }\n const marker3d = create3DAmenityMarker(\n feature,\n this.threeLayer,\n extrudeConfig\n )\n marker3d?.on(\"click\", this.handleClickElement)\n this.#spriteMarkerObjects.push(marker3d)\n object3ds.push(marker3d)\n break\n }\n case \"opening\": {\n switch (category) {\n case \"emergencyexit\":\n const { geometry } = turfCenter(feature)\n const markerFeature = {\n ...feature,\n geometry,\n }\n const marker3d = create3DOpeningMarker(\n markerFeature,\n this.threeLayer,\n extrudeConfig\n )?.on(\"click\", this.handleClickElement)\n object3ds.push(marker3d)\n break\n default:\n }\n geometry = createOpening(feature)\n ?.on(\"click\", this.handleClickElement)\n .addTo(layer)\n break\n }\n case \"section\": {\n geometry = createSection(feature)?.addTo(layer)\n break\n }\n \n default:\n break\n }\n if (!id) throw new Error(`Property is missing ID, ${id}`)\n elements[id] = { geometry, properties, featureType, feature }\n } catch (err) {\n console.warn(`Cannot create ${feature.id}: ${err.message}`)\n }\n }\n\n this.#mapDecorations.forEach((decoration) => {\n const { id, geometry, properties } = decoration\n const geometryType = decoration?.geometry?.type\n try {\n switch (geometryType) {\n case \"Point\":\n const createdBillboard = create3DBillboard(\n decoration,\n this.threeLayer\n )\n this.#billboardObjects.push(createdBillboard)\n object3ds.push(createdBillboard)\n break\n default:\n const decorationLayer = this.map.getLayer(`base`)\n const createdDecoration = createDecoration(geometry, {\n id,\n ...properties,\n }).addTo(decorationLayer)\n elements[id] = {\n geometry: createdDecoration,\n properties,\n featureType: \"decoration\",\n }\n break\n }\n } catch (error) {\n console.log(\n \"error creating decoration for \",\n decoration.properties.name\n )\n }\n })\n\n // Initiate Canvas render\n this.#elements = elements\n this.#elementsLoaded = true\n this.#featuresInitted = true\n this.#object3ds = object3ds\n if (typeof this.onMapReady === \"function\") this.onMapReady()\n }\n\n #clearAllElementOnLayerByName = (layerName: string) => {\n const layer = this.map.getLayer(layerName) as VectorLayer\n if (layer) layer.clear()\n }\n\n /**\n * Change Level & animate to path / geometry / view / etc.\n * ================================== */\n changeLevelByOrdinal(ordinal: null | number | number[]): void {\n this.rendererManager.changeLevelByOrdinal(ordinal)\n }\n\n findVenueInView = (): { venueId: string; distance: number } => {\n const mapCenter = this.map.getCenter()\n const result = this.#venues.reduce<{\n venueId: string\n distance: number\n } | null>((closest, venue) => {\n const { display_point: displayPoint } = venue.properties\n const distance = turfDistance(displayPoint, [mapCenter.x, mapCenter.y])\n if (!closest || distance < closest.distance) {\n return { venueId: venue.id, distance }\n }\n return closest\n }, null)\n return result\n }\n\n getLineStringBearing = (feature) => {\n const { geometry } = feature\n const path = new LineString(geometry.coordinates)\n return getBearingBetweenPoints(\n path.getFirstCoordinate(),\n path.getLastCoordinate()\n )\n }\n\n //map animation\n addAnimations(animation: { id: string; callback: () => void }) {\n this.#animationsToRun.push(animation)\n }\n\n removeAnimationById(id: string) {\n this.#animationsToRun = this.#animationsToRun.filter(\n (animation) => animation.id !== id\n )\n }\n\n clearAnimations() {\n this.#animationsToRun = []\n }\n\n /**\n * User Location\n ****************************/\n // TODO: To consider if we should use setter `set userLocation` instead?\n\n addUserLocation(value) {\n const { createUserLocationMarker } = this.#styler\n\n this.#userLocationGeometry = value\n\n const { properties, feature_type } = value\n\n // If UserLocationGeometry not exists, create one.\n\n const markerLayer = this.map.getLayer(USER_LOCATION_LAYER_NAME)\n\n if (!this.#userLocationElement?.geometry && markerLayer) {\n const geometry = createUserLocationMarker(value)\n geometry.addTo(markerLayer)\n\n // Add marker to this.#elements\n const element = {\n geometry,\n properties,\n featureType: feature_type,\n feature: value,\n }\n this.#elements[USER_LOCATION_ELEMENT_ID] = element\n this.#userLocationElement = element\n\n this.updateUserLocationSymbolByLocale(this.locale)\n }\n }\n\n updateUserLocationSymbolByLocale(locale: string) {\n const userLocationGeometry = _.get(\n this.#elements,\n `${USER_LOCATION_ELEMENT_ID}.geometry`\n )\n\n if (!userLocationGeometry) return\n\n const currentSymbol = userLocationGeometry.getSymbol()\n\n /**\n * Localized user location marker example.\n * Supports locale-based marker files.\n *\n * Example:\n * {\n * \"markerFile\": \"logo_url\", // Default marker\n * \"locale_symbol\": { \"th\": { \"markerFile\": \"logo_url\" }, \"default\": { \"markerFile\": \"logo_url\" } }\n * }\n */\n const localeSymbolToUpdate = currentSymbol.map((symbol) => {\n const localeSymbol =\n _.get(symbol, `${LOCALE_SYMBOL_KEY}.${locale}`) ||\n _.get(symbol, `${LOCALE_SYMBOL_KEY}.default`)\n if (!_.isPlainObject(localeSymbol)) return symbol\n\n return {\n ...symbol,\n ...localeSymbol,\n }\n })\n userLocationGeometry?.updateSymbol(localeSymbolToUpdate)\n }\n\n removeUserLocation() {\n this.#userLocationGeometry = null\n if (this.#userLocationElement) {\n const { geometry } = this.#userLocationElement\n if (geometry) geometry.remove()\n\n this.#userLocationElement = null\n this.#elements[USER_LOCATION_ELEMENT_ID] = null\n }\n }\n\n showUserLocationMarker() {\n this.#userLocationElement?.geometry.show()\n }\n\n hideUserLocationMarker() {\n this.#userLocationElement?.geometry.hide()\n }\n\n addLastUserLocation(value) {\n const newLastLocationId = value?.id\n // If the last location ID is undefined or exists, no new marker will be added.\n const isExists =\n this.#lastUserLocationGeometries.findIndex(\n ({ feature }) => feature?.id === newLastLocationId\n ) >= 0\n\n if (!newLastLocationId || isExists) return\n\n const { createLastUserLocationMarker } = this.#styler\n\n this.#lastUserLocationGeometries = [\n ...this.#lastUserLocationGeometries,\n value,\n ]\n\n const { properties, feature_type, id } = value\n\n const markerLayer = this.map.getLayer(USER_LOCATION_LAYER_NAME)\n\n const geometry = createLastUserLocationMarker(value)\n if (!geometry) return\n geometry.addTo(markerLayer)\n\n // Add marker to this.#elements\n const element = {\n geometry,\n properties,\n featureType: feature_type,\n feature: value,\n }\n this.#elements[`${LAST_USER_LOCATION_ELEMENT_ID_PREFIX}${id}`] = element\n this.#lastUserLocationElements = [\n ...this.#lastUserLocationElements,\n element,\n ]\n }\n\n removeLastUserLocation() {\n this.#lastUserLocationGeometries = []\n if (\n this.#lastUserLocationElements &&\n this.#lastUserLocationElements.length > 0\n ) {\n for (const lastUserLocationElem of this.#lastUserLocationElements) {\n const { geometry, properties = {} } = lastUserLocationElem\n if (geometry) {\n geometry.remove()\n delete this.#elements[`last_user_location-${properties?.id}`]\n }\n }\n this.#lastUserLocationElements = []\n }\n }\n\n hideLastUserLocationMarker() {\n for (const lastUserLocationElem of this.#lastUserLocationElements) {\n const { geometry } = lastUserLocationElem\n if (geometry) geometry.hide()\n }\n }\n\n /**\n * END of User Location\n ****************************/\n\n showGeometryByElementId = (elementId): void => {\n const geometry: Geometry | undefined = _.get(\n this.#elements,\n `${elementId}.geometry`\n )\n if (geometry) geometry.show()\n }\n\n hideGeometryByElementId = (elementId): void => {\n const geometry: Geometry = _.get(this.#elements, `${elementId}.geometry`)\n if (geometry) geometry.hide()\n }\n\n setSpriteMarkersOpacity = (opacity: number = 1): void => {\n const spriteMarkerObjects = this.#spriteMarkerObjects\n spriteMarkerObjects?.forEach((baseObject) => {\n baseObject.getObject3d().traverse((child) => {\n if (child.isLine || child.isSprite) {\n child.material.opacity = opacity\n }\n })\n })\n }\n\n setFeatureObject3DsOpacity = (opacity: number = 1): void => {\n const objects = this.#object3ds\n objects?.forEach((baseObject) => {\n if (baseObject instanceof NavigationPath) return\n baseObject.getObject3d().traverse((child) => {\n if (child.isMesh === true) {\n child.material.opacity = opacity\n }\n })\n })\n }\n\n /*\n * Enable or disable the fading effect based on the zoom level for all layers except the Venue Model.\n * This function applies when extruded units exceed the edges of the Venue Model while zooming out.\n * It can be enabled only when the Venue Model is present.\n */\n disableLayersFadingOnZoom = (): void => {\n this.#isLayersFadingOnZoom = false\n }\n\n enableLayersFadingOnZoom = (): void => {\n this.#isLayersFadingOnZoom = this.#venueObjects.length !== 0\n }\n\n /**\n * Navigation\n ****************************/\n combineNearbyLineStrings(\n lineStrings: Feature<LineStringType, GeoJsonProperties>[],\n options: {\n properties?: GeoJsonProperties\n distance?: number\n } = { properties: {}, distance: 0.0003 }\n // 0.0003 = 30cm\n ) {\n const { properties = {}, distance = 0.0003 } = options || {}\n const combinedLineStrings = []\n const accLine = []\n if (lineStrings.length === 1) return lineStrings\n\n for (let i = 0; i < lineStrings.length; i++) {\n const line = lineStrings[i]\n const coords = line.geometry.coordinates\n const prevLine = lineStrings[i - 1]\n const firstCoord = _.first(coords)\n const isFirstLine = i === 0\n\n if (isFirstLine) {\n accLine.push(...coords)\n continue\n }\n\n const prevLastCoord = _.last(prevLine.geometry.coordinates)\n const isNearby =\n turfDistance(point(firstCoord), point(prevLastCoord)) < distance\n\n if (!isNearby) {\n const remainingLines = lineStrings.slice(i)\n const res = this.combineNearbyLineStrings(remainingLines, properties)\n combinedLineStrings.push(...res)\n break\n }\n accLine.push(...coords)\n }\n combinedLineStrings.push(lineString(accLine, properties))\n return combinedLineStrings\n }\n\n createNavigationGeometries = (stepGeometries, destinationFeature) => {\n const {\n createOriginMarker,\n createDestinationPinMarker,\n createDestinationLogoMarker,\n create3DStepPath,\n } = this.#styler\n const routeMarkerLayer = this.map.getLayer(HIGHLIGHT_LAYER_NAME)\n\n const linesByOrdinal = _(stepGeometries)\n .filter(({ geometry }) => geometry.type === \"LineString\")\n .groupBy(\"properties.ordinal\")\n .value()\n\n const joinedLines = _(linesByOrdinal).reduce((acc, lines, key) => {\n const joined = this.combineNearbyLineStrings(lines, {\n properties: { ordinal: +key },\n })\n return [...acc, ...joined]\n }, [])\n\n joinedLines.forEach((line, index) => {\n try {\n const navPath: NavigationPath = create3DStepPath(line, this.threeLayer)\n this.threeLayer.addMesh([navPath])\n this.#navigationGeometries[`line-${index}`] = navPath\n this.#object3ds.push(navPath)\n } catch (err) {\n console.log(err)\n }\n })\n\n stepGeometries.forEach((stepGeometry) => {\n const { geometry, properties, feature_type = null } = stepGeometry\n let stepElement\n try {\n switch (geometry.type) {\n // Create a destination marker and route path\n case \"Point\":\n switch (feature_type) {\n case \"origin-marker\":\n stepElement =\n createOriginMarker(stepGeometry).addTo(routeMarkerLayer)\n break\n case \"destination-marker\":\n const extrudeConfig = _.get(this.#mapConfig, \"extrude\")\n if (destinationFeature.feature_type === \"occupant\") {\n const stepId = _.get(stepGeometry, \"id\")\n // !Update step ID to occupant destination feature ID to prevent unexpected clearing of occupant element from map\n const normalizedDestinationFeature = {\n ...destinationFeature,\n id: stepId,\n }\n const logoUrl = _.get(\n normalizedDestinationFeature,\n \"properties.logo.url\"\n )\n const createOccupantDestinationMarkerFn = logoUrl\n ? createDestinationLogoMarker\n : createDestinationPinMarker\n stepElement = createOccupantDestinationMarkerFn(\n normalizedDestinationFeature,\n { extrudeConfig }\n ).addTo(routeMarkerLayer)\n break\n }\n stepElement = createDestinationPinMarker(destinationFeature, {\n extrudeConfig,\n }).addTo(routeMarkerLayer)\n break\n default:\n this.#navigationGeometries[stepGeometry.id] = stepElement\n break\n }\n break\n default:\n break\n }\n if (stepElement) {\n const { id, feature_type: featureType } = stepGeometry\n // Add tot Elements object\n this.#elements[id] = {\n geometry: stepElement,\n featureType,\n properties: { ...stepGeometry, ...properties },\n }\n //\n }\n } catch (err) {\n // console.log(err, {\n // index: index,\n // stepGeometries,\n // })\n // throw err;\n console.log(err)\n }\n })\n }\n\n createOverviewStepPathByOrdinal = (stepGeometries, viewingOrdinal) => {\n const { createLineStringFromGeometries } = this.#styler\n const initialStepGeometries = stepGeometries\n .filter(({ properties }) => properties.ordinal === viewingOrdinal)\n .map(({ geometry }) => geometry)\n return createLineStringFromGeometries(initialStepGeometries)\n }\n\n clearNavigationGeometries(): void {\n // Remove origin and destination markers from the highlight layer\n const routeMarkerLayer = this.map.getLayer(\n HIGHLIGHT_LAYER_NAME\n ) as OverlayLayer\n const originMarkerGeometry = _.get(\n this.#elements,\n `${ORIGIN_MARKER_ID}.geometry`\n )\n const destinationMarkerGeometry = _.get(\n this.#elements,\n `${DESTINATION_MARKER_ID}.geometry`\n )\n const geometriesToRemove = _.compact([\n originMarkerGeometry,\n destinationMarkerGeometry,\n ])\n\n routeMarkerLayer.removeGeometry(geometriesToRemove)\n\n this.#elements[ORIGIN_MARKER_ID] = null\n this.#elements[DESTINATION_MARKER_ID] = null\n\n // Filter out NavigationPath objects from the global this.#object3ds list\n this.#object3ds = this.#object3ds.filter(\n (obj) => !(obj instanceof NavigationPath)\n )\n\n // Remove related navigation geometry objects\n const objects = this.#navigationGeometries || {}\n _.forEach(objects, (obj) => {\n if (!obj) return\n this.#navigationGeometries[obj.properties.id] = null\n obj.remove()\n })\n }\n /**\n * END of Navigation\n ****************************/\n\n /**\n * hide/show venue 3dmodel\n **/\n\n hideVenueObjects = () => {\n this.showVenueObject = false\n }\n showVenueObjects = () => {\n this.showVenueObject = true\n }\n\n /**\n * Other functions\n */\n\n enableClick = () => this.map.config({ geometryEvents: true })\n disableClick = () => this.map.config({ geometryEvents: false })\n\n freeze = () => this.map.config({ zoomable: false, draggable: false })\n unfreeze = () => this.map.config({ zoomable: true, draggable: true })\n\n /**\n * render (frame)\n */\n \n render() {\n // TODO: Update User Location marker position\n const view = this.map.getView()\n const currBearing = view.bearing\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n // @ts-ignore\n this.threeLayer.redraw()\n }\n\n if (this.threeLayer) {\n const currentView = this.camera.getView()\n const objectOpacity = _.clamp(38 - 2 * currentView.zoom, 0, 1)\n\n this.#objects.forEach((object) => {\n object.getObject3d().traverse((child) => {\n if (child.isMesh) child.material.opacity = objectOpacity\n //TODO: recheck this line if it actually works\n /** set Mesh visible = false when opacity is 0\n * and true when opacity > 0\n */\n child.visible = !!objectOpacity\n })\n object.getObject3d().visible = !!objectOpacity\n })\n\n if (this.#billboardObjects) {\n this.#billboardObjects.forEach((object) => {\n const objectScale = _.clamp(\n 20 - 1 * currentView.zoom,\n 1,\n 1.05\n )\n object.getObject3d().scale.set(objectScale, objectScale, 1)\n })\n }\n\n /*\n * The layer appears while zooming in and disappears when zooming out,\n * fully vanishing when the Venue Model is visible (opacity: 1).\n */\n if (this.#isLayersFadingOnZoom) {\n const layerOpacity = _.clamp(1 - objectOpacity, 0, 1)\n // Fading 2D layers.\n LAYERS.forEach((layerKey) => {\n const layer = this.map.getLayer(layerKey)\n if (layer) layer.setOpacity(layerOpacity)\n })\n\n // Fading 3D units, such as extruded units.\n this.setFeatureObject3DsOpacity(layerOpacity)\n\n // Fading sprite markers, such as billboards and amenity markers.\n this.setSpriteMarkersOpacity(layerOpacity)\n }\n\n this.#venueObjects.forEach((object) => {\n object.getObject3d().traverse((child) => {\n if (child.isMesh) child.material.opacity = objectOpacity\n /** set Mesh visible = false when opacity is 0\n * and true when opacity > 0\n */\n child.visible = this.showVenueObject && objectOpacity > 0.4\n })\n })\n\n // // Update bearing to each GroundLabel to determine if text should flip or not\n // this.#groundObjects.forEach((gLabel) => {\n // gLabel.bearing = currBearing\n // })\n }\n\n this.#animationsToRun.forEach(({ callback }) => callback(this))\n\n //update TWEEN.js animaton\n TWEEN.update()\n\n requestAnimationFrame(this.render.bind(this))\n }\n}\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in meters. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import { IHighlightOptions, ISetHighlight2DElementIdsOptions } from \"./types\"\n\nconst defaultLayerOption = { enableAltitude: true }\n\nconst VENUE = \"venue\"\nconst LEVEL = \"level\"\nconst UNIT = \"unit\"\nconst FIXTURE = \"fixture\"\nconst KIOSK = \"kiosk\"\nconst OPENING = \"opening\"\nconst SECTION = \"section\"\nconst FOOTPRINT = \"footprint\"\n\nconst AMENITY = \"amenity\"\nconst OCCUPANT = \"occupant\"\n\nconst GEOLOCATION = \"geolocation\"\nconst ORIGIN_MARKER = \"origin-marker\"\nconst DESTINATION_MARKER = \"destination-marker\"\n\nconst DECORATION = \"decoration\"\n\nexport const BASE_LAYER_NAME = \"base\"\nexport const POI_MARKER_LAYER_NAME = \"poi\"\nexport const MARKER_LAYER_NAME = \"marker\"\nexport const HIGHLIGHT_LAYER_NAME = \"highlight\"\nexport const USER_LOCATION_LAYER_NAME = \"user_location\"\n\nexport const ORIGIN_MARKER_ID = \"master-origin-marker\"\nexport const DESTINATION_MARKER_ID = \"master-destination-marker\"\nexport const USER_LOCATION_ELEMENT_ID = \"user_location\"\nexport const LAST_USER_LOCATION_ELEMENT_ID_PREFIX = \"last_user_location-\"\n\nexport const LOCALE_SYMBOL_KEY = \"locale_symbol\"\nexport const DEFAULT_LOCALE = \"en\"\n\nexport const LAYERS = [\n BASE_LAYER_NAME,\n POI_MARKER_LAYER_NAME,\n HIGHLIGHT_LAYER_NAME,\n USER_LOCATION_LAYER_NAME,\n]\n\nexport const LAYER_OPTIONS = {\n [BASE_LAYER_NAME]: {\n ...defaultLayerOption,\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n forceRenderOnZooming: true,\n },\n [POI_MARKER_LAYER_NAME]: {\n ...defaultLayerOption,\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n forceRenderOnZooming: true,\n zIndex: 10,\n collision: true,\n collisionDelay: 1200,\n },\n [MARKER_LAYER_NAME]: { ...defaultLayerOption },\n [HIGHLIGHT_LAYER_NAME]: { ...defaultLayerOption, zIndex: 98 },\n [USER_LOCATION_LAYER_NAME]: { ...defaultLayerOption, zIndex: 99 },\n}\n\nexport const LAYER_FEATURE_TYPE_OBJ = {\n [VENUE]: BASE_LAYER_NAME,\n [LEVEL]: BASE_LAYER_NAME,\n [UNIT]: BASE_LAYER_NAME,\n [FIXTURE]: BASE_LAYER_NAME,\n [KIOSK]: BASE_LAYER_NAME,\n [OPENING]: BASE_LAYER_NAME,\n [SECTION]: BASE_LAYER_NAME,\n [FOOTPRINT]: BASE_LAYER_NAME,\n [AMENITY]: MARKER_LAYER_NAME,\n [OCCUPANT]: POI_MARKER_LAYER_NAME,\n [GEOLOCATION]: USER_LOCATION_LAYER_NAME,\n [ORIGIN_MARKER]: HIGHLIGHT_LAYER_NAME,\n [DESTINATION_MARKER]: HIGHLIGHT_LAYER_NAME,\n [DECORATION]: BASE_LAYER_NAME,\n}\n\n/** Custom Venue Platform Events. Prefix with \"venue:\" to avoid collision */\nexport const VENUE_EVENTS = {\n VENUE_MOVEINTOVIEW: \"venue:venuemoveintoview\", // When a map is moved and a venue moved into a viewport\n}\n","import _ from \"lodash\"\nimport {\n Polygon,\n MultiPolygon,\n LineString,\n Marker,\n Coordinate,\n MultiLineString,\n ui,\n} from \"maptalks\"\nimport turfCenter from \"@turf/center\"\nimport turfBuffer from \"@turf/buffer\"\n\nimport {\n TextureLoader,\n SpriteMaterial,\n MeshLambertMaterial,\n} from \"three\"\n\nimport {\n SpriteMarker,\n Billboard,\n NavigationPath,\n} from \"../object3d\"\nimport { getCenterFromGeometry, createPolygonFromLineString } from \"./geometry\"\nimport { createSVGPathFromMarkerSymbol, svgToPng } from \"./svg\"\n\nconst GeometryType = {\n Polygon,\n MultiPolygon,\n}\n\nconst ORDINAL_HEIGHT = 0 // in version 3D change ORDINAL_HEIGHT for set altitude of geometry\n\nconst VENUE_Z_INDEX = 0\n\nconst LEVEL_Z_INDEX = 2\nconst UNIT_Z_INDEX = 3\nconst FIXTURE_Z_INDEX = 4\nconst DECORATION_Z_INDEX = 4\nconst KIOSK_Z_INDEX = 5\nconst OPENING_Z_INDEX = 3\nconst SECTION_Z_INDEX = 6\nconst USER_LOCATION_Z_INDEX = 99\nconst LAST_LOCATION_Z_INDEX = USER_LOCATION_Z_INDEX - 1\n\nconst PREFIX_HIGHLIGHTED_SYMBOL_KEY = \"highlighted\"\nconst SPRITE_MARKER_FEATURE = [\n \"amenity-atm\",\n \"amenity-babychanging\",\n \"amenity-strollerrental\",\n \"amenity-boardinggate.ferry\",\n \"amenity-elevator\",\n \"amenity-escalator\",\n \"amenity-stairs\",\n \"amenity-information\",\n \"amenity-information.transit\",\n \"amenity-wheelchair\",\n \"amenity-restroom\",\n \"amenity-restroom.male\",\n \"amenity-restroom.female\",\n \"amenity-restroom.wheelchair\",\n \"amenity-restroom.family\",\n \"amenity-restroom.unisex\",\n \"amenity-taxi\",\n \"amenity-groundtransportation\",\n \"amenity-bus\",\n \"amenity-bus.muni\",\n \"amenity-shuttle\",\n \"amenity-parking\",\n \"amenity-parking.shortterm\",\n \"amenity-parking.longterm\",\n \"amenity-parking.waitingarea\",\n \"amenity-parking.compact\",\n \"amenity-parking.ev\",\n \"amenity-parking.bicycle\",\n \"amenity-parking.motorcycle\",\n \"amenity-privatelounge\",\n \"amenity-rideshare\",\n \"amenity-valet\",\n \"amenity-landmark\",\n \"amenity-rail.muni\",\n \"amenity-service\",\n \"amenity-smokingarea\",\n \"amenity-ticketing\",\n \"amenity-meetingpoint\",\n \"amenity-prayerroom\",\n \"amenity-firstaid\",\n \"amenity-ticketing.rail\",\n \"amenity-exhibit\",\n \"amenity-mothersroom\",\n \"amenity-checkin.desk\",\n \"amenity-baggagestorage\",\n \"amenity-baggagecarts\",\n \"amenity-library\",\n \"amenity-coinlocker\",\n \"amenity-powerchargingstation\",\n \"amenity-wheelchairassit\",\n \"amenity-lostandfound\",\n \"amenity-foodservice\",\n \"amenity-businesscenter\",\n \"amenity-guestservices\",\n \"amenity-emergencyshelter\",\n \"amenity-prayerroom.buddhism\",\n \"amenity-defibrillator\",\n \"amenity-drinkingfountain\",\n \"amenity-handsanitizerstation\",\n \"amenity-unspecified\",\n \"amenity-entry\",\n \"amenity-fireextinguisher\",\n \"amenity-security\",\n \"amenity-seating\",\n \"amenity-copymachine\",\n \"amenity-fieldofplay\",\n \"amenity-fieldofplay.soccer\",\n \"amenity-amphitheater\",\n \"amenity-hoteling\",\n \"occupant-currencyexchange\",\n \"occupant-donationcenter\",\n \"occupant-bank\",\n \"occupant-books\",\n \"occupant-postoffice\",\n \"opening-emergencyexit\",\n]\n\nconst SPRITE_HIGHLIGHT_MARKER_FEATURE = SPRITE_MARKER_FEATURE.map(\n (featCate) =>\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${featCate.split(\"-\").join(\".\")}`\n)\n\nconst OCCUPANT_TEXT_MARKER_CLASSNAME = \"mtk-occupant-text-marker\"\n\nconst getAltitude = (properties) =>\n Math.max(0, properties.ordinal * ORDINAL_HEIGHT || 0)\n\nconst createRoomUnit = (feature, style, options) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n })\n}\n\n\nconst createNonpublicUnit = (feature, style, options = {}) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n })\n}\nconst createWalkwayUnit = (feature, style, options) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: {\n ...symbolStyle,\n },\n })\n}\n\nconst createWaterFixture = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n zIndex,\n })\n}\n\nconst createVegetationFixture = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...symbolStyle,\n },\n zIndex,\n })\n}\n\nconst createObstructionalFixture = (feature, style = {}, options = {}) => {\n const { geometry, properties = {} } = feature\n const { model3d } = properties\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n if (!_.isEmpty(model3d)) return\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n //create polygon with line-offset if geometry is lineString\n if (geometry.type === \"LineString\") {\n const polygon = createPolygonFromLineString(geometry)\n return new GeometryType[\"Polygon\"](polygon, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n zIndex,\n })\n }\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n zIndex,\n })\n}\n\nconst createVegetationSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst creatingSeatingSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst creatingDefaultSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n try {\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n } catch (error) {\n console.warn(`Error creatingDefaultSection`, geometry.type)\n }\n}\n\nconst createEatingDrinkingSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst createPrincipalOpening = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating pedestrian principal opening:`, feature)\n }\n}\n\nconst createEmergencyExitOpening = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating emergency exit opening:`, feature)\n }\n}\nconst createPedestrianOpening = (feature, style, options = {}) => {\n const { geometry, properties, id } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n id,\n feature_type: \"opening\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating pedestrian opening:`, feature)\n }\n}\n\nconst createExtrudePolygon = (\n geometry,\n threeLayer,\n material,\n height,\n properties = {},\n options\n) => {\n const { offset = 0, altitude = 0 } = options\n const offsetGeometry = turfBuffer(geometry, offset, { units: \"meters\" })\n const object = threeLayer.toExtrudePolygon(\n offsetGeometry,\n { height, async: true, altitude },\n material\n )\n object.properties = properties\n return object\n}\n\nconst create3DMarker = (\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n) => {\n return new SpriteMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n}\n\n/**\n * Retrieves the extrude configuration for a feature.\n *\n * @param {Object} baseExtrudeConfig - The default extrude configuration defined in the map settings within the app config content type.\n * @param {Object} feature - The target feature object for which the extrude value is required.\n * @returns {Object|undefined} - The extrude value from the feature's `properties` field, or the base extrude configuration as a fallback if not defined.\n */\nexport const getExtrudeConfigByFeature = (baseExtrudeConfig, feature = {}) => {\n const { feature_type: featureType } = feature\n // Retrieve extrude configuration from the extrude field in the feature's properties\n const featureExtrudeConfig = _.get(feature, \"properties.extrude\")\n\n // Retrieve extrude configuration from the base extrude settings. (Map Config)\n const featureCategory = _.get(feature, \"properties.category\")\n const baseFeatureExtrudeConfig = _.get(\n baseExtrudeConfig,\n `${featureType}.${featureCategory || featureType}`\n )\n\n // Fallback to base extrude configuration if the feature's extrude field is not defined.\n return featureExtrudeConfig ?? baseFeatureExtrudeConfig\n}\n\nconst getFeatureMarkerConfig = (feature, mapConfig = {}) => {\n const { textMarkerType, extrudeConfig = {}, symbol } = mapConfig\n\n const location = getLocationByFeature(feature)\n const featureExtrudeConfig = getExtrudeConfigByFeature(\n extrudeConfig,\n location\n )\n\n return {\n markerSymbol: symbol,\n textMarkerType,\n featureExtrudeConfig,\n }\n}\n\nexport const createSpriteMaterialByLabelSymbol = (labelSymbol = []) => {\n const material = new SpriteMaterial()\n try {\n const [base, icon] = labelSymbol\n const { markerWidth: baseWidth = 24 } = base\n const { markerWidth: iconWidth = 24 } = icon\n const viewBoxDimension = Math.max(baseWidth, iconWidth)\n\n const baseSVG = createSVGPathFromMarkerSymbol(base)\n const iconSVG = createSVGPathFromMarkerSymbol(icon)\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${viewBoxDimension}\" height=\"${viewBoxDimension}\">${baseSVG}${iconSVG}</svg>`\n const textureLoader = new TextureLoader()\n const scaleFactor = 200 / 24 // Scale factor to upscale from 24px to 200px to ensure the resolution is high enough\n\n svgToPng(svg, scaleFactor).then((png) => {\n const texture = textureLoader.load(png, () => {\n material.map = texture\n material.needsUpdate = true\n })\n })\n } catch (error) {\n console.warn(`Error createSpriteMaterialByLabelSymbol: `, labelSymbol)\n }\n return material\n}\n\nexport const createStyledUIMarkerElement = ({\n style,\n textContent,\n className,\n}) => {\n const element = document.createElement(\"div\")\n for (const key in style) {\n element.style[key] = style[key]\n }\n element.className = className\n element.textContent = textContent\n //! Use outerHTML to return HTML string instead of element object to avoid DOM event warnings from Maptalks.js.\n return element.outerHTML\n}\n\nexport const styledFeatureGenerator = (mapTheme) => {\n const getElementSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.geometry.symbol`)\n if (featureType === key) return featureTypeTheme\n const categoryTheme = _.get(mapTheme, `${key}.geometry.symbol`)\n return _.merge({}, featureTypeTheme, categoryTheme)\n }\n\n const getLabelSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.label`)\n const categoryTheme = _.get(mapTheme, `${key}.label`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n let symbols = _.values(_.map(mergedSymbol, \"symbol\"))\n const markerIndexToMove = symbols.findIndex(\n ({ elementType }) => elementType === \"label.marker\"\n )\n\n // Move the label.marker symbol to the last of array\n if (markerIndexToMove >= 0) {\n const markerSymbolToMove = _.pullAt(symbols, markerIndexToMove)[0]\n symbols.push(markerSymbolToMove)\n }\n\n return symbols\n }\n\n const getUIMarkerSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.ui.marker`)\n const categoryTheme = _.get(mapTheme, `${key}.ui.marker`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n const symbol = _.get(mergedSymbol, \"symbol\")\n return symbol\n }\n const getUIMarkerOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.ui.marker`)\n const categoryTheme = _.get(mapTheme, `${key}.ui.marker`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n const options = _.get(mergedSymbol, \"options\")\n return options\n }\n\n const getLabelOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeSymbol = _.get(mapTheme, `${featureType}.label`)\n const categorySymbol = _.get(mapTheme, `${key}.label`)\n const mergedSymbol = _.merge({}, featureTypeSymbol, categorySymbol)\n return _.reduce(\n mergedSymbol,\n (acc, symbol) => ({ ...acc, ..._.get(symbol, \"options\", {}) }),\n {}\n )\n }\n\n const generateSpriteMarkerMaterial = () => {\n return SPRITE_MARKER_FEATURE.reduce((acc, featCate) => {\n const [featureType, category] = featCate.split(\"-\")\n const key = `${featureType}.${category}`\n const labelSymbol = getLabelSymbol(key)\n const material = createSpriteMaterialByLabelSymbol(labelSymbol)\n return { ...acc, [key]: material }\n }, {})\n }\n\n const generateSpriteHighlightMarkerOption = () => {\n return SPRITE_HIGHLIGHT_MARKER_FEATURE.reduce((acc, featCate) => {\n const categoryKey = _.last(featCate.split(\"-\")) // Example: highlighted-amenity.atm -> amenity.atm\n const defaultLabelSymbol = getLabelSymbol(categoryKey)\n const highlightLabelSymbol = getLabelSymbol(featCate)\n const [defaultBase, defaultIcon] = defaultLabelSymbol\n const [highlightBase, highlightIcon] = highlightLabelSymbol\n const base = _.merge({}, defaultBase, highlightBase)\n const icon = _.merge({}, defaultIcon, highlightIcon)\n\n const material = createSpriteMaterialByLabelSymbol([base, icon])\n const options = getLabelOptions(featCate)\n return { ...acc, [featCate]: { material, options } }\n }, {})\n }\n\n const spriteMarkerMaterialObj = generateSpriteMarkerMaterial()\n const spriteHighlightMarkerOptionObj = generateSpriteHighlightMarkerOption()\n\n const getElementOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeOptions = _.get(\n mapTheme,\n `${featureType}.geometry.options`\n )\n\n const categoryOptions = _.get(mapTheme, `${key}.geometry.options`)\n\n return _.merge({}, featureTypeOptions, categoryOptions)\n }\n\n const createOccupantMarker = (feature, locatedFeature, mapConfig) => {\n const { textMarkerType, featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\", 0)\n const { properties, id, feature_type } = feature\n if (!properties.anchor) return\n\n /**\n * Prepare geometry for occupant marker positioning:\n * - Use anchor coordinates if the location feature is the main location\n * - Otherwise, use the center of the location feature\n */\n const mainLocationId =\n _.get(properties, \"unit.id\") || _.get(properties, \"kiosk.id\")\n const isMainLocationFeature = mainLocationId === locatedFeature?.id\n const { geometry: mainLocationGeometry } = properties?.anchor\n const geometry = isMainLocationFeature\n ? mainLocationGeometry\n : turfCenter(locatedFeature)?.geometry\n\n const baseProperties = {\n id,\n feature_type,\n category: properties.category,\n altitude: getAltitude(properties),\n }\n const occupantName = _.isEmpty(properties.short_name)\n ? properties.name\n : properties.short_name\n\n if (locatedFeature) {\n const { feature_type, properties } = locatedFeature\n const { category } = properties\n const locatedLabelOption =\n feature_type === \"kiosk\"\n ? getLabelOptions(`${feature_type}`)\n : getLabelOptions(`${feature_type}.${category}`)\n const { hidden = false } = locatedLabelOption || {}\n if (hidden) return\n }\n\n const getValidatedRenderType = (requestedType, logoUrl) => {\n // If requestType is \"Logo\" or \"Logo + Name\" and no logo, fallback to \"Name\"\n if (requestedType === \"Logo\" || requestedType === \"Logo + Name\") {\n return logoUrl ? requestedType : \"Name\"\n }\n return requestedType\n }\n\n const logoUrl = _.get(properties, \"logo.url\")\n const requestedRenderType = _.get(properties, \"render_type\", \"Name\")\n const renderType = getValidatedRenderType(requestedRenderType, logoUrl)\n if (renderType === \"Label\") return null\n\n const renderPriority = properties.render_priority || 3\n const labelSymbol = getLabelSymbol(`occupant-${_.toLower(renderType)}`)\n const markerSymbol = _.last(labelSymbol)\n\n const coordinates = _.get(geometry, \"coordinates\")\n\n const priorityLabelSymbol = getLabelSymbol(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n const priorityMarkerSymbol = _.last(priorityLabelSymbol) || {}\n\n switch (renderType) {\n case \"Logo\":\n _.set(priorityMarkerSymbol, \"markerFile\", logoUrl)\n\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: priorityLabelSymbol,\n })\n\n case \"Logo + Name\":\n return new Marker(coordinates, {\n properties: {\n name: occupantName.en,\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: {\n textName: \"{name}\",\n markerFile: logoUrl,\n textHaloRadius: {\n stops: [\n [20, 1],\n [21, 2],\n ],\n },\n ...markerSymbol,\n ...priorityMarkerSymbol,\n },\n })\n case \"None\":\n return new ui.UIMarker(coordinates, {\n properties: { ...baseProperties },\n content: createStyledUIMarkerElement({\n style: { display: \"none\" },\n textContent: occupantName.en,\n }),\n altitude: getAltitude(properties) + markerHeight,\n })\n case \"Name\":\n default:\n if (textMarkerType === \"marker\") {\n return new Marker(coordinates, {\n properties: {\n name: occupantName.en,\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: {\n textName: \"{name}\",\n //TODO:: implement symbol scaler later\n textHaloRadius: {\n stops: [\n [20, 1],\n [21, 2],\n ],\n },\n ...markerSymbol,\n ...priorityMarkerSymbol,\n },\n })\n }\n\n const uiMarkerSymbol = getUIMarkerSymbol(\n `occupant-${_.toLower(renderType)}`\n )\n const uiMarkerPrioritySymbol = getUIMarkerSymbol(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n const uiMarkerPriorityOptions = getUIMarkerOptions(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n\n const style = { ...uiMarkerSymbol, ...uiMarkerPrioritySymbol }\n return new ui.UIMarker(coordinates, {\n properties: { ...baseProperties },\n content: createStyledUIMarkerElement({\n style,\n textContent: occupantName.en,\n className: OCCUPANT_TEXT_MARKER_CLASSNAME,\n }),\n collision: true,\n collisionFadeIn: true,\n altitude: getAltitude(properties) + markerHeight,\n ...uiMarkerPriorityOptions,\n })\n }\n }\n\n const getFeatureProperties = (feature) => {\n const { id, feature_type, properties } = feature\n const { category, ordinal, style = {} } = properties\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const { allowOverride } = getElementOptions(`${feature_type}.${category}`)\n if (allowOverride) _.merge(elementStyle, style)\n const { polygonFill: color } = elementStyle\n const featureProperty = {\n id,\n feature_type,\n category: category || feature_type,\n ordinal,\n defaultColor: color,\n }\n return featureProperty\n }\n\n return {\n getElementSymbol,\n getHilighPolygonalSymbol: (type) => {\n switch (type) {\n case \"MultiPolygon\":\n case \"Polygon\": {\n return getElementSymbol(\"hilight-polygonal\")\n }\n case \"Point\": {\n return getElementSymbol(\"hilight-marker\")\n }\n default:\n break\n }\n },\n getHighlightMarkerSymbol: () => {\n return getElementSymbol(\"highlighted-marker\")\n },\n createVenue: (feature) => {\n const { geometry, feature_type } = feature\n const symbolStyle = getElementSymbol(feature_type)\n return new GeometryType[geometry.type](geometry.coordinates, {\n symbol: {\n ...symbolStyle,\n },\n zIndex: VENUE_Z_INDEX,\n })\n },\n\n createLevel: (feature) => {\n const { geometry, properties, feature_type } = feature\n const { category } = properties\n\n const style = getElementSymbol(`${feature_type}.${category}`)\n // const options = getElementOptions(`${feature_type}.${category}`)\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n zIndex: LEVEL_Z_INDEX,\n })\n },\n\n\n createMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const markerSymbol = getElementSymbol(\"pin-marker\")\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: markerSymbol,\n })\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n createOriginMarker: (feature) => {\n const { id, geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const markerSymbol = getElementSymbol(\"origin-marker\")\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n id,\n symbol: markerSymbol,\n })\n } catch (error) {\n console.log(`error creating origin marker:`, feature)\n }\n },\n createDestinationPinMarker: (feature, mapConfig) => {\n const { featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\")\n // Get Label from located unit / kiosk\n const { id, properties } = feature\n const geometry =\n _.get(feature, \"geometry\") ||\n _.get(feature, \"properties.anchor.geometry\")\n const coordinates = getCenterFromGeometry(geometry)\n const symbol = getElementSymbol(\"pin-marker\")\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n },\n id,\n symbol,\n })\n } catch (error) {\n console.log(`error creating destination marker:`, feature)\n }\n },\n createDestinationLogoMarker: (feature, mapConfig = {}) => {\n const { featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\", 0)\n\n // Get Label from located unit / kiosk\n const { properties, id } = feature\n const { geometry } = properties.anchor\n const logoUrl = _.get(properties, \"logo.url\")\n const coordinates = getCenterFromGeometry(geometry)\n const [markerBase, markerLabel] = getLabelSymbol(\n \"highlighted-logo-marker\"\n )\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n },\n id,\n symbol: [markerBase, { ...markerLabel, markerFile: logoUrl }],\n })\n } catch (error) {\n console.log(`error creating destination marker:`, feature)\n }\n },\n\n createUserLocationMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const symbolStyle = getElementSymbol(\"user-location\") || {}\n const marker = new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n ordinal: properties.ordinal !== null ? properties.ordinal : null,\n },\n symbol: symbolStyle.start,\n zIndex: USER_LOCATION_Z_INDEX,\n })\n\n marker.animate(\n {\n symbol: symbolStyle.end,\n },\n {\n repeat: true,\n easing: \"upAndDown\",\n duration: 1500,\n }\n )\n return marker\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n\n createLastUserLocationMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const symbolStyle = getElementSymbol(\"last-user-location\") || {}\n const options = getElementOptions(\"last-user-location\") || {}\n const marker = new Marker(coordinates, {\n properties: {\n ...options,\n altitude: getAltitude(properties),\n ordinal: properties.ordinal !== null ? properties.ordinal : null,\n },\n symbol: symbolStyle,\n zIndex: LAST_LOCATION_Z_INDEX,\n })\n\n return marker\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n\n createHighlightOccupantMarker: (feature, mapConfig) => {\n const { featureExtrudeConfig, markerSymbol } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\")\n const { id, feature_type, properties } = feature\n\n if (!properties.anchor) return\n\n const markerProperties = {\n ...properties,\n id,\n feature_type,\n altitude: getAltitude(properties) + markerHeight,\n }\n\n const { geometry } = properties?.anchor\n const coordinates = _.get(geometry, \"coordinates\")\n const logoUrl = _.get(properties, \"logo.url\")\n\n // If the symbol option is defined, create a marker.\n if (markerSymbol) {\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol: markerSymbol,\n })\n }\n\n //use pin-marker if no logo\n if (!logoUrl) {\n const symbol = getElementSymbol(\"pin-marker\")\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol,\n })\n }\n\n const labelSymbol = getLabelSymbol(\"highlight-occupant-logo\")\n const priorityMarkerSymbol = _.last(labelSymbol) || {}\n _.set(priorityMarkerSymbol, \"markerFile\", logoUrl)\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol: labelSymbol,\n })\n },\n createHighlight2DAmenityMarkerFrom3DMarker: (feature, mapConfig) => {\n const { coordinates, units, kiosk } = feature\n const amenityLocatedUnit = _.first(units)\n\n const unitConfig = getExtrudeConfigByFeature(\n mapConfig,\n amenityLocatedUnit\n )\n const unitHeight = _.get(unitConfig, \"height\", 0)\n const kioskConfig = getExtrudeConfigByFeature(mapConfig, kiosk)\n const kioskHeight = _.get(kioskConfig, \"height\", 0)\n\n const markerHeight = unitHeight + kioskHeight\n\n const symbol = getElementSymbol(\"highlight-amenity-marker\")\n return new Marker(coordinates, {\n properties: {\n ...feature,\n altitude: markerHeight,\n },\n symbol,\n })\n },\n\n createSection: (feature) => {\n const { properties, feature_type } = feature\n const { category } = properties\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n switch (category) {\n case \"eatingdrinking\":\n return createEatingDrinkingSection(feature, elementStyle)\n case \"vegetation\":\n return createVegetationSection(feature, elementStyle)\n case \"seating\":\n return creatingSeatingSection(feature, elementStyle)\n default:\n return creatingDefaultSection(feature, elementStyle)\n }\n },\n\n createOccupant: (feature, location, mapConfig) => {\n return createOccupantMarker(feature, location, mapConfig)\n },\n\n createOpening: (feature) => {\n const {\n feature_type,\n properties: { category },\n } = feature\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const options = {\n ...getElementOptions(`${feature_type}.${category}`),\n zIndex: OPENING_Z_INDEX,\n }\n switch (feature.properties.category) {\n case \"pedestrian\":\n return createPedestrianOpening(feature, elementStyle, options)\n case \"pedestrian.principal\":\n return createPrincipalOpening(feature, elementStyle, options)\n case \"emergencyexit\":\n return createEmergencyExitOpening(feature, elementStyle, options)\n default:\n break\n }\n },\n\n createFixture: (feature) => {\n const {\n feature_type,\n properties: { category },\n } = feature\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const options = {\n ...getElementOptions(`${feature_type}.${category}`),\n zIndex: FIXTURE_Z_INDEX,\n }\n switch (feature.properties.category) {\n case \"water\":\n return createWaterFixture(feature, elementStyle, options)\n case \"vegetation\":\n return createVegetationFixture(feature, elementStyle, options)\n case \"equipment\":\n case \"obstruction\":\n case \"stage\":\n case \"desk\":\n case \"wall\":\n return createObstructionalFixture(feature, elementStyle, options)\n default:\n break\n }\n },\n\n createLineStringFromGeometries: (geometries) => {\n const mergedCoordinates = _(geometries)\n .map((geometry) => {\n switch (geometry.type) {\n case \"Point\":\n return [\n geometry?.getCoordinates\n ? geometry?.getCoordinates()\n : new Coordinate(geometry.coordinates),\n ]\n case \"Polygon\":\n return [\n geometry?.getCenter\n ? geometry?.getCenter()\n : new Polygon(geometry.coordinates).getCenter(),\n ]\n case \"MultiPolygon\":\n return [\n geometry?.getCenter\n ? geometry?.getCenter()\n : new MultiPolygon(geometry.coordinates).getCenter(),\n ]\n case \"LineString\":\n default:\n return geometry?.getCoordinates\n ? geometry?.getCoordinates()\n : new LineString(geometry.coordinates).getCoordinates()\n }\n })\n .flatten()\n .value()\n const stepPathLineSymbol = getElementSymbol(\"navigation-path\")\n const startPathSymbolMarker = getElementSymbol(\"navigation-path-start\")\n\n const line = new LineString(mergedCoordinates, {\n smoothness: 0.5,\n symbol: [...stepPathLineSymbol, startPathSymbolMarker],\n })\n\n return line\n },\n create3DStepPath: (feature, threeLayer, option = {}) => {\n const stepPathLineSymbol = getElementSymbol(\"navigation-path\")\n const pathLineSymbol = stepPathLineSymbol[1]\n const pathLineEffect = stepPathLineSymbol[0]\n const lineOptions = {\n color: pathLineSymbol?.lineColor,\n opacity: pathLineSymbol?.lineOpacity,\n }\n const outlineOptions = {\n color: pathLineEffect?.lineColor,\n opacity: pathLineEffect?.lineOpacity,\n }\n\n return new NavigationPath(\n feature,\n threeLayer,\n getFeatureProperties(feature),\n option,\n lineOptions,\n outlineOptions\n )\n },\n\n createDecoration: (decoration, options) => {\n const { type, coordinates } = decoration\n const { id, ordinal, symbol } = options\n const formattedProperties = {\n properties: {\n id,\n altitude: getAltitude(options),\n ordinal,\n },\n symbol,\n zIndex: DECORATION_Z_INDEX,\n }\n switch (type) {\n case \"Polygon\":\n return new Polygon(coordinates, formattedProperties)\n case \"MultiPolygon\":\n return new MultiPolygon(coordinates, formattedProperties)\n case \"LineString\":\n return new LineString(coordinates, formattedProperties)\n case \"MultiLineString\":\n return new MultiLineString(coordinates, formattedProperties)\n default:\n return null\n }\n },\n \n create3DBillboard: (billboard, threeLayer) => {\n const { id, feature_type, properties } = billboard\n const {\n logo,\n altitude,\n scale,\n alphaTest,\n legColor,\n showLeg,\n is_clickable,\n } = properties\n const coordinates = getCenterFromGeometry(billboard.geometry)\n const billboardProperties = {\n ...billboard.properties,\n id,\n feature_type,\n }\n\n const options = {\n altitude,\n scale,\n alphaTest,\n legColor,\n showLeg,\n interactive: is_clickable,\n }\n\n return new Billboard(\n coordinates,\n options,\n logo?.url,\n threeLayer,\n billboardProperties\n )\n },\n create3DAmenityMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, units, kiosk, is_clickable } = properties\n const amenityLocatedUnit = _.first(units)\n const isLocatedUnitModel3dAvailable = !_.isEmpty(\n amenityLocatedUnit?.properties?.model3d\n )\n const isLocatedKioskModel3dAvailable = !_.isEmpty(\n kiosk?.properties?.model3d\n )\n\n const unitConfig = getExtrudeConfigByFeature(config, amenityLocatedUnit)\n const unitHeight = isLocatedUnitModel3dAvailable\n ? 0\n : _.get(unitConfig, \"height\", 0)\n const kioskConfig = getExtrudeConfigByFeature(config, kiosk)\n const kioskHeight = isLocatedKioskModel3dAvailable\n ? 0\n : _.get(kioskConfig, \"height\", 0)\n\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: unitHeight + kioskHeight,\n highlight: highlightOptions,\n interactive: is_clickable,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n\n create3DOccupantAmenityMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, unit, kiosk } = properties\n const amenityLocation = kiosk || unit\n const locationConfig = getExtrudeConfigByFeature(config, amenityLocation)\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: _.get(locationConfig, \"height\", 0),\n highlight: highlightOptions,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n create3DOpeningMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, unit, kiosk } = properties\n const amenityLocation = kiosk || unit\n const locationConfig = getExtrudeConfigByFeature(config, amenityLocation)\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: _.get(locationConfig, \"height\", 0),\n highlight: highlightOptions,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n\n createExtrudedUnit: (unit, threeLayer, options) => {\n const extrudeHeight = _.get(options, \"height\")\n if (!extrudeHeight) return\n //NOTE: this is temporary condition that only extrude when the unit is \"room\"\n const unitProperty = getFeatureProperties(unit)\n //NOTE: offset will be dynamic in future improvement\n const options3d = {\n // TODO: Move to extrude config later\n offset: -0.1,\n altitude: _.get(options, \"altitude\", 0),\n }\n const color = unitProperty.defaultColor\n if (color === \"transparent\") return\n const material = new MeshLambertMaterial({\n color,\n transparent: true,\n })\n //create polygon with line-offset if geometry is lineString\n if (unit.geometry.type === \"LineString\") {\n const polygon = createPolygonFromLineString(unit.geometry)\n const geometry = {\n type: \"Polygon\",\n coordinates: polygon,\n }\n return createExtrudePolygon(\n geometry,\n threeLayer,\n material,\n extrudeHeight,\n unitProperty,\n options3d\n )\n }\n const object = createExtrudePolygon(\n unit.geometry,\n threeLayer,\n material,\n extrudeHeight,\n unitProperty,\n options3d\n )\n return object\n },\n }\n}\n\nconst EXCEPT_AMENITY_LOCATION_CATEGORIES = [\n \"walkway\",\n \"nonpublic\",\n \"parking\",\n \"opentobelow\",\n \"unspecified\",\n]\nexport const getLocationByAmenity = (feature) => {\n const unit = _.get(feature, \"properties.units[0]\", null)\n const unitCategory = _.get(unit, \"properties.category\")\n if (!unit) return feature.id\n return EXCEPT_AMENITY_LOCATION_CATEGORIES.includes(unitCategory)\n ? feature\n : unit\n}\n\nexport const getLocationByOccupant = (feature) => {\n const kiosk = _.get(feature, \"properties.kiosk\", null)\n const unit = _.get(feature, \"properties.anchor.properties.unit\", null)\n return kiosk || unit\n}\n\nexport const getLocationIdByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"kiosk\":\n case \"unit\":\n case \"opening\":\n return feature.id\n case \"amenity\":\n return getLocationByAmenity(feature)?.id\n case \"occupant\":\n return getLocationByOccupant(feature)?.id\n case \"promotion\":\n case \"event\":\n return feature.properties?.feature_id\n default:\n return\n }\n}\n\nexport const getFeatureByLocationId = (id, features = []) => {\n return features?.find((f) => {\n const mainLocationId = getLocationIdByFeature(f)\n const relatedLocationIds = getRelatedLocationIdsByFeature(f)\n return mainLocationId === id || relatedLocationIds.includes(id)\n })\n}\n\nexport const isClickableFeature = (feature) => {\n const isClickable = _.get(feature, \"properties.is_clickable\")\n switch (feature?.feature_type) {\n case \"amenity\":\n return _.isNull(isClickable) ? true : isClickable\n case \"occupant\":\n return true\n default:\n return\n }\n}\n\nexport const getLocationByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getLocationByAmenity(feature)\n case \"occupant\":\n return getLocationByOccupant(feature)\n default:\n return\n }\n}\n\n/*\n * Utility functions to retrieve related locations for amenities and occupants.\n * - Used for highlighting on the floor plan.\n * - Displays location details.\n */\n\nexport const getRelatedLocationsByOccupant = (feature) => {\n const kiosks = _.get(feature, \"properties.kiosks\", [])\n const units = _.get(feature, \"properties.units\", [])\n return [...kiosks, ...units]\n}\n\nexport const getRelatedLocationsByAmenity = (feature) => {\n const units = _.get(feature, \"properties.units\", [])\n\n if (units.length === 0) return [feature]\n\n return units.filter((unit) => {\n const unitCategory = _.get(unit, \"properties.category\")\n return !EXCEPT_AMENITY_LOCATION_CATEGORIES.includes(unitCategory)\n })\n}\n\nexport const getRelatedLocationIdsByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getRelatedLocationsByAmenity(feature).map((v) => v?.id)\n case \"occupant\":\n return getRelatedLocationsByOccupant(feature).map((v) => v?.id)\n default:\n return []\n }\n}\n\nexport const getRelatedLocationsByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getRelatedLocationsByAmenity(feature)\n case \"occupant\":\n return getRelatedLocationsByOccupant(feature)\n default:\n return []\n }\n}\n\nexport const getOrdinalByLocationId = (locationId, feature) => {\n if (!feature) return null\n\n const mainUnit = _.get(feature, \"properties.unit\")\n const mainKiosk = _.get(feature, \"properties.kiosk\")\n const relatedLocations = getRelatedLocationsByFeature(feature)\n\n const allLocations = [mainUnit, mainKiosk, ...relatedLocations].filter(\n Boolean\n )\n const targetLocation = allLocations.find(\n (location) => location.id === locationId\n )\n\n return targetLocation\n ? _.get(targetLocation, \"properties.level.properties.ordinal\") ||\n _.get(targetLocation, \"properties.ordinal\")\n : null\n}\n","import * as maptalks from \"maptalks\"\nimport { BaseObject } from \"maptalks.three\"\nimport {\n LineBasicMaterial,\n BufferGeometry,\n Float32BufferAttribute,\n Line,\n TextureLoader,\n SpriteMaterial,\n Sprite,\n} from \"three\"\nimport _ from \"lodash\"\n\nconst OPTIONS = {\n altitude: 25,\n scale: 0.00015,\n alphaTest: 0.3,\n legColor: \"#ff0400\",\n showLeg: true,\n}\n\nconst getImgDimension = async (url) => {\n const img = new Image()\n img.src = url\n await img.decode()\n return { naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight }\n}\n\nexport class Billboard extends BaseObject {\n #layer = null\n constructor(coordinate, options, src, layer, properties) {\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n coordinate,\n })\n super()\n //Initialize internal configuration\n this.#layer = layer\n this._initOptions(options)\n const {\n altitude = OPTIONS.altitude,\n scale = OPTIONS.scale,\n alphaTest = OPTIONS.alphaTest,\n legColor = OPTIONS.legColor,\n showLeg = OPTIONS.showLeg,\n } = options\n this.properties = { ...properties }\n this._createGroup()\n\n // Screen size / base mobile screen size ratio => 375\n const divider = _.clamp(window.innerWidth / 375 / 1.75, 1, 1.7)\n // Leg\n if (showLeg) {\n const lineMaterial = new LineBasicMaterial({\n color: legColor,\n transparent: true,\n })\n const lineHeight = layer.altitudeToVector3(altitude, altitude).x\n const lineGeometry = new BufferGeometry()\n const positions = [0, 0, 0, 0, 0, -lineHeight]\n lineGeometry.setAttribute(\n \"position\",\n new Float32BufferAttribute(positions, 3)\n )\n const line = new Line(lineGeometry, lineMaterial)\n this.getObject3d().add(line)\n }\n\n getImgDimension(src).then(({ naturalWidth, naturalHeight }) => {\n // Image\n const map = new TextureLoader().load(src)\n const material = new SpriteMaterial({\n map: map,\n color: 0xffffff,\n alphaTest: alphaTest,\n })\n material.needsUpdate = true\n const sprite = new Sprite(material)\n sprite.material.sizeAttenuation = false\n sprite.scale.set(\n (scale * naturalWidth) / divider,\n (scale * naturalHeight) / divider,\n 1\n )\n this.getObject3d().add(sprite)\n })\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude, altitude).x\n const position = layer.coordinateToVector3(coordinate, z)\n _.set(this.properties, \"default.position\", position)\n _.set(this.properties, \"default.altitude\", altitude)\n _.set(this.properties, \"default.scale\", scale)\n this.getObject3d().position.copy(position)\n }\n\n setLineHeight(altitude) {\n const lineHeight = this.#layer.altitudeToVector3(altitude, altitude).x\n const geometry = this.getObject3d().children[0].geometry\n const positionAttribute = geometry.getAttribute(\"position\")\n positionAttribute.setZ(1, -lineHeight)\n positionAttribute.needsUpdate = true\n\n this.getObject3d().position.z = lineHeight\n }\n}\n","import { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Sprite, SpriteMaterial } from \"three\"\nimport _ from \"lodash\"\n\nconst DEFAULT_SCALE = 0.05\nconst DEFAULT_ALTITUDE = 0\nconst DEFAULT_ALPHATEST = 0.3\nconst DEFAULT_OPTIONS = {\n scale: DEFAULT_SCALE,\n altitude: DEFAULT_ALTITUDE,\n alphaTest: DEFAULT_ALPHATEST,\n highlight: {\n options: {\n scale: DEFAULT_SCALE * 1.25,\n },\n material: null,\n },\n}\n\ninterface IOptions {\n scale: number\n altitude: number\n alphaTest?: number\n highlight?: {\n options: {\n altitude?: number\n scale?: number\n }\n material?: SpriteMaterial\n }\n}\n\nexport class SpriteMarker extends BaseObject {\n #default = null\n #highlight = null\n constructor(\n coordinate,\n options: IOptions,\n material: SpriteMaterial,\n layer: ThreeLayer,\n properties: object\n ) {\n super()\n //Initialize internal configuration\n this._initOptions(options)\n this._createGroup()\n const {\n altitude = DEFAULT_OPTIONS.altitude,\n scale = DEFAULT_OPTIONS.scale,\n highlight = DEFAULT_OPTIONS.highlight,\n alphaTest = DEFAULT_OPTIONS.alphaTest,\n } = options\n this.properties = { ...properties }\n\n const modifiedAltitude = altitude + 2\n\n this.#default = { options: { scale, altitude: modifiedAltitude }, material }\n this.#highlight = _.merge({}, DEFAULT_OPTIONS.highlight, highlight)\n\n /**\n * Add alphaTest to render only non-transparent pixels in PNG images.\n * [@Doc](https://threejs.org/docs/#api/en/materials/Material.alphaTest)\n */\n if (material && material instanceof SpriteMaterial)\n material.alphaTest = alphaTest\n\n const sprite = new Sprite(material)\n sprite.scale.set(scale, scale, scale) // Set sprite scale\n\n const obj3d = this.getObject3d()\n obj3d.add(sprite)\n // set object3d position\n const z = layer.altitudeToVector3(modifiedAltitude, modifiedAltitude).x\n const position = layer.coordinateToVector3(coordinate, z)\n _.set(this.properties, \"default.position\", position)\n this.getObject3d().position.copy(position)\n }\n\n // Different objects need to implement their own methods\n setSymbol(material: SpriteMaterial) {\n if (material && material instanceof SpriteMaterial) {\n const sprite = (this.getObject3d() as any).children[0]\n\n if (!sprite) return this\n\n sprite.material = material\n sprite.material.needsUpdate = true\n }\n return this\n }\n\n setScale(scaleX: number, scaleY: number = scaleX, scaleZ: number = scaleX) {\n const sprite = (this.getObject3d() as any).children[0]\n if (!sprite) return this\n\n sprite.scale.set(scaleX, scaleY, scaleZ)\n\n return this\n }\n\n // Different objects need to implement their own methods\n getSymbol(): SpriteMaterial {\n return (this.getObject3d() as any)?.children[0]?.material\n }\n\n highlight() {\n const { material, options } = this.#highlight\n if (material) this.setSymbol(material)\n if (options.scale) this.setScale(options.scale)\n if (options.altitude) this.setAltitude(options.altitude)\n return this\n }\n\n removeHighlight() {\n const { material, options } = this.#default\n if (material) this.setSymbol(material)\n if (options.scale) this.setScale(options.scale)\n if (options.altitude) this.setAltitude(options.altitude)\n return this\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { BaseObject } from \"maptalks.three\"\nimport { MeshBasicMaterial, ShaderMaterial, Color } from \"three\"\n\nconst OPTIONS = {\n altitude: 0,\n}\n\nconst DEFAULT_LINE_OPTION = {\n color: \"#000\",\n opacity: 1,\n}\nconst DEFAULT_LINE_EFFECT_OPTION = {\n color: \"#000\",\n opacity: 1,\n}\n\n// In case we want to open/close this animation per project.\nconst ENABLE_ANIMATED_PATH = true\n\nexport class NavigationPath extends BaseObject {\n constructor(\n feature,\n layer,\n properties,\n options,\n lineOptions = DEFAULT_LINE_OPTION,\n outlineOption = DEFAULT_LINE_EFFECT_OPTION\n ) {\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n })\n super()\n //Initialize internal configuration\n this._initOptions(options)\n const { altitude = OPTIONS.altitude } = options\n this.properties = { ...properties }\n this._createGroup()\n\n const { color: lineColor, opacity: lineOpacity } =\n lineOptions || DEFAULT_LINE_OPTION\n\n const staticMaterial = new MeshBasicMaterial({\n transparent: true,\n color: lineColor || \"#fff\",\n opacity: lineOpacity || 1,\n depthWrite: false,\n })\n\n const uniforms = {\n time: { value: 0 },\n color: { value: new Color(lineColor || \"#fff\") },\n opacity: { value: lineOpacity || 1 },\n }\n this._uniforms = uniforms\n this._t = 0 // Start time = 0\n\n /**\n * Animation formula\n * float dash = smoothstep(0.3, 0.7, abs(sin(vUv.x * 1.0 - time * 0.1)));\n * | vUv.x * 1.0 | controls dash length & frequency\n * | - time * 1.0 | animates motion to the right\n */\n const animatedMaterial = new ShaderMaterial({\n uniforms,\n transparent: true,\n depthWrite: false,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float time;\n uniform vec3 color;\n uniform float opacity;\n varying vec2 vUv;\n\n void main() {\n float dash = smoothstep(0.3, 0.7, abs(sin(vUv.x * 1.0 - time * 0.1)));\n gl_FragColor = vec4(color, opacity * dash);\n }\n `,\n })\n\n const pathGeometry = maptalks.GeoJSON.toGeometry(feature)\n const line = layer.toPath(\n pathGeometry,\n {\n interactive: false,\n cornerRadius: 2,\n width: 0.5,\n },\n ENABLE_ANIMATED_PATH ? animatedMaterial : staticMaterial\n )\n\n const { color: outlineColor, opacity: outlineOpacity } = outlineOption || {}\n const outlineMaterial = new MeshBasicMaterial({\n transparent: true,\n color: outlineColor || \"#fff\",\n opacity: outlineOpacity || 1,\n })\n\n const lineOutLine = layer.toPath(\n pathGeometry,\n {\n interactive: false,\n cornerRadius: 2,\n width: 1,\n },\n outlineMaterial\n )\n this.getObject3d().add(lineOutLine.getObject3d())\n this.getObject3d().add(line.getObject3d())\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude + 0.25, altitude + 0.25).x\n const pos = this.getObject3d().position\n\n const position = layer.coordinateToVector3([pos.x, pos.y], z)\n // _.set(this.properties, \"default.position\", position)\n\n this.getObject3d().position.copy(position)\n }\n\n _animation() {\n this._t = this._t + 1\n this._uniforms.time.value = this._t\n }\n}\n","import center from \"@turf/center\"\nimport { Polygon, MultiPolygon, Point, LineString } from \"geojson\"\nimport _ from \"lodash\"\nimport turfLineOffset from \"@turf/line-offset\"\nimport { lineString as turfLineString } from \"@turf/helpers\"\n\n// Calculates the center point of a GeoJSON geometry and Return as a Coordinates.\nexport const getCenterFromGeometry = (geometry?: Polygon | MultiPolygon | Point | LineString): number[] | null => {\n try {\n const { type = null, coordinates = null } = geometry\n if (!type || !coordinates) return null\n const centerPoint = center(geometry)\n return _.get(centerPoint, \"geometry.coordinates\") // Coordinates\n } catch (error) {\n return null\n }\n}\n\nexport const createPolygonFromLineString = (geometry) => {\n const line = turfLineString(geometry.coordinates)\n const left = turfLineOffset(line, 0.3, { units: \"meters\" })\n const right = turfLineOffset(line, -0.3, { units: \"meters\" })\n const leftCoords = left.geometry.coordinates\n const rightCoords = right.geometry.coordinates.reverse()\n const polygon = [...leftCoords, ...rightCoords, leftCoords[0]]\n return [polygon]\n}\n","export const svgToPng = (svgString: string, scaleFactor: number = 1) => {\n const svgBlob = new Blob([svgString], { type: \"image/svg+xml\" })\n const url = URL.createObjectURL(svgBlob)\n const img = new Image()\n return new Promise((resolve, reject) => {\n img.onload = function () {\n // Calculate the new dimensions\n const newWidth = img.width * scaleFactor\n const newHeight = img.height * scaleFactor\n\n // Create a canvas with the new dimensions\n const canvas = document.createElement(\"canvas\")\n canvas.width = newWidth\n canvas.height = newHeight\n const ctx = canvas.getContext(\"2d\")\n\n // Draw the SVG image onto the canvas with the scaled dimensions\n ctx.drawImage(img, 0, 0, newWidth, newHeight)\n\n // Convert canvas to PNG\n const pngDataUrl = canvas.toDataURL(\"image/png\")\n\n // Resolve the Promise with the PNG data URL\n resolve(pngDataUrl)\n }\n\n // Handle image load errors\n img.onerror = function (error) {\n reject(error)\n }\n\n img.src = url\n })\n}\n\nexport const createSVGPathFromMarkerSymbol = (style) => {\n const {\n markerWidth = 24,\n markerDx = 0,\n markerDy = 0,\n markerFill,\n markerPath,\n } = style\n const scale = markerWidth / 24\n return `<path d=\"${markerPath}\" style=\"transform:translate(${markerDx}px, ${markerDy}px) scale(${scale})\" fill=\"${markerFill}\"/>`\n}\n","interface ICoordinate {\n x: number\n y: number\n z?: number\n}\n\ntype RadToDegree = (rad: number) => number\n\ntype GetBearingBetweenPoints = (\n origin: ICoordinate,\n destination: ICoordinate\n) => number\n\ntype GetSuitablyValueBetweenBearings = (\n newBearing: number,\n currentBearing: number\n) => number\n\nconst radToDegree: RadToDegree = (rad) => rad * (180 / Math.PI)\n\nexport const getBearingBetweenPoints: GetBearingBetweenPoints = (\n origin,\n destination\n) => {\n const twoPI = Math.PI * 2\n\n if (origin.x === destination.x && origin.y === destination.y) return\n let theta = Math.atan2(destination.x - origin.x, destination.y - origin.y)\n\n if (theta < 0.0) theta += twoPI\n\n return Math.floor(radToDegree(theta))\n}\n\nexport const getSuitablyValueBetweenBearings: GetSuitablyValueBetweenBearings =\n (newBearing, currentBearing) => {\n const difference = Math.abs(newBearing - currentBearing)\n\n // Adjust newBearing to ensure the shortest direction\n if (difference > 180)\n return newBearing > 0 ? newBearing - 360 : newBearing + 360\n\n return newBearing // Return as is if the difference is within limits\n }\n","import { Extent } from \"maptalks\"\nimport { Map } from \"maptalks-gl\"\nimport { MapAnimationOptionsType, MapPaddingType, MapViewType } from \"maptalks/dist/map/Map\"\nimport bbox from \"@turf/bbox\"\nimport scale from \"@turf/transform-scale\"\nimport bboxPolygon from \"@turf/bbox-polygon\"\n\nexport interface CameraManagerOptions {\n defaultView?: MapViewType\n}\n\nexport class CameraManager {\n map: Map\n\n constructor(map: Map, options?: CameraManagerOptions) {\n this.map = map\n\n if (options?.defaultView) {\n this.setView(options?.defaultView)\n }\n }\n\n /** Public methods */\n getView = (): MapViewType => {\n return this.map.getView()\n }\n \n setView = (value: MapViewType) => {\n if (this.map && Object.keys(value).length !== 0) {\n this.map.setView(value)\n }\n }\n\n animateTo = (view: MapViewType, options: MapAnimationOptionsType = {}, step?: (frame: any) => void) => {\n this.map.animateTo(view, options, step)\n }\n\n setMaxExtent(extent: Extent) {\n return this.map.setMaxExtent(extent)\n }\n\n getFeatureExtent = (feature, scaleFactor = 1) => {\n const [minX, minY, maxX, maxY] = bbox(\n scale(bboxPolygon(bbox(feature)), scaleFactor)\n )\n return new Extent(minX, minY, maxX, maxY)\n }\n\n getExtentZoom = (\n extent: Extent,\n options: { isFraction?: boolean; padding?: MapPaddingType } = {\n isFraction: false,\n padding: {\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n },\n }\n ) => {\n const { isFraction = false, padding } = options\n return this.map.getFitZoom(extent, isFraction, padding)\n }\n\n set maxZoom(value: number) {\n this.map.setMaxZoom(value)\n const spatialReference = {\n projection: \"EPSG:3857\",\n resolutions: (function () {\n const resolutions = []\n const d = 2 * 6378137 * Math.PI\n for (let i = 0; i < value; i++) {\n resolutions[i] = d / (256 * Math.pow(2, i))\n }\n return resolutions\n })(),\n }\n this.map.setSpatialReference(spatialReference)\n }\n\n set minZoom(value: number) {\n this.map.setMinZoom(value)\n }\n\n}\n","import { feature, point, lineString, isObject } from \"@turf/helpers\";\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordEachCallback} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[featureIndex].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[geomIndex]\n : geometryMaybeCollection;\n\n // Handles null Geometry -- Skips this geometry\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n\n wrapShrink =\n excludeWrapCoord &&\n (geomType === \"Polygon\" || geomType === \"MultiPolygon\")\n ? 1\n : 0;\n\n switch (geomType) {\n case null:\n break;\n case \"Point\":\n if (\n callback(\n coords,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (\n callback(\n coords[j],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (\n callback(\n coords[j][k],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (\n callback(\n coords[j][k][l],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n geometryIndex++;\n }\n multiFeatureIndex++;\n }\n break;\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++)\n if (\n coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===\n false\n )\n return false;\n break;\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordReduceCallback} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(\n geojson,\n function (\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) {\n if (coordIndex === 0 && initialValue === undefined)\n previousValue = currentCoord;\n else\n previousValue = callback(\n previousValue,\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n },\n excludeWrapCoord\n );\n return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {propEachCallback} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n var i;\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n break;\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {propReduceCallback} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentProperties;\n else\n previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureEachCallback} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentFeature;\n else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry|GeometryObject|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomEachCallback} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[i].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n featureProperties = isFeatureCollection\n ? geojson.features[i].properties\n : isFeature\n ? geojson.properties\n : {};\n featureBBox = isFeatureCollection\n ? geojson.features[i].bbox\n : isFeature\n ? geojson.bbox\n : undefined;\n featureId = isFeatureCollection\n ? geojson.features[i].id\n : isFeature\n ? geojson.id\n : undefined;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[g]\n : geometryMaybeCollection;\n\n // Handle null Geometry\n if (geometry === null) {\n if (\n callback(\n null,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n continue;\n }\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\": {\n if (\n callback(\n geometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n break;\n }\n case \"GeometryCollection\": {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (\n callback(\n geometry.geometries[j],\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n }\n break;\n }\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n // Only increase `featureIndex` per each feature\n featureIndex++;\n }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomReduceCallback} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(\n geojson,\n function (\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentGeometry;\n else\n previousValue = callback(\n previousValue,\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenEachCallback} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (\n callback(\n feature(geometry, properties, { bbox: bbox, id: id }),\n featureIndex,\n 0\n ) === false\n )\n return false;\n return;\n }\n\n var geomType;\n\n // Callback for multi-geometry\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (\n var multiFeatureIndex = 0;\n multiFeatureIndex < geometry.coordinates.length;\n multiFeatureIndex++\n ) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate,\n };\n if (\n callback(feature(geom, properties), featureIndex, multiFeatureIndex) ===\n false\n )\n return false;\n }\n });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(\n geojson,\n function (currentFeature, featureIndex, multiFeatureIndex) {\n if (\n featureIndex === 0 &&\n multiFeatureIndex === 0 &&\n initialValue === undefined\n )\n previousValue = currentFeature;\n else\n previousValue = callback(\n previousValue,\n currentFeature,\n featureIndex,\n multiFeatureIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {AllGeoJSON} geojson any GeoJSON\n * @param {segmentEachCallback} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0;\n\n // Exclude null Geometries\n if (!feature.geometry) return;\n // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return;\n\n // Generate 2-vertex line segments\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (\n coordEach(\n feature,\n function (\n currentCoord,\n coordIndex,\n featureIndexCoord,\n multiPartIndexCoord,\n geometryIndex\n ) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (\n previousCoords === undefined ||\n featureIndex > previousFeatureIndex ||\n multiPartIndexCoord > previousMultiIndex ||\n geometryIndex > prevGeomIndex\n ) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n var currentSegment = lineString(\n [previousCoords, currentCoord],\n feature.properties\n );\n if (\n callback(\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) === false\n )\n return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }\n ) === false\n )\n return false;\n });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {segmentReduceCallback} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(\n geojson,\n function (\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) {\n if (started === false && initialValue === undefined)\n previousValue = currentSegment;\n else\n previousValue = callback(\n previousValue,\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n );\n started = true;\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {void}\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {lineEachCallback} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @returns {void}\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)\n return false;\n break;\n case \"Polygon\":\n for (\n var geometryIndex = 0;\n geometryIndex < coords.length;\n geometryIndex++\n ) {\n if (\n callback(\n lineString(coords[geometryIndex], feature.properties),\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n }\n break;\n }\n });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(\n geojson,\n function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentLine;\n else\n previousValue = callback(\n previousValue,\n currentLine,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature<LineString<[[10, 10], [50, 30]]>>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature<LineString<[[-10, -10], [-50, -30]]>>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature<LineString<[[-50, -30], [-30, -40]]>>\n */\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find SegmentIndex\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString(\n [coords[segmentIndex], coords[segmentIndex + 1]],\n properties,\n options\n );\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[geometryIndex][segmentIndex],\n coords[geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][segmentIndex],\n coords[multiFeatureIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex =\n coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][geometryIndex][segmentIndex],\n coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature<Point<[10, 10]>>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature<Point<[-10, -10]>>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature<Point<[-30, -40]>>\n */\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find Coord Index\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n case \"MultiPoint\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0)\n coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0)\n coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0)\n coordIndex =\n coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(\n coords[multiFeatureIndex][geometryIndex][coordIndex],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\nexport {\n coordReduce,\n coordEach,\n propEach,\n propReduce,\n featureReduce,\n featureEach,\n coordAll,\n geomReduce,\n geomEach,\n flattenReduce,\n flattenEach,\n segmentReduce,\n segmentEach,\n lineReduce,\n lineEach,\n findSegment,\n findPoint,\n};\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","import * as maptalks from \"maptalks-gl\"\nimport { min, compact, isFunction } from \"lodash-es\"\nimport { center as turfCenter } from \"@turf/center\"\nimport { polygon } from \"@turf/helpers\"\nimport { Position } from \"geojson\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport * as THREE from \"three\"\n\nimport type { HighlightElementOptions, IHighlightController, MapElement, RendererManagerOptions } from \"./types\"\nimport { Element3DRenderer } from \"./3d/Element3DRenderer\"\nimport { Element2DRenderer } from \"./2d/Element2DRenderer\"\nimport { Marker2DRenderer } from \"./2d/Marker2DRenderer\"\nimport { AnyMarkerOptions, Marker3DRenderer } from \"./3d/Marker3DRenderer\"\n\nimport {\n KioskFeaturePopulated,\n OpeningFeature,\n OpeningFeaturePopulated,\n UnitFeaturePopulated,\n VenueDataClient,\n} from \"../../data\"\nimport { angleBetweenLineStrings } from \"./utils/angleBetweenLineString\"\nimport { findUnitOnPoint } from \"./utils/findUnitOnPoint\"\n\nfunction delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport class RendererManager extends EventTarget {\n map: maptalks.Map\n\n options: RendererManagerOptions\n\n // Client for fetching data\n #dataClient: VenueDataClient\n\n #isClicked = false\n #onClickElement = (e) => {}\n\n /** Elements: Responsible for converting feature info elements and add to map */\n private elementRenderer: Element2DRenderer | Element3DRenderer\n private markerRenderer: Marker2DRenderer | Marker3DRenderer\n\n private elementsMap: Map<string, MapElement>\n private elementsByOrdinal: Map<\n number,\n Array<MapElement>\n >\n\n private currentOrdinals: number | number[] | null\n\n private markersMap: Map<string, maptalks.ui.UIMarker | BaseObject>\n private markersByOrdinal: Map<\n number,\n Array<maptalks.ui.UIMarker> | Array<BaseObject>\n >\n\n private highlightControllers: IHighlightController[] = []\n\n constructor(map: maptalks.Map, dataClient: VenueDataClient, options: RendererManagerOptions) {\n super()\n this.map = map\n this.options = options\n this.elementsMap = new Map()\n this.elementsByOrdinal = new Map()\n\n this.markersMap = new Map()\n this.markersByOrdinal = new Map()\n\n this.#dataClient = dataClient\n \n const _this = this\n\n if (options.type === \"3D\") {\n const groupLayer = this.map.getLayer('group') as maptalks.GroupGLLayer\n const threeLayer = groupLayer.getLayer('three') as ThreeLayer\n\n threeLayer.prepareToDraw = function (gl, scene, camera) {\n \n function findBadMeshes(scene: THREE.Scene) {\n const bad: Array<{ mesh: THREE.Mesh; index: number; value: number }> = [];\n\n scene.traverse((obj: any) => {\n if (!obj?.isMesh) return;\n const geom = obj.geometry as THREE.BufferGeometry | undefined;\n const pos = geom?.attributes?.position?.array as Float32Array | undefined;\n if (!pos || pos.length === 0) return;\n\n for (let i = 0; i < pos.length; i++) {\n const v = pos[i];\n if (!Number.isFinite(v)) {\n bad.push({ mesh: obj, index: i, value: v });\n break;\n }\n }\n });\n\n if (bad.length) {\n console.group(`❌ Found ${bad.length} meshes with invalid positions`);\n for (const b of bad) {\n console.log({\n name: b.mesh.name,\n userData: b.mesh.userData,\n uuid: b.mesh.uuid,\n badIndex: b.index,\n badValue: b.value,\n });\n }\n console.groupEnd();\n } else {\n console.log(\"✅ No invalid meshes found\");\n }\n\n return bad;\n }\n\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.3)\n scene.add(ambientLight)\n \n const dirColor = 0xffffff\n const dllight = new THREE.DirectionalLight(dirColor, 0.8)\n dllight.position.set(0, -10, 20).normalize()\n scene.add(dllight)\n \n // nice optional fill\n const hemi = new THREE.HemisphereLight(0xffffff, 0x444444, 0.4)\n scene.add(hemi)\n\n // Element renderer creates and owns the ThreeLayer\n _this.elementRenderer = new Element3DRenderer(map, options.elements)\n\n // Get the ThreeLayer from element renderer to share with marker renderer\n _this.markerRenderer = new Marker3DRenderer(map, {}, threeLayer)\n\n if (typeof options.onRendererReady === 'function') {\n options.onRendererReady()\n }\n\n _this.#createElements()\n\n setTimeout(() => {\n findBadMeshes(scene)\n }, 3000)\n }\n \n } else {\n // 2D doesn't need shared layer\n this.elementRenderer = new Element2DRenderer(map, options.elements)\n this.markerRenderer = new Marker2DRenderer(map)\n\n this.#createElements()\n }\n }\n\n set onClickElement(func) {\n this.#onClickElement = func\n }\n\n handleClickElement = (e) => {\n if (this.#isClicked) return\n this.#isClicked = true\n const onClickElement = this.#onClickElement\n if (!isFunction(onClickElement)) return\n this.#onClickElement(e)\n this.#isClicked = false\n }\n\n getElementsByOrdinal = (ordinal: number) => {\n const exist = this.elementsByOrdinal.get(ordinal)\n if (!exist) this.elementsByOrdinal.set(ordinal, [])\n return this.elementsByOrdinal.get(ordinal)\n }\n\n addElementsToManager = (id, elements, ordinal) => {\n // console.log(`addElementsToManager`, { id, elements })\n this.elementsMap.set(id, elements)\n elements.forEach((el) => {\n el.on('click', e => this.handleClickElement(id))\n this.getElementsByOrdinal(ordinal).push(el)\n })\n\n const inOrdinal = Array.isArray(this.currentOrdinals) ? this.currentOrdinals.includes(ordinal) : ordinal === this.currentOrdinals\n if (inOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal)\n } else {\n this.elementRenderer.hideElements(elements as any, ordinal)\n }\n }\n\n async #createElements() {\n\n // Add some delay to mitigate react re-renders multiple times\n await delay(this.options.delayBeforeCreateElements ?? 0)\n\n /** Levels */\n const levels = await this.#dataClient.filterByType(\"level\", {\n populate: true,\n })\n\n const openings = await this.#dataClient.filterByType(\"opening\", {\n populate: true,\n })\n\n const relationships = await this.#dataClient.filterByType('relationship')\n /** Fixtures */\n const fixtures = (await this.#dataClient.filterByType(\"fixture\", { populate: true }))\n fixtures\n .forEach((fixture) => {\n const element = this.elementRenderer.createGeometry(fixture)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(fixture.id, _elements, fixture.properties.level.properties.ordinal)\n }\n })\n\n /** Units */\n const units = (await this.#dataClient.filterByType<\"unit\">(\"unit\", {\n populate: true,\n })) as UnitFeaturePopulated[]\n\n units\n .filter(\n (u) => ![\"opentobelow\", \"escalator\", \"room\"].includes(u.properties.category)\n )\n .forEach((unit) => {\n const element = this.elementRenderer.createGeometry(unit)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(unit.id, _elements, unit.properties.level.properties.ordinal)\n }\n })\n\n units\n .filter(u => u.properties.category === \"room\")\n .forEach(unit => {\n const openingRelationships = relationships.filter(r => r.properties.origin?.id === unit.id || r.properties.destination?.id === unit.id)\n const roomOpenings = compact(openingRelationships.map(rel => {\n const openingId = rel?.properties.intermediary[0].id\n return openings.find(o => o.id === openingId)\n })) as OpeningFeature[]\n \n const innerElements = this.elementRenderer.createGeometry(unit)\n const wallElements = this.elementRenderer.createRoomWall(unit, roomOpenings)\n if (innerElements || wallElements) {\n const _innerElements = Array.isArray(innerElements) ? innerElements : [innerElements]\n const _wallElements = Array.isArray(wallElements) ? wallElements : [wallElements]\n const _elements = [..._innerElements, ..._wallElements]\n const ordinal = unit.properties.level.properties.ordinal\n this.addElementsToManager(unit.id, _elements, ordinal)\n }\n\n })\n\n /** Kiosks */\n const kiosks = (await this.#dataClient.filterByType<\"kiosk\">(\"kiosk\", {\n populate: true,\n })) as KioskFeaturePopulated[]\n kiosks.forEach((kiosk) => {\n const element = this.elementRenderer.createGeometry(kiosk)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(kiosk.id, _elements, kiosk.properties.level.properties.ordinal)\n }\n })\n\n /**\n * Escalators\n */\n const escalators = units.filter(u => u.properties.category === 'escalator')\n for (const escalator of escalators) {\n try {\n const escalatorRelationships = relationships.filter(r => (r.properties?.intermediary || []).some(inter => inter.id === escalator.id))\n if (escalatorRelationships.length === 0) {\n throw new Error('Cannot find escalator relationship')\n }\n if (escalatorRelationships.length > 1) {\n throw new Error('Found more than one relationship')\n }\n const thisOrdinal = escalator.properties.ordinal\n const relationship = escalatorRelationships[0]\n if (!relationship.properties.origin?.id) throw new Error(`relationship (id=${relationship.id}) - origin not exists`)\n if (!relationship.properties.destination?.id) throw new Error(`relationship (id=${relationship.id}) - destination not exists`)\n\n const bothOpeningIds = [relationship.properties.origin.id, relationship.properties.destination.id]\n const bothOpenings = await Promise.all(\n bothOpeningIds.map(id => this.#dataClient.findById('opening', id, { populate: true }))\n ) as OpeningFeaturePopulated[]\n const thisLevelOpening = bothOpenings.find(opening => opening.properties.ordinal === thisOrdinal)\n const thatLevelOpening = bothOpenings.find(opening => opening.properties.ordinal !== thisOrdinal)\n const angle = 180 * (1 / Math.PI) * angleBetweenLineStrings(thisLevelOpening.geometry.coordinates, thatLevelOpening.geometry.coordinates)\n const direction = thisOrdinal < thatLevelOpening.properties.ordinal ? 'up' : 'down'\n const escalatorEntryPoint = turfCenter(thisLevelOpening).geometry.coordinates\n const element = await this.elementRenderer.createEscalator(escalator, escalatorEntryPoint, { direction, angle })\n if (element) {\n const _elements = (Array.isArray(element)) ? element : [element]\n this.addElementsToManager(escalator.id, _elements, escalator.properties.ordinal)\n }\n } catch (err) {\n console.warn(`cannot create escalator`, err.message)\n }\n }\n\n /** \n * Ground Label \n */\n const groundLabels = await this.#dataClient.filterByType(\"label\")\n for (const label of groundLabels) {\n const center = turfCenter(polygon(label.geometry.coordinates)).geometry.coordinates\n const unit = findUnitOnPoint(units, center) \n const element = this.elementRenderer.createGroundLabel(label, unit)\n if (element) {\n const _elements = (Array.isArray(element)) ? element : [element]\n this.addElementsToManager(label.id, _elements, label.properties.ordinal)\n }\n }\n \n if (this.options.type === \"3D\") {\n const model3ds = await this.#dataClient.filterByType(\"model3d\")\n for (const model3d of model3ds) {\n (this.elementRenderer as Element3DRenderer).createModel3d(model3d)\n }\n }\n // const buildingElement = await this.elementRenderer.createBuilding([100.51015958563418, 13.72669948541647], 0)\n // if (buildingElement) {\n // const _elements = (Array.isArray(buildingElement)) ? buildingElement : [buildingElement]\n // this.addElementsToManager('venue', _elements, 0)\n // }\n\n // Call changeLevelByOrdinal again to show/hide elements\n this.changeLevelByOrdinal(this.currentOrdinals)\n\n this.dispatchEvent(new CustomEvent('renderermanager:elements_created'))\n\n }\n\n changeLevelByOrdinal(targetOrdinal: null | number | number[]): void {\n // if targetOrdinal = null, show all\n this.currentOrdinals = targetOrdinal\n\n if (targetOrdinal === null) {\n const baseOrdinal = 0\n for (const [ordinal, elements] of this.elementsByOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal - baseOrdinal)\n }\n\n for (const [ordinal, markers] of this.markersByOrdinal) {\n this.markerRenderer.showMarkers(markers as any, ordinal - baseOrdinal)\n }\n } else {\n // if targetOrdinal = number | number[], show target levels\n const baseOrdinal = Array.isArray(targetOrdinal) ? min(targetOrdinal) : targetOrdinal\n\n for (const [ordinal, elements] of this.elementsByOrdinal) {\n const inOrdinal = Array.isArray(targetOrdinal) ? targetOrdinal.includes(ordinal) : ordinal === targetOrdinal\n if (inOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal - baseOrdinal)\n } else {\n this.elementRenderer.hideElements(elements as any, ordinal - baseOrdinal)\n }\n }\n\n for (const [ordinal, markers] of this.markersByOrdinal) {\n const inOrdinal = Array.isArray(targetOrdinal) ? targetOrdinal.includes(ordinal) : ordinal === targetOrdinal\n if (inOrdinal) {\n this.markerRenderer.showMarkers(markers as any, ordinal - baseOrdinal)\n } else {\n this.markerRenderer.hideMarkers(markers as any, ordinal - baseOrdinal)\n }\n }\n }\n }\n\n highlightElements = (elemIds: string[], options?: HighlightElementOptions) => {\n const { reset = true } = options ?? {};\n\n if (reset) {\n this.clearHighlightElements()\n }\n\n const elements = elemIds.map(id => this.elementsMap.get(id)).flat()\n\n elements.forEach(element => {\n const controller: IHighlightController = this.elementRenderer.createHighlightController(element) \n if (controller && isFunction(controller.start)) {\n controller.start()\n this.highlightControllers.push(controller)\n }\n })\n }\n\n clearHighlightElements = () => {\n this.highlightControllers.forEach((controller) => {\n if (isFunction(controller?.clear)) controller.clear()\n })\n }\n\n /** \n * ========================================================================\n * Markers\n * ======================================================================== */\n _getMarkersByOrdinal = (ordinal: number) => {\n const exist = this.markersByOrdinal.get(ordinal)\n if (!exist) this.markersByOrdinal.set(ordinal, [])\n return this.markersByOrdinal.get(ordinal)\n }\n\n _addMarkersToManager = (id, markers, ordinal) => {\n this.markersMap.set(id, markers)\n markers.forEach((el) => {\n this._getMarkersByOrdinal(ordinal).push(el)\n })\n\n const inOrdinal = Array.isArray(this.currentOrdinals) ? this.currentOrdinals.includes(ordinal) : ordinal === this.currentOrdinals\n if (inOrdinal) {\n this.markerRenderer.showMarkers(markers, ordinal)\n } else {\n this.markerRenderer.hideMarkers(markers, ordinal)\n }\n }\n\n createMarker(coordinate: Position, ordinal: number, text: string, options: AnyMarkerOptions) {\n const marker = this.markerRenderer.createMarker(coordinate, ordinal, text, options)\n const markerId = `${this.markersMap.size + 1}`\n this._addMarkersToManager(markerId, [marker], ordinal)\n }\n\n clearMarkers() {\n for (const [markerId, marker] of this.markersMap) {\n this.markerRenderer.removeMarker(marker as any)\n }\n }\n\n \n}\n","import * as maptalks from \"maptalks-gl\"\nimport { GeoJSONLineStringFeature, GeoJSONMultiPolygonFeature, GeoJSONPolygonFeature } from \"maptalks.three/dist/type\"\nimport * as THREE from \"three\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Feature, LineString, Polygon, Position } from \"geojson\"\nimport turfBuffer from \"@turf/buffer\"\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { point, multiPoint, polygon } from \"@turf/helpers\"\nimport { polygonToLine } from \"@turf/polygon-to-line\"\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { length } from \"@turf/length\"\nimport { along } from \"@turf/along\";\nimport { pointToLineDistance } from \"@turf/point-to-line-distance\";\nimport { ImdfFeature, LabelFeature, Model3dFeature, OpeningFeature, UnitFeature } from \"../../../data\"\nimport {\n Element3DRendererOptions,\n IElementRenderer,\n IHighlightController,\n MapElement,\n} from \"../types\"\nimport { GroundLabel, GroundLabelOptions } from \"./objects/GroundLabel\"\nimport { get3DRendererOption } from \"./utils/get3DRendererOption\"\nimport lineSplit from \"@turf/line-split\"\n\nexport const HEIGHT_METER = 4\nexport const MULTIORDINAL_HEIGHT_METER = 9\nexport const WALKWAY_HEIGHT = 0.5\n\nexport class Element3DRenderer\n extends EventTarget\n implements IElementRenderer\n{\n private options: Element3DRendererOptions\n private map: maptalks.Map\n private gltfLayer: maptalks.GLTFLayer\n public threeLayer: ThreeLayer\n public scene: THREE.Scene\n private lineMaterial: THREE.LineBasicMaterial\n private materialByColorMap: Map<string, THREE.Material>\n\n // Renderer is Ready\n public isReady: boolean = false\n\n constructor(map: maptalks.Map, options: Element3DRendererOptions) {\n super()\n\n this.options = options\n this.map = map\n const groupLayer = this.map.getLayer('group') as maptalks.GroupGLLayer\n this.threeLayer = groupLayer.getLayer('three') as ThreeLayer\n this.gltfLayer = groupLayer.getLayer('gltf') as maptalks.GLTFLayer\n\n this.lineMaterial = new THREE.LineBasicMaterial({ color: \"#000\" })\n \n this.render()\n }\n\n animation() {\n // layer animation support Skipping frames\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n this.threeLayer.redraw()\n }\n requestAnimationFrame(this.animation)\n }\n\n /** Materials */\n getOrCreateMaterialByColor(color) {\n if (!this.materialByColorMap) this.materialByColorMap = new Map()\n\n const existingMaterial = this.materialByColorMap.get(color)\n if (existingMaterial) return existingMaterial\n\n const created = new THREE.MeshLambertMaterial({ color, transparent: true })\n created.toneMapped = false\n this.materialByColorMap.set(color, created)\n return created\n }\n\n createGeometry = (feature: ImdfFeature): MapElement | MapElement[] => {\n const {\n offset = 0,\n height: heightOptions,\n bottomHeight: bottomHeightOptions,\n color: colorOptions,\n ...options\n } = get3DRendererOption(feature.feature_type, feature.properties.category, this.options)\n\n const _this = this\n\n /** Internal createPolygon function */\n const createPolygon = (geometry: Polygon, feature: GeoJSONPolygonFeature|GeoJSONMultiPolygonFeature) => {\n try {\n const [outerRing, ...innerRings] = geometry.coordinates\n const offsetFeature =\n offset !== 0\n ? turfBuffer(geometry, offset, { units: \"meters\" }) as GeoJSONPolygonFeature\n : feature\n const color =\n feature.properties.style.polygonFill ?? colorOptions ?? \"#ffffff\"\n if (color === \"transparent\") return\n const material = this.getOrCreateMaterialByColor(color)\n const altitude = 0\n const height = feature.properties.height ?? heightOptions ?? HEIGHT_METER\n const bottomHeight = feature.properties.bottomHeight ?? bottomHeightOptions ?? 0\n const extrudedPolygon = this.threeLayer.toExtrudePolygon(\n offsetFeature,\n { asynchronous: true, ...options, height, bottomHeight, altitude },\n material\n )\n\n // Create extra lines for visual clarity\n const topLineStrings = [\n new maptalks.LineString(outerRing),\n ...innerRings.map(innerRing => new maptalks.LineString(innerRing))\n ]\n const topLines = this.threeLayer.toLines(\n topLineStrings,\n { altitude, bottomHeight: bottomHeight + height + 0.001, interactive: false },\n this.lineMaterial\n )\n\n const bottomLineStrings = [\n new maptalks.LineString(outerRing),\n ...innerRings.map(innerRing => new maptalks.LineString(innerRing))\n ]\n const bottomLines = this.threeLayer.toLines(\n bottomLineStrings,\n { altitude: altitude, bottomHeight, interactive: false },\n this.lineMaterial\n )\n return [extrudedPolygon, topLines, bottomLines]\n } catch (err) {\n return []\n }\n }\n\n const createLineString = (geometry: LineString, feature: GeoJSONLineStringFeature) => {\n try {\n const color =\n feature.properties.style.polygonFill ?? colorOptions ?? \"#000000\"\n const material = this.getOrCreateMaterialByColor(color)\n const extrudedLine = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(geometry.coordinates),\n { height: heightOptions, ...options },\n material\n )\n return [extrudedLine]\n } catch (err) {\n return []\n }\n }\n\n try {\n switch (feature.geometry.type) {\n case \"MultiPolygon\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const multiMeshes = coordinates.flatMap(polygonCoordinates => {\n const meshes = createPolygon({ type: 'Polygon', coordinates: polygonCoordinates }, feature as GeoJSONMultiPolygonFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n })\n return multiMeshes\n }\n case \"Polygon\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const meshes = createPolygon(feature.geometry, feature as GeoJSONPolygonFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n }\n\n case \"LineString\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const meshes = createLineString(feature.geometry, feature as GeoJSONLineStringFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n }\n }\n } catch (err) {\n console.log(`error createGeometry`, err, { feature, options })\n }\n }\n\n createRoomWall(unit: UnitFeature, openings: OpeningFeature[] = []): MapElement | MapElement[] | null {\n\n const polygons = unit.geometry.type === 'Polygon' ? [unit.geometry.coordinates] : unit.geometry.coordinates\n return polygons.map(plg => {\n return plg.map(ring => {\n const roomWall = cleanCoords(polygonToLine(polygon([ring]))) as Feature<LineString>\n if (openings.length === 0) {\n const color = \"#ababab\"\n const material = this.getOrCreateMaterialByColor(color)\n const extrudedWall = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(roomWall.geometry.coordinates),\n { height: 4, width: 1 },\n material\n )\n return extrudedWall\n }\n \n // Split ring with each opening\n let openingPoints = []\n openings.forEach(opening => {\n const doorCoords = opening?.geometry?.coordinates;\n \n const p0 = point(doorCoords[0]);\n const p1 = point(doorCoords[doorCoords.length - 1]);\n\n // 3) snap door endpoints to boundary\n const s0 = nearestPointOnLine(roomWall, p0, { units: \"meters\" });\n const s1 = nearestPointOnLine(roomWall, p1, { units: \"meters\" });\n\n // Optional sanity check: ensure the door is actually on the boundary (within tolerance)\n const d0 = s0.properties.dist as number;\n const d1 = s1.properties.dist as number;\n if (d0 > 1 || d1 > 1) {\n // Door endpoints are not on (or near) the roomWall. Increase tolerance or fix input.\");\n } else {\n openingPoints = openingPoints.concat([s0.geometry.coordinates, s1.geometry.coordinates])\n }\n })\n \n try {\n const split = lineSplit(roomWall, multiPoint(openingPoints))\n /** \n * Remove the segment that corresponds to the door:\n * use midpoint distance-to-door test (robust for angled doors)\n */\n \n const wallsOnly = split.features.filter((seg) => {\n const mid = along(seg, length(seg, { units: \"meters\" }) / 2, { units: \"meters\" });\n for (const opening of openings) {\n const dist = pointToLineDistance(mid, opening, { units: \"meters\" });\n if (dist < 0.05) return false\n }\n return true\n });\n\n const wallMeshes = wallsOnly.map((feature, i) => {\n const color = \"#ababab\"\n const material = this.getOrCreateMaterialByColor(color)\n \n const extrudedLine = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(feature.geometry.coordinates),\n { height: 3, width: 0.4, id: unit.id },\n material\n )\n extrudedLine.getObject3d().userData = {\n unitId: unit.id,\n coords: feature.geometry.coordinates, \n }\n return extrudedLine\n }).flat()\n\n this.threeLayer.addMesh(wallMeshes)\n return wallMeshes\n } catch (e) {\n console.log(e.message, { unit, roomWall })\n return []\n }\n }).flat()\n }).flat()\n }\n\n async createEscalator(\n f: ImdfFeature,\n coordinate: Position,\n options: { angle: number; direction: 'up' | 'down' },\n ): Promise<MapElement | MapElement[] | null> {\n\n const model = {\n url: 'https://cdn.venue.in.th/static/glb/escalator.glb',\n size: 4.4, \n }\n \n const { direction: dir, angle } = options;\n const rotationZ = (dir === \"up\") ? (180 + angle) : angle\n var escalatorMarker = new maptalks.GLTFMarker(coordinate, {\n symbol: {\n url: model.url,\n rotationZ,\n translationX: dir === \"up\" ? 0 : model.size * Math.cos(Math.PI * rotationZ / 180),\n translationY: dir === \"up\" ? 0 : model.size * Math.sin(Math.PI * rotationZ / 180),\n translationZ: dir === \"up\" ? -0.05 * model.size : -0.5 * model.size,\n },\n });\n\n escalatorMarker.addTo(this.gltfLayer);\n return escalatorMarker\n }\n\n // Note: Move to another renderer and keep this file on Geometry only?\n createGroundLabel(f: LabelFeature, unit: UnitFeature): MapElement | MapElement[] | null {\n const text = f.properties.name\n const bound = f.geometry.coordinates[0]\n\n const { height: unitHeight } = get3DRendererOption('unit', unit.properties.category, this.options)\n const options: GroundLabelOptions = { bottomHeight: unitHeight + 0.005 }\n\n const groundLabel = new GroundLabel(bound, text, options, this.threeLayer)\n this.threeLayer.addMesh(groundLabel)\n return groundLabel\n }\n\n async createModel3d(f: Model3dFeature): Promise<MapElement | MapElement[] | null> {\n const marker = new maptalks.GLTFMarker(f.properties.center, {\n symbol: {\n url: f.properties.model,\n },\n });\n\n marker.addTo(this.gltfLayer);\n return marker\n }\n\n async createBuilding(coordinate: Position, ordinal: number): Promise<MapElement | MapElement[] | null> {\n // const marker = new maptalks.GLTFMarker(coordinate, {\n // symbol: {\n // url: 'https://cdn.venue.in.th/static/glb/iconsiam.glb',\n // rotationZ: 4,\n // translationY: -10,\n // scaleX: 49,\n // scaleY: 49,\n // scaleZ: 49,\n // },\n // });\n // marker.on(\"zoom\", (e) => {\n // console.log(`zoom`, e)\n // })\n // marker.addTo(this.gltfLayer);\n // return marker\n return Promise.resolve(null)\n }\n \n createElement(f: ImdfFeature): MapElement[] | null {\n switch (f.feature_type) {\n default:\n return null\n }\n }\n\n showElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n\n hideElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n try { \n element.hide()\n } catch (err) {\n console.log(`cannot hide`, err, element)\n }\n })\n }\n\n createHighlightController(element: MapElement): IHighlightController {\n if (!(element instanceof BaseObject)) {\n return null; // not my responsibility\n }\n switch (element.type) {\n case 'ExtrudePolygon':\n case 'ExtrudeLine': {\n const mesh = element.getObject3d() as THREE.Mesh\n const originalMaterial = mesh.material;\n const highlightMaterial = this.getOrCreateMaterialByColor('#ff0000');\n\n return {\n start: () => {\n mesh.material = highlightMaterial;\n },\n clear: () => {\n mesh.material = originalMaterial;\n },\n };\n }\n\n default: {\n return {\n start() {},\n clear() {}\n }\n }\n }\n \n }\n\n render() {\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n // @ts-ignore\n this.threeLayer.redraw()\n }\n\n // this.#animationsToRun.forEach(({ callback }) => callback(this))\n\n //update TWEEN.js animaton\n // TWEEN.update()\n\n requestAnimationFrame(this.render.bind(this))\n }\n}\n\n\n/**\n * Legacy threejs way\n * async loadModel3d(model3d: LoadModel3dParameters) {\n const loader = new GLTFLoader()\n loader.setDRACOLoader(this.dracoLoader)\n\n const { url, properties: modelProperties } = model3d\n const gltf = await loader.loadAsync(url)\n \n const model = gltf.scene\n // จัดขนาด + scale ที่เหมาะสม\n model.rotation.x = modelProperties.rotation.x\n model.rotation.y = modelProperties.rotation.y\n\n model.position.x = modelProperties.position.x\n model.position.y = modelProperties.position.y\n model.position.z = modelProperties.position.z\n \n const scale = modelProperties.scale\n model.scale.set(scale, scale, scale)\n return model\n }\n\n * const model = await this.loadModel3d({\n url: 'https://dashboard.situm.com/uploads/3dmodels/demoaccount/new_escalator.glb',\n properties: {\n rotation: {\n x: 0.5 * Math.PI, // Rotate the model up (new_escalator.glb)\n y: 0,\n z: 0,\n },\n position: { x: 0, y: 0, z: 0 },\n scale: 0.01,\n },\n });\n\n // map heading\n model.rotation.y += (dir === \"up\") ? Math.PI + angle : angle;\n\n const box = new THREE.Box3().setFromObject(model);\n const pivotPoint =\n dir === 'up'\n ? new THREE.Vector3(0, 0, 0)\n : new THREE.Vector3(\n 1 * (box.min.x + box.max.x),\n 1 * (box.min.y + box.max.y),\n 0.60 * box.max.z,\n );\n\n const pivot = new THREE.Group();\n pivot.add(model);\n\n model.position.sub(pivotPoint);\n model.updateMatrixWorld(true);\n\n const altitude = f.properties.ordinal * HEIGHT_METER;\n\n const baseObjectModel = this.threeLayer.toModel(pivot, {\n coordinate,\n altitude,\n });\n\n this.threeLayer.addMesh(baseObjectModel);\n return baseObjectModel;\n */","import * as maptalks from \"maptalks-gl\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport {\n Texture,\n Mesh,\n MeshPhongMaterial,\n PlaneGeometry,\n Material,\n} from \"three\"\nimport { largestRect } from \"d3plus-shape\"\nimport { max, merge, isNumber, isArray, range } from \"lodash-es\"\nimport { Position } from \"geojson\"\n\nexport type GroundLabelOptions = {\n bottomHeight?: number\n altitude?: number\n fontSize?: number\n fontWeight?: number\n fillStyle?: string\n textAlign?: string\n fontFamily?: string\n textBaseline?: string\n strokeStyle?: string\n lineWidth?: number\n lineHeight?: number\n margin?: number\n angle?: number[]\n scaleMin?: number\n scaleStep?: number\n maxFontScale?: number\n offsetX?: number\n offsetY?: number\n}\n\nconst OPTIONS = {\n // Allowing click through and prevent interaction\n interactive: false,\n altitude: 0,\n}\n\nconst defaultFlatLabelOptions: GroundLabelOptions = {\n fontSize: 14,\n fontFamily: \"Manrope\",\n fontWeight: 600,\n margin: 0,\n scaleMin: 0.5,\n lineHeight: 1.05,\n scaleStep: 0.05,\n textAlign: \"center\",\n textBaseline: \"middle\",\n fillStyle: \"#000\",\n}\n\nconst defaultRectAngleToCalc = range(-90, 92, 2)\n\nexport const getMaterial = (text, flatLabelOptions) => {\n const options = merge({}, defaultFlatLabelOptions, flatLabelOptions)\n\n const {\n fontSize: initialFontSize,\n fontFamily,\n fontWeight,\n margin,\n scaleMin,\n scaleStep,\n fillStyle,\n lineHeight,\n textAlign,\n strokeStyle,\n lineWidth,\n textBaseline,\n } = options\n\n const pixelMultiplier = 4\n const SIZE = 100 * pixelMultiplier\n const fontSize = initialFontSize * (pixelMultiplier * 1.25)\n const canvas = document.createElement(\"canvas\")\n canvas.width = canvas.height = SIZE\n const ctx = canvas.getContext(\"2d\")\n\n ctx.font = `${fontWeight} ${fontSize}px \"${fontFamily}\", Arial`\n ctx.textAlign = textAlign\n ctx.textBaseline = textBaseline\n ctx.fillStyle = fillStyle\n ctx.strokeStyle = strokeStyle\n ctx.lineWidth = lineWidth\n\n // Function to wrap text automatically\n const wrapText = (ctx, text, maxWidth) => {\n const words = text.trim().split(/\\s+/)\n if (words.length <= 1) return [text]\n\n const lines = []\n const MAX_LINES = 3\n let currentLine = words[0]\n\n for (let i = 1; i < words.length; i++) {\n const lineToMeasure = currentLine + \" \" + words[i]\n if (ctx.measureText(lineToMeasure).width > maxWidth) {\n lines.push(currentLine)\n currentLine = words[i]\n } else {\n currentLine = lineToMeasure\n }\n }\n lines.push(currentLine)\n return lines.slice(0, MAX_LINES) // Limit to 3 lines\n }\n\n /** Check if text contains manual line breaks */\n const hasManualBreaks = text.includes(\"\\n\")\n let texts\n\n if (hasManualBreaks) {\n // Use manual line breaks\n texts = text.split(/\\n/g)\n } else {\n // Auto-wrap text\n const maxWidth = SIZE - 2 * margin\n texts = wrapText(ctx, text, maxWidth)\n }\n\n /** Automatically recalculate font size to fit the bound */\n let textWidth: number = max(texts.map((text) => ctx.measureText(text).width))\n let scale = 1\n while (scale > 0 && textWidth + 2 * margin > SIZE) {\n scale -= scaleStep\n ctx.font = `${fontWeight} ${scale * fontSize}px \"${fontFamily}\", Arial`\n textWidth = max(texts.map((text) => ctx.measureText(text).width))\n }\n\n // If the text is larger than scaleMin, then render it\n const center = { x: 0.5 * SIZE, y: 0.5 * SIZE }\n\n if (scale > scaleMin) {\n const totalHeight = texts.length * (fontSize * scale * lineHeight)\n const startY =\n center.y - totalHeight / 2 + fontSize * scale * lineHeight * 0.5 // Adjust startY when offset multi text line\n\n texts.forEach((text, index) => {\n const yOffset = startY + index * (fontSize * scale * lineHeight)\n if (strokeStyle && lineWidth) {\n ctx.strokeText(text, center.x, yOffset) // Draw outlined text\n }\n ctx.fillText(text, center.x, yOffset)\n })\n }\n\n const texture = new Texture(canvas)\n texture.needsUpdate = true\n\n const material = new MeshPhongMaterial({\n map: texture,\n transparent: true,\n // @ref: https://threejs.org/docs/#api/en/materials/Material.alphaTest\n alphaTest: 0.3,\n })\n return material\n}\n\nexport class GroundLabel extends BaseObject {\n\n declare options: GroundLabelOptions;\n \n #angle = 0\n #bearing = 0\n #text = \"\"\n #offsetX = 0\n #offsetY = 0\n #originalPosition = null\n #layer: ThreeLayer = null\n\n constructor(bound: Position[], text: string, options: GroundLabelOptions, layer: ThreeLayer) {\n\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n coordinate: bound,\n })\n\n const {\n altitude = 0,\n bottomHeight = 0,\n fontSize,\n fillStyle,\n textAlign,\n fontFamily,\n textBaseline,\n strokeStyle,\n lineWidth,\n angle = defaultRectAngleToCalc,\n maxFontScale,\n offsetX = 0,\n offsetY = 0,\n ...properties\n } = options\n\n super()\n this._initOptions(options)\n this.properties = properties\n\n this.#offsetX = offsetX\n this.#offsetY = offsetY\n this.#layer = layer\n\n const material = getMaterial(text, {\n fillStyle,\n fontSize,\n textAlign,\n textBaseline,\n fontFamily,\n strokeStyle,\n lineWidth,\n })\n\n // Convert angle to array if it's a single number\n const rectAngles = isArray(angle) ? angle : [angle]\n\n material.needsUpdate = true\n\n const rect = largestRect(bound, {\n cache: true,\n /**\n * Black magic here:\n * For some reason if we allow angle -90 or 90, some polygon will use that angle even if it's wrong angle to use.\n * So we remove -90 and 90 from choices, and use -85 & 85 instead.\n */\n angle: rectAngles,\n })\n\n const { cx, cy, width, angle: calculatedAngle } = rect\n this.#text = text\n this.#angle = calculatedAngle // Always use calculated angle from largestRect\n\n const geometry = new PlaneGeometry(1, 1)\n this._createMesh(geometry, material)\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude + bottomHeight, altitude + bottomHeight).x\n const basePosition = layer.coordinateToVector3([cx, cy], z)\n\n this.#originalPosition = basePosition.clone()\n const finalPosition = this.#calculateFinalPosition(basePosition)\n\n const scale = width / 0.0006456122659\n // check if it has maxFontScaleLimit from option use maxFontScale\n const finalScale =\n maxFontScale && scale > maxFontScale ? maxFontScale : scale\n this.getObject3d().scale.set(finalScale, finalScale, finalScale)\n this.getObject3d().position.copy(finalPosition)\n this.getObject3d().rotation.z = (Math.PI / 180) * this.#angle\n }\n\n #calculateFinalPosition(basePosition) {\n if (this.#offsetX === 0 && this.#offsetY === 0) {\n return basePosition\n }\n\n const offsetCoordinate = [this.#offsetX, this.#offsetY]\n\n const z = this.#layer.altitudeToVector3(0, 0).x\n const offsetVector = this.#layer.coordinateToVector3(offsetCoordinate, z)\n const zeroVector = this.#layer.coordinateToVector3([0, 0], z)\n\n const worldOffsetX = offsetVector.x - zeroVector.x\n const worldOffsetY = offsetVector.y - zeroVector.y\n\n return {\n x: basePosition.x + worldOffsetX,\n y: basePosition.y + worldOffsetY,\n z: basePosition.z,\n }\n }\n\n #updatePosition() {\n if (this.#originalPosition && this.#layer) {\n const finalPosition = this.#calculateFinalPosition(this.#originalPosition)\n this.getObject3d().position.copy(finalPosition)\n }\n }\n\n set bearing(value) {\n this.#bearing = value\n const degree = this.#angle + this.#bearing\n const angle = degree > 90 || degree < -90 ? this.#angle + 180 : this.#angle\n this.getObject3d().rotation.z = (Math.PI / 180) * angle\n }\n\n get angle() {\n return this.#angle\n }\n\n get currentAngle() {\n return this.#angle\n }\n\n get text() {\n return this.#text\n }\n\n get offsetX() {\n return this.#offsetX\n }\n\n get offsetY() {\n return this.#offsetY\n }\n\n get offset() {\n return { x: this.#offsetX, y: this.#offsetY }\n }\n\n set offsetX(value) {\n if (isNumber(value)) {\n this.#offsetX = value\n this.#updatePosition()\n }\n }\n\n set offsetY(value) {\n if (isNumber(value)) {\n this.#offsetY = value\n this.#updatePosition()\n }\n }\n\n set angle(newAngle) {\n if (isNumber(newAngle)) {\n this.#angle = newAngle\n this.getObject3d().rotation.z = (Math.PI / 180) * this.#angle\n }\n }\n\n setOffset(offsetX, offsetY) {\n if (isNumber(offsetX) && isNumber(offsetY)) {\n this.#offsetX = offsetX\n this.#offsetY = offsetY\n this.#updatePosition()\n }\n }\n\n addOffset(deltaX, deltaY) {\n if (isNumber(deltaX) && isNumber(deltaY)) {\n this.#offsetX += deltaX\n this.#offsetY += deltaY\n this.#updatePosition()\n }\n }\n\n resetOffset() {\n this.#offsetX = 0\n this.#offsetY = 0\n this.#updatePosition()\n }\n\n moveToPosition(targetX, targetY) {\n if (this.#originalPosition && this.#layer) {\n const currentCenter = this.#layer.vector3ToCoordinate(\n this.#originalPosition\n )\n this.#offsetX = targetX - currentCenter.x\n this.#offsetY = targetY - currentCenter.y\n this.#updatePosition()\n }\n }\n\n updateText(newText, options: Record<string, unknown> = {}) {\n this.#text = newText\n\n const materialOptions = {\n fillStyle: options.fillStyle || this.properties.fillStyle,\n fontSize: options.fontSize || this.properties.fontSize,\n textAlign: options.textAlign || this.properties.textAlign,\n textBaseline: options.textBaseline || this.properties.textBaseline,\n fontFamily: options.fontFamily || this.properties.fontFamily,\n strokeStyle: options.strokeStyle || this.properties.strokeStyle,\n lineWidth: options.lineWidth || this.properties.lineWidth,\n }\n\n const newMaterial = getMaterial(newText, materialOptions) as Material\n ;(this.getObject3d() as Mesh).material = newMaterial\n newMaterial.needsUpdate = true\n }\n\n _animation() {\n // Flip text, if needed\n const map = this.getMap();\n if (!map) return;\n\n const bearing = map.getBearing();\n this.bearing = bearing\n }\n\n // Add bottomHeight to altitude as final altitude position\n setAltitude(altitude: number) {\n const bottomHeight = this.options.bottomHeight ?? 0\n return super.setAltitude(altitude + bottomHeight)\n }\n}\n","import { Element3DRendererOptions } from \"../types\";\n\n/**\n * minZoom, maxZoom = สำหรับระบุ zoom ที่จะให้ปรากฎตัว\n */\n\nexport const element3DRendererOptions: Element3DRendererOptions = {\n unit: {\n default: { color: \"#ffffff\", height: 0.2 },\n byCategory: {\n walkway: { color: \"#cccccc\", height: 0.1 },\n terrace: { color: \"#cccccc\", height: 0.1 },\n unenclosedarea: { color: \"#cccccc\", height: 0.2 },\n nonpublic: { color: \"#999999\", height: 0.3 },\n escalator: { height: 0.2 },\n parking: { color: \"#999999\", height: 0.1 },\n room: { color: \"#ffffff\", height: 0.5, bottomHeight: 0.12 }\n },\n },\n kiosk: {\n default: { color: \"#666666\", height: 0.6, bottomHeight: 0.12 },\n },\n fixture: {\n default: { color: \"#ffffff\", height: 0.5 },\n byCategory: {\n water: { color: \"#ACD7EC\", height: 0.1 },\n vegetation: { color: \"#91C499\", height: 0.5 },\n wall: { color: \"#787878\", topColor: '#ffffff', height: 4.2, width: 1 }\n }\n }\n}","import {\n CreateExtrudeLineStringOptionType,\n CreateExtrudePolygonOptionType,\n Element3DRendererOptions,\n} from '../../types'\nimport { element3DRendererOptions as defaultOptions } from '../element3DRendererOptions'\n\n\nconst DEFAULT_POLYGON_OPTION: CreateExtrudePolygonOptionType = {\n color: \"#FFFFFF\",\n offset: 0,\n altitude: 0,\n}\n\nexport const get3DRendererOption = (\n featureType: string,\n category: string,\n options: Element3DRendererOptions\n): CreateExtrudePolygonOptionType | CreateExtrudeLineStringOptionType => {\n try {\n const option = options[featureType] ?? defaultOptions[featureType]\n return (\n (category && option.byCategory?.[category]) ??\n option?.default ??\n DEFAULT_POLYGON_OPTION\n )\n } catch (err) {\n console.log(err.message, { options, featureType, category })\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { Element2DRendererOptions, IElementRenderer, IHighlightController, MapElement } from \"../types\"\nimport { ImdfFeature, LabelFeature, LevelFeature, OpeningFeature, UnitFeature } from \"../../../data\"\nimport { element2DRendererOptions as defaultOptions } from \"./element2DRendererOptions\"\nimport { PolygonOptionsType } from \"maptalks/dist/geometry/Polygon\"\nimport { Position } from \"geojson\"\n\nconst DEFAULT_POLYGON_OPTION: PolygonOptionsType = {\n zIndex: 0,\n symbol: {\n polygonFill: \"#FFFFFF\",\n lineColor: \"#34495E\",\n polygonOpacity: 1,\n lineWidth: 2,\n },\n}\n\nconst ORDINAL_HEIGHT = 4\nconst MULTIORDINAL_HEIGHT_METER = 10\n\nconst getAltitude = (f: LevelFeature) =>\n Math.max(0, f.properties.ordinal * ORDINAL_HEIGHT || 0)\n\nconst getGeometryProperties = (feature: ImdfFeature) => ({\n // Core\n type: \"Feature\",\n id: feature.id,\n geometry: feature.geometry,\n properties: feature.properties,\n // Extra\n feature_type: feature.feature_type,\n category: feature.properties.category,\n name: feature.properties.name?.en,\n})\n\nconst getGeometryOption = (\n feature: ImdfFeature,\n options: Element2DRendererOptions\n): PolygonOptionsType => {\n try {\n const option = options[feature.feature_type] ?? defaultOptions[feature.feature_type]\n const category = feature.properties.category\n return (\n (category && option.byCategory?.[category]) ??\n option?.default ??\n DEFAULT_POLYGON_OPTION\n )\n } catch (err) {\n console.log(err.message, { options, feature })\n }\n}\n\nexport class Element2DRenderer\n extends EventTarget\n implements IElementRenderer\n{\n public isReady: boolean = false\n\n private options: Element2DRendererOptions\n private map: maptalks.Map\n private elementLayer: maptalks.VectorLayer\n private markerLayer: maptalks.VectorLayer\n\n constructor(map: maptalks.Map, options: Element2DRendererOptions) {\n super()\n this.options = options\n this.map = map\n\n // Create Layer for elements\n this.elementLayer = new maptalks.VectorLayer(\"elements\")\n this.elementLayer.addTo(this.map)\n\n this.markerLayer = new maptalks.VectorLayer(\"markers\")\n this.markerLayer.addTo(this.map)\n\n // Dispatch ready event, to let manager know we're ready to start\n this.isReady = true\n }\n\n createGeometry = (imdfFeature: ImdfFeature): MapElement => {\n // Create Element (Geometry)\n const feature = getGeometryProperties(imdfFeature)\n const { symbol, ...options } = getGeometryOption(imdfFeature, this.options)\n const altitude = feature.properties.ordinal * 10\n const geometry = maptalks.Geometry.fromJSON({\n feature,\n symbol,\n options: {\n ...options,\n zIndex: altitude,\n properties: { altitude },\n },\n })\n\n // Add to layer, and return\n if (Array.isArray(geometry)) {\n geometry.forEach((g) => g.addTo(this.elementLayer))\n return new maptalks.GeometryCollection(geometry)\n } else {\n geometry.addTo(this.elementLayer)\n return geometry\n }\n }\n\n createRoomWall(unit: UnitFeature, openings: OpeningFeature[]): MapElement | MapElement[] | null {\n return null\n }\n\n async createEscalator(f: ImdfFeature, coordinates: Position): Promise<MapElement | null> {\n return Promise.resolve(null)\n }\n\n createGroundLabel(f: LabelFeature, unit: UnitFeature): MapElement | MapElement[] | null {\n const text = f.properties.name\n const bound = f.geometry.coordinates[0]\n return null\n }\n\n async createBuilding(coordinate: Position, ordinal: number): Promise<MapElement | null> {\n return Promise.resolve(null)\n }\n\n createElement = (imdfFeature: ImdfFeature): MapElement | null => {\n switch (imdfFeature.feature_type) {\n default:\n return null\n }\n }\n\n showElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n hideElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.hide()\n })\n }\n\n createHighlightController(element: MapElement): IHighlightController {\n if (!(element instanceof maptalks.Geometry)) return null;\n return {\n start() {},\n clear() {}\n }\n }\n \n \n}\n","import { Element2DRendererOptions } from \"../types\";\n\nexport const element2DRendererOptions: Element2DRendererOptions = {\n unit: { \n default: { symbol: { polygonFill: '#cccccc' } },\n byCategory: {\n room: { symbol: { polygonFill: '#fff' } },\n walkway: { symbol: { polygonFill: \"#efefef\", lineColor: \"#dadada\", lineWidth: 2 } },\n terrace: { symbol: { polygonFill: \"#efefef\" } },\n unenclosedarea: { symbol: { polygonFill: \"#fff\" } },\n nonpublic: { symbol: { polygonFill: \"#999999\" }},\n }\n },\n kiosk: { \n default: {},\n },\n fixture: {\n default: { symbol: { polygonFill: \"#ffffff\" } },\n byCategory: {\n water: { symbol: { polygonFill: \"#ACD7EC\" } },\n vegetation: { symbol: { polygonFill: \"#91C499\" } }\n }\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { IMarkerRenderer } from \"../types\"\nimport { Position } from \"geojson\"\n\nexport class Marker2DRenderer\n extends EventTarget\n implements IMarkerRenderer<maptalks.ui.UIMarker>\n{\n public isReady: boolean = false\n\n private map: maptalks.Map\n private markerLayer: maptalks.VectorLayer\n\n constructor(map: maptalks.Map) {\n super()\n this.map = map\n }\n\n createMarker = (\n coordinates: Position,\n ordinal: number,\n content: string\n ): maptalks.ui.UIMarker => {\n const marker = new maptalks.ui.UIMarker(coordinates, {\n content,\n collision: true,\n collisionFadeIn: true,\n altitude: 0,\n })\n marker.addTo(this.map)\n return marker\n }\n\n removeMarker = (marker: maptalks.ui.UIMarker) => {\n marker.remove()\n }\n\n showMarkers(elements: maptalks.ui.UIMarker[], ordinalDiff: number = 0) {}\n hideMarkers(elements: maptalks.ui.UIMarker[], ordinalDiff: number = 0) {}\n}","import * as maptalks from \"maptalks-gl\"\nimport * as THREE from \"three\"\nimport { IMarkerRenderer } from \"../types\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Position } from \"geojson\"\n// import { createSpriteMaterialByLabelSymbol } from \"../utils/svg2material\"\nimport { TextMarkerOptions, TextSpriteMarker } from \"./objects/TextSpriteMarker\"\n\nexport const HEIGHT_METER = 4\nexport const MULTIORDINAL_HEIGHT_METER = 9\n\nexport type AnyMarkerOptions = TextMarkerOptions\n\nexport class Marker3DRenderer\n extends EventTarget\n implements IMarkerRenderer<BaseObject>\n{\n public isReady: boolean = false\n\n private threeLayer: ThreeLayer\n\n private map: maptalks.Map\n \n private materialByKey: Map<string, THREE.Material>\n \n\n constructor(map: maptalks.Map, options: any, layer: ThreeLayer) {\n super()\n this.map = map\n this.threeLayer = layer\n }\n\n createTextMarker = (\n position: Position,\n ordinal: number,\n label: string,\n options?: TextMarkerOptions\n ): BaseObject => {\n const combinedOptions = {\n altitude: ordinal * HEIGHT_METER,\n text: label,\n ...(options ?? {})\n }\n const [lng, lat] = position\n const marker = new TextSpriteMarker(new maptalks.Coordinate(lng, lat), combinedOptions, this.threeLayer)\n this.threeLayer.addMesh([marker])\n return marker\n }\n\n createImageMarker = () => {\n /**\n * function createMateria(fillStyle) {\n const idx = Math.floor(Math.random() * 3);\n return new THREE.PointsMaterial({\n // size: 10,\n sizeAttenuation: false,\n color: fillStyle,\n // alphaTest: 0.5,\n // vertexColors: THREE.VertexColors,\n // transparent: true\n // color: 0xffffff,\n size: 40,\n transparent: true, //使材质透明\n blending: THREE.AdditiveBlending,\n depthTest: true, //深度测试关闭,不消去场景的不可见面\n depthWrite: false,\n map: new THREE.TextureLoader().load('./data/' + idx + '.svg')\n //刚刚创建的粒子贴图就在这里用上\n });\n }\n */\n // const material = this.getOrCreateIconMaterial(\n // \"amenity.escalator\"\n // ) as THREE.SpriteMaterial\n // const marker = new SpriteMarker(\n // coordinates,\n // options,\n // material,\n // this.threeLayer,\n // {}\n // )\n }\n\n createMarker = (\n coordinates: Position,\n ordinal: number,\n label: string,\n options: AnyMarkerOptions\n ): BaseObject => {\n return this.createTextMarker(coordinates, ordinal, label, options)\n }\n\n removeMarker = (marker: BaseObject) => {\n marker.remove()\n }\n\n showMarkers(elements: BaseObject[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n\n hideMarkers(elements: BaseObject[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n try { \n element.hide()\n } catch (err) {\n console.log(`cannot hide`, err, element)\n }\n })\n }\n\n /** Marker */\n // getOrCreateIconMaterial(key) {\n // if (!this.materialByKey) this.materialByKey = new Map()\n\n // const existingMaterial = this.materialByKey.get(key)\n // if (existingMaterial) return existingMaterial\n\n // // Create new\n // const baseSymbol: maptalks.Path = {\n // markerType: \"path\",\n // markerPath: [\n // {\n // path: \"M20.775 1.2H1.225V20.35H8.215L11.3 22.8L14.385 20.35H20.775V1.2Z\",\n // fill: \"#ff0000\",\n // },\n // ],\n // markerPathWidth: 24,\n // markerPathHeight: 24\n // }\n\n // const markerSymbol: maptalks.PathMarkerSymbol = {\n // markerType: \"path\",\n // markerPath: [],\n // // TODO: Get Path by featureType.category\n // // markerPath: [{ fill: \"#FFFFFF\", path: \"M 19 3 H 5 c -1.1 0 -2 0.9 -2 2 v 14 c 0 1.1 0.9 2 2 2 h 14 c 1.1 0 2 -0.9 2 -2 V 5 c 0 -1.1 -0.9 -2 -2 -2 Z m -2 6 h -1.7 l -5 9 H 7 c -0.83 0 -1.5 -0.67 -1.5 -1.5 S 6.17 15 7 15 h 1.7 l 5 -9 H 17 c 0.83 0 1.5 0.67 1.5 1.5 S 17.83 9 17 9 Z\" }],\n // markerPathWidth: 24,\n // markerPathHeight: 24,\n // markerWidth: 24,\n // markerHeight: 24,\n // markerDy: 1.5,\n // markerDx: 1.5,\n // }\n\n // const created = createSpriteMaterialByLabelSymbol([\n // baseSymbol,\n // markerSymbol,\n // ])\n // this.materialByKey.set(key, created)\n // return created\n // }\n}","// TextSpriteMarker.js\nimport { Coordinate, Util } from \"maptalks\"\nimport * as THREE from \"three\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\" // in some builds it's maptalks.three.BaseObject\nimport { BaseObjectOptionType } from \"maptalks.three/dist/type\"\nimport { isNil, set } from \"lodash\"\nimport { Stop } from \"../../types\"\nimport { interpolateStops } from \"../../utils/interpolateStops\"\n\nconst OPTIONS: TextMarkerOptions = {\n // Texture options\n text: \"\",\n textAlign: \"center\",\n color: \"#ffffff\",\n fontFamily: \"sans-serif\",\n fontSize: 28,\n fontWeight: 400,\n background: \"transparent\",\n lineHeight: 32,\n padding: 8,\n strokeColor: \"#000000\",\n strokeWidth: 3,\n strokeStyle: \"round\",\n // Sprite options\n /* Overall scale multiplier */\n scale: 1,\n altitude: 0,\n opacity: 1\n}\n\nexport type TextMarkerOptions = BaseObjectOptionType & {\n // Texture options\n text?: string\n textAlign?: CanvasTextAlign\n color?: CanvasFillStrokeStyles[\"fillStyle\"]\n fontFamily?: string\n fontSize?: number\n fontWeight?: number\n background?: CanvasFillStrokeStyles[\"fillStyle\"]\n lineHeight?: number\n strokeColor?: CanvasFillStrokeStyles[\"strokeStyle\"]\n strokeWidth?: number\n strokeStyle?: CanvasLineJoin\n padding?: number\n maxWidth?: number\n // Sprite options\n scale?: number\n altitude?: number\n bottomHeight?: number\n opacity?: number | { stops: Stop[] }\n}\n\nexport class TextSpriteMarker extends BaseObject {\n #altitudeOffset: number = 0\n declare options: TextMarkerOptions;\n\n constructor(\n coordinate: Coordinate,\n options: TextMarkerOptions,\n layer: ThreeLayer,\n properties: Record<string, any> = {}\n ) {\n options = Util.extend({}, OPTIONS, options, { layer })\n super()\n this._coordinate = new Coordinate(coordinate)\n this._initOptions(options)\n this._createGroup()\n\n this.properties = { ...properties }\n const sprite = this._createSprite()\n\n this.getObject3d().add(sprite)\n\n this._updatePosition()\n\n this.type = \"TextSpriteMarker\"\n }\n\n getOptions(): TextMarkerOptions {\n return super.getOptions()\n }\n\n _createSprite() {\n const options = this.getOptions()\n const texture = this._createTextTexture(options.text, options)\n\n const material = new THREE.SpriteMaterial({\n map: texture,\n transparent: true,\n alphaTest: 0.1,\n })\n\n const sprite = new THREE.Sprite(material)\n\n // position will be set in _animation or directly after added to layer\n // scale to match texture aspect\n const w = texture.image.width\n const h = texture.image.height\n const base = 1 / 16 // to bring canvas px to map size-ish\n\n // Normalize text scale by the current map resolution so sprite size stays visually consistent across zoom levels.\n const normalizedScale = options.scale / this.getMap().getGLRes()\n\n sprite.scale.set(w * base * normalizedScale, h * base * normalizedScale, 1)\n\n // Compute world-space height for text and use it as altitude offset.\n this.#altitudeOffset = Math.max(\n h * base * options.scale * 0.5,\n 0.05 // minimum lift in world units\n )\n\n return sprite\n }\n\n _createTextTexture(text: string, options: TextMarkerOptions = {}) {\n const {\n padding,\n fontSize,\n fontFamily,\n fontWeight,\n lineHeight,\n background,\n color,\n textAlign,\n strokeColor,\n strokeWidth,\n maxWidth,\n } = options || {}\n\n // 1. create a temp canvas to measure\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")!\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\n // 2. split into paragraphs (explicit \\n from user)\n const paragraphs = String(text).split(\"\\n\")\n\n // 3. wrap each paragraph to lines\n const wrappedLines: string[] = []\n\n paragraphs.forEach((paragraph) => {\n if (isNil(maxWidth) || isNaN(maxWidth)) {\n // no wrapping, keep as-is\n wrappedLines.push(paragraph)\n return\n }\n\n const words = paragraph.split(/\\s+/)\n let currentLine = \"\"\n\n words.forEach((word) => {\n const testLine = currentLine ? currentLine + \" \" + word : word\n const testWidth = ctx.measureText(testLine).width\n\n if (testWidth > maxWidth && currentLine) {\n // push current and start new\n wrappedLines.push(currentLine)\n currentLine = word\n } else {\n currentLine = testLine\n }\n })\n\n if (currentLine) {\n wrappedLines.push(currentLine)\n }\n })\n\n // 4. figure out final canvas size\n const lines = wrappedLines.length ? wrappedLines : [\"\"]\n const widest = Math.max(...lines.map((l) => ctx.measureText(l).width), 0)\n const finalWidth =\n (maxWidth ? Math.min(widest, maxWidth) : widest) + padding * 2\n const finalHeight = lineHeight * lines.length + padding * 2\n\n canvas.width = finalWidth\n canvas.height = finalHeight\n\n // 5. reapply styles after resize\n const ctx2 = canvas.getContext(\"2d\")!\n ctx2.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n ctx2.textAlign = textAlign\n\n // background\n if (background && background !== \"transparent\") {\n ctx2.fillStyle = background\n ctx2.fillRect(0, 0, canvas.width, canvas.height)\n }\n\n // 6. draw all lines (stroke first, then fill)\n lines.forEach((line, i) => {\n const y = padding + lineHeight * (i + 0.8)\n let x = padding\n if (textAlign === \"center\") x = canvas.width / 2\n if (textAlign === \"right\" || textAlign === \"end\")\n x = canvas.width - padding\n\n if (strokeWidth > 0) {\n ctx2.lineWidth = strokeWidth\n ctx2.lineJoin = \"round\"\n ctx2.miterLimit = 2\n ctx2.strokeStyle = strokeColor\n ctx2.strokeText(line, x, y)\n }\n\n ctx2.fillStyle = color\n ctx2.fillText(line, x, y)\n })\n\n const texture = new THREE.CanvasTexture(canvas)\n texture.needsUpdate = true\n texture.minFilter = THREE.LinearFilter\n return texture\n }\n\n _updatePosition() {\n const options = this.getOptions()\n const layer = options.layer\n\n if (!layer) return\n\n const altitude = (options.altitude || 0) + this.#altitudeOffset\n const z = layer.altitudeToVector3(altitude, altitude).x\n const position = layer.coordinateToVector3(this._coordinate, z)\n set(this.properties, \"default.position\", position)\n this.getObject3d().position.copy(position)\n }\n\n _animation() {\n const layer = this.getLayer() as ThreeLayer\n\n if (!this.isAdd || !layer) return\n\n if (this._visible === true) {\n const zoom = layer.map.getZoom()\n \n const object3d = this.getObject3d()\n const { opacity } = this.getOptions()\n \n // Calculate opacity based on type\n let opacityValue: number\n if (typeof opacity === 'number') {\n opacityValue = opacity ?? 1\n } else if (Array.isArray(opacity.stops)) {\n opacityValue = interpolateStops(opacity, zoom)\n } else {\n throw new Error(`Unknown opacity value ${opacity}`)\n }\n // Hide object outside zoom range\n const visible = opacityValue > 0.5\n object3d.visible = visible\n }\n }\n\n setText(text: string) {\n const options = this.getOptions()\n options.text = text\n\n const newSprite = this._createSprite()\n const group = this.getObject3d()\n\n // Remove all old sprites from the group (but keep group itself)\n group.children.forEach((child) => group.remove(child))\n group.add(newSprite)\n\n this._updatePosition()\n }\n\n setAltitude(altitude: number) {\n const bottomHeight = this.options.bottomHeight ?? 0\n return super.setAltitude(altitude + bottomHeight + this.#altitudeOffset)\n }\n}\n","import { Stop } from \"../types\"\n\nexport const interpolateStops = ({ stops }: { stops: Stop[] }, zoom: number) => {\n // If zoom is before the first stop\n if (zoom <= stops[0][0]) return stops[0][1]\n // If zoom is after the last stop\n if (zoom >= stops[stops.length - 1][0]) return stops[stops.length - 1][1]\n \n // Find the two stops around the zoom\n for (let i = 0; i < stops.length - 1; i++) {\n const [z1, v1] = stops[i]\n const [z2, v2] = stops[i + 1]\n\n if (zoom >= z1 && zoom <= z2) {\n const t = (zoom - z1) / (z2 - z1)\n return v1 + t * (v2 - v1)\n }\n }\n}","export const getLineCenter = (line: number[][]) => {\n let x = 0, y = 0;\n for (const [lx, ly] of line) {\n x += lx;\n y += ly;\n }\n const len = line.length;\n return [x / len, y / len];\n};\n\n// Returns angle in radians\nexport const angleBetweenLineStrings = (\n line1: number[][],\n line2: number[][],\n): number => {\n const [x1, y1] = getLineCenter(line1);\n const [x2, y2] = getLineCenter(line2);\n\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n // angle in radians, range (-PI, PI)\n return Math.atan2(dy, dx);\n};\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","import {\n Feature,\n FeatureCollection,\n Geometry,\n LineString,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { isNumber } from \"@turf/helpers\";\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @function\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(coord: Feature<Point> | Point | number[]): number[] {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n\n if (!Array.isArray(coord)) {\n if (\n coord.type === \"Feature\" &&\n coord.geometry !== null &&\n coord.geometry.type === \"Point\"\n ) {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (\n Array.isArray(coord) &&\n coord.length >= 2 &&\n !Array.isArray(coord[0]) &&\n !Array.isArray(coord[1])\n ) {\n return [...coord];\n }\n\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @function\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords<\n G extends\n | Point\n | LineString\n | Polygon\n | MultiPoint\n | MultiLineString\n | MultiPolygon,\n>(coords: any[] | Feature<G> | G): any[] {\n if (Array.isArray(coords)) {\n return coords;\n }\n\n // Feature\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n // Geometry\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @function\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates: any[]): boolean {\n if (\n coordinates.length > 1 &&\n isNumber(coordinates[0]) &&\n isNumber(coordinates[1])\n ) {\n return true;\n }\n\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @function\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value: any, type: string, name: string): void {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n value.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature: Feature<any>, type: string, name: string): void {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(\n featureCollection: FeatureCollection<any>,\n type: string,\n name: string\n) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom<G extends Geometry>(geojson: Feature<G> | G): G {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(\n geojson: Feature<any> | FeatureCollection<any> | Geometry,\n _name?: string\n): string {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\n\nexport {\n getCoord,\n getCoords,\n containsNumber,\n geojsonType,\n featureOf,\n collectionOf,\n getGeom,\n getType,\n};\n// No default export!\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","import { Position } from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { polygon } from \"@turf/helpers\"\nimport { UnitFeature } from \"../../../data\";\n\nexport const findUnitOnPoint = (units: UnitFeature[], point: Position) => {\n return units.find(unit => booleanPointInPolygon(point, polygon(unit.geometry.coordinates as Position[][])))\n}"],"mappings":"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","names":["QueryObserver","point","polygon","lineString","v","kiosk","section","unit","feature","feature","options","Map","LineString","Coordinate","_","turfCenter","ThreeLayer","_","TextureLoader","SpriteMaterial","scale","BaseObject","Sprite","SpriteMaterial","_","scale","maptalks","BaseObject","OPTIONS","feature","_","_","polygon","scale","feature","_","polygon","SpriteMaterial","TextureLoader","feature_type","properties","logoUrl","scale","v","feature","compact","turfCenter","THREE","maptalks","BaseObject","turfBuffer","maptalks","BaseObject","isNumber","OPTIONS","ctx","text","scale","center","feature","turfBuffer","BaseObject","maptalks","DEFAULT_POLYGON_OPTION","MULTIORDINAL_HEIGHT_METER","feature","DEFAULT_POLYGON_OPTION","MULTIORDINAL_HEIGHT_METER","maptalks","maptalks","Coordinate","Util","THREE","BaseObject","OPTIONS","BaseObject","Util","Coordinate","HEIGHT_METER","MULTIORDINAL_HEIGHT_METER","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","point","scene","v","u","compact","turfCenter","center","_","Map","ThreeLayer","turfCenter","center","Coordinate","feature","geometry","LineString"]}
1
+ {"version":3,"sources":["../src/data/index.ts","../src/data/constant.ts","../src/data/api/delivery-project.ts","../src/data/utils/geometry-validator.ts","../src/data/utils/match-filters.ts","../src/data/utils/occupant-helper.ts","../src/data/getDataClient.ts","../src/data/populator/index.ts","../src/IndoorMap/IndoorMap.ts","../../../node_modules/@turf/helpers/index.ts","../src/IndoorMap/constants.ts","../src/IndoorMap/utils/createElements.js","../src/IndoorMap/object3d/Billboard.js","../src/IndoorMap/object3d/SpriteMarker.ts","../src/IndoorMap/object3d/NavigationPath.ts","../src/IndoorMap/utils/geometry.ts","../src/IndoorMap/utils/svg.ts","../src/IndoorMap/utils/math.ts","../src/IndoorMap/camera/CameraManager.ts","../../../node_modules/@turf/meta/index.js","../../../node_modules/@turf/bbox/index.ts","../src/IndoorMap/renderer/RendererManager.ts","../src/IndoorMap/renderer/3d/Element3DRenderer.ts","../src/IndoorMap/renderer/3d/objects/GroundLabel.ts","../src/IndoorMap/renderer/3d/element3DRendererOptions.ts","../src/IndoorMap/renderer/3d/utils/get3DRendererOption.ts","../src/IndoorMap/renderer/2d/Element2DRenderer.ts","../src/IndoorMap/renderer/2d/element2DRendererOptions.ts","../src/IndoorMap/renderer/2d/Marker2DRenderer.ts","../src/IndoorMap/renderer/3d/Marker3DRenderer.ts","../src/IndoorMap/renderer/3d/objects/TextSpriteMarker.ts","../src/IndoorMap/renderer/utils/interpolateStops.ts","../src/IndoorMap/renderer/utils/angleBetweenLineString.ts","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/util.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/orient2d.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/orient3d.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/incircle.js","../../../node_modules/point-in-polygon-hao/node_modules/robust-predicates/esm/insphere.js","../../../node_modules/point-in-polygon-hao/dist/esm/index.js","../../../node_modules/@turf/invariant/index.ts","../../../node_modules/@turf/boolean-point-in-polygon/index.ts","../src/IndoorMap/renderer/utils/findUnitOnPoint.ts"],"sourcesContent":["export { QueryObserver } from \"@tanstack/query-core\"\n\nexport * from \"./types\"\nexport * from \"./constant\"\nexport * from \"./api/delivery-project\"\nexport * from './utils'\nexport * from \"./getDataClient\"\n","import { FeatureQueryOptions } from \"./types\"\nimport { FeatureType } from \"./types/feature-api\"\n\nexport const DEFAULT_BASE_URL = \"https://service.venue.in.th/api\"\n\nexport const IMDF_FEATURE_TYPES: FeatureType[] = [\n \"address\",\n \"amenity\",\n \"anchor\",\n \"building\",\n \"detail\",\n \"fixture\",\n \"footprint\",\n \"geofence\",\n \"kiosk\",\n \"level\",\n \"occupant\",\n \"opening\",\n \"relationship\",\n \"section\",\n \"unit\",\n \"venue\",\n]\n\nexport const NONIMDF_FEATURE_TYPES: FeatureType[] = [\n \"taxonomy\",\n \"event\",\n \"promotion\",\n \"label\",\n \"privilege\",\n]\n\nexport const GEOJSON_FEATURE_TYPES: FeatureType[] = [\n ...IMDF_FEATURE_TYPES,\n ...NONIMDF_FEATURE_TYPES,\n]\n\nexport const ALL_FEATURE_TYPES: FeatureType[] = [\n ...GEOJSON_FEATURE_TYPES,\n \"sponsored-content\",\n \"element\",\n]\n\nexport const defaultFeatureQueryOptionsMap: Record<\n FeatureType,\n FeatureQueryOptions\n> = {\n // IMDF\n address: {},\n amenity: {},\n anchor: {},\n building: {},\n detail: { enabled: false },\n fixture: {},\n footprint: {},\n geofence: { enabled: false },\n kiosk: {},\n level: {},\n occupant: {\n refetchInterval: 5 * 60 * 1000, // refresh every 5 min\n staleTime: 5 * 60 * 1000,\n },\n opening: {},\n relationship: {},\n section: {},\n unit: {},\n venue: {},\n\n // OTHERS GEOJSON\n taxonomy: {},\n privilege: {},\n event: {},\n promotion: {\n refetchInterval: 0.5 * 60 * 1000, // refresh every 5 min\n staleTime: 0.5 * 60 * 1000,\n },\n label: {},\n\n // NON GEOJSON\n \"sponsored-content\": {\n refetchInterval: 1 * 60 * 1000, // refresh every 5 min\n },\n element: {},\n page: {},\n model3d: {}\n}\n","import type {\n FeatureResponseMap,\n FeatureType,\n SponsoredContentStrapiV4ApiResponse,\n} from \"../types/feature-api\"\nimport { DEFAULT_BASE_URL } from \"../constant\"\n\nexport async function fetchDeliveryApi<T extends FeatureType = FeatureType>(\n projectId: string,\n apiKey: string,\n featureType: FeatureType,\n baseUrl: string = DEFAULT_BASE_URL,\n): Promise<FeatureResponseMap[T][]> {\n // TODO: Update Label Endpoint to match other endpoints\n switch (featureType) {\n case \"label\":\n case \"element\": {\n const pluralFeatureType = `${featureType}s`\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/${pluralFeatureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items\n }\n\n case \"model3d\": {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/${featureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items.features\n }\n\n case \"sponsored-content\": {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/sponsored-content.json?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const jsonRes = await res.json()\n const items = jsonRes.data as SponsoredContentStrapiV4ApiResponse[]\n return items.map((item) => ({\n id: item.id,\n ...item.attributes,\n })) as FeatureResponseMap[T][]\n }\n\n default: {\n const res = await fetch(\n `${baseUrl}/delivery/projects/${projectId}/imdf/${featureType}.geojson?api-key=${apiKey}`\n )\n if (res.status !== 200) return []\n const collections = await res.json()\n return collections.features\n }\n }\n}\n\n\nexport async function fetchPreviewApi<T extends FeatureType = FeatureType>(\n projectId: string,\n previewToken: string,\n featureType: FeatureType,\n baseUrl: string = DEFAULT_BASE_URL,\n): Promise<FeatureResponseMap[T][]> {\n // TODO: Update Label Endpoint to match other endpoints\n switch (featureType) {\n case \"label\":\n case \"element\": {\n const pluralFeatureType = `${featureType}s`\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/${pluralFeatureType}.geojson`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const items = await res.json()\n return items\n }\n\n case \"sponsored-content\": {\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/sponsored-content.json`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const jsonRes = await res.json()\n const items = jsonRes.data as SponsoredContentStrapiV4ApiResponse[]\n return items.map((item) => ({\n id: item.id,\n ...item.attributes,\n })) as FeatureResponseMap[T][]\n }\n\n default: {\n const res = await fetch(\n `${baseUrl}/preview/projects/${projectId}/imdf/${featureType}.geojson`, {\n headers: {\n Authorization: `Bearer ${previewToken}`\n }\n }\n )\n if (res.status !== 200) return []\n const collections = await res.json()\n return collections.features\n }\n }\n}\n\nexport const safeFetchFeature = async <T extends FeatureType = FeatureType>(\n featureType: FeatureType,\n params: { \n mode: 'delivery' | 'preview',\n projectId: string,\n apiKey: string,\n previewToken?: string,\n baseUrl: string\n } \n): Promise<FeatureResponseMap[T][]> => {\n const mode = params.mode ?? 'delivery'\n const projectId = params.projectId\n const apiKey = params.apiKey\n const previewToken = params.previewToken\n const baseUrl = params.baseUrl ?? DEFAULT_BASE_URL\n\n try {\n let result = []\n \n if (mode === 'delivery') {\n result = await fetchDeliveryApi<T>(\n projectId,\n apiKey,\n featureType,\n baseUrl\n )\n } else if (mode === 'preview') {\n result = await fetchPreviewApi<T>(\n projectId,\n previewToken,\n featureType,\n baseUrl\n )\n }\n return result ?? []\n } catch (e) {\n // Suppress error and return []\n return Promise.resolve([])\n }\n}\n","import { Geometry, GeometryCollection, Position } from \"geojson\"\n\n/**\n * Checks if a point is a valid coordinate pair.\n *\n * @param point - The point to be checked.\n * @return True if the point is a valid coordinate pair, false otherwise.\n */\nexport const isValidCoordinate = (point: Position): boolean => {\n return point.length === 2 && point.every((coord) => typeof coord === \"number\")\n}\n\n/**\n * Checks if a set of points forms a valid linear ring (closed and simple polygon).\n *\n * @param ring - The array of points representing a linear ring.\n * @return True if the linear ring is valid, false otherwise.\n */\nfunction isValidLinearRingCoordinates(ring: Position[]): boolean {\n if (ring.length < 4) {\n return false\n }\n\n return (\n ring.every(isValidCoordinate) &&\n ring[0][0] === ring[ring.length - 1][0] &&\n ring[0][1] === ring[ring.length - 1][1]\n )\n}\n\n/**\n * Checks if an input represents a valid polygon, which may include holes.\n * The input can be a single array of coordinates for simple polygons, or\n * an array of arrays of coordinates for polygons with holes.\n *\n * @param polygon - The input representing a polygon.\n * @return True if the polygon is valid, false otherwise.\n */\nexport const isValidPolygonCoordinates = (\n polygon: Position[] | Position[][]\n): boolean => {\n // Check if it's a simple polygon (without holes)\n if (\n Array.isArray(polygon[0]) &&\n (polygon[0].length === 0 || typeof polygon[0][0] === \"number\")\n ) {\n return isValidLinearRingCoordinates(polygon as Position[])\n }\n\n // Check if it's a polygon with holes\n if (\n Array.isArray(polygon) &&\n polygon.length > 0 &&\n Array.isArray(polygon[0])\n ) {\n // Check the outer ring\n if (!isValidLinearRingCoordinates(polygon[0] as Position[])) {\n return false\n }\n\n // Check each hole\n for (let i = 1; i < polygon.length; i++) {\n if (!isValidLinearRingCoordinates(polygon[i] as Position[])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\n/**\n * Checks if an array of polygons forms a valid MultiPolygon.\n *\n * @param multipolygon - The array of polygons.\n * @return True if the multipolygon is valid, false otherwise.\n */\nexport const isValidMultiPolygonCoordinates = (\n multipolygon: Position[][][]\n): boolean => {\n return multipolygon.every(isValidPolygonCoordinates)\n}\n\n/**\n * Checks if a set of points forms a valid LineString.\n * A valid LineString must have at least two points, each point must be a valid coordinate,\n * and it should not form a closed loop.\n *\n * @param lineString - The array of points representing a LineString.\n * @return True if the LineString is valid, false otherwise.\n */\nexport const isValidLineStringCoordinates = (\n lineString: Position[]\n): boolean => {\n if (!Array.isArray(lineString) || lineString.length < 2) {\n return false\n }\n\n // Check if the first and last points are the same, which would make it a polygon\n const firstPoint = lineString[0]\n const lastPoint = lineString[lineString.length - 1]\n if (firstPoint[0] === lastPoint[0] && firstPoint[1] === lastPoint[1]) {\n return false\n }\n\n return lineString.every(isValidCoordinate)\n}\n\nexport const isValidMultiPolygon = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"MultiPolygon\" && isValidMultiPolygonCoordinates(coordinates)\n}\n\nexport const isValidPolygon = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"Polygon\" && isValidPolygonCoordinates(coordinates)\n}\n\nexport const isValidLineString = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"LineString\" && isValidLineStringCoordinates(coordinates)\n}\n\nexport const isValidPoint = (\n geometry: Exclude<Geometry, GeometryCollection>\n): boolean => {\n const { type, coordinates } = geometry\n return type === \"Point\" && isValidCoordinate(coordinates)\n}\n","import type { Value, InFilter, Filter, Filters } from '../types/match-filters'\n\nfunction isInFilter(filter: Filter): filter is InFilter {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"$in\" in filter &&\n Array.isArray((filter as any).$in)\n );\n}\n\nconst someIntersect = (a: Value[], b: Value[]) => a.some(v => b.includes(v));\n\nexport function matchFilter(value: Value | Value[], filter: Filter) {\n\n if (Array.isArray(value)) {\n if (isInFilter(filter)) return someIntersect(value, filter.$in);\n \n // Equal\n return value.includes(filter as Value);\n \n } else {\n if (isInFilter(filter)) return filter.$in.includes(value);\n \n // Equal\n return value === filter;\n }\n}\n\nexport function matchFilters<T extends Record<string, any>>(item: T, filters: Filters): boolean {\n return Object.entries(filters).every(([key, filter]) => {\n return matchFilter(item.properties[key], filter)\n });\n}","import { compact } from \"lodash-es\"\nimport { KioskFeaturePopulated, OccupantFeaturePopulated, UnitFeaturePopulated } from \"../types\";\n\nexport const getOccupantMainLocation = (occupant: OccupantFeaturePopulated): UnitFeaturePopulated | KioskFeaturePopulated => {\n return occupant.properties.kiosk || occupant.properties.unit\n}\n\nexport const getOccupantCorrelatedLocations = (occupant: OccupantFeaturePopulated): Array<UnitFeaturePopulated | KioskFeaturePopulated> => {\n\n const allCorrelatedLocations = [\n ...occupant.properties.units,\n ...occupant.properties.kiosks,\n ]\n\n return compact(allCorrelatedLocations) \n}\n\nexport type OccupantMarkerPlacementType = 'ONCE_PER_LEVEL' | 'ALL_LOCATIONS'\n\nexport const getOccupantMarkerLocations = (occupant: OccupantFeaturePopulated, options?: { type: OccupantMarkerPlacementType }): Array<UnitFeaturePopulated | KioskFeaturePopulated> => {\n\n /**\n * Use optiosn.type first\n * THEN occupant.show_name_on_all_units \n */\n const placementType = options?.type ? options.type : occupant.properties.show_name_on_all_units ? 'ALL_LOCATIONS' : 'ONCE_PER_LEVEL'\n\n const mainLocation = getOccupantMainLocation(occupant)\n\n const mainLocationLevel = mainLocation?.properties?.level_id\n const allCorrelatedLocations = getOccupantCorrelatedLocations(occupant)\n\n // IF showNameonAllLocations = true, Show All \n if (placementType === 'ALL_LOCATIONS') {\n return compact([mainLocation, ...allCorrelatedLocations])\n }\n \n // ELSE Show Once per level\n const otherLevelLocations = allCorrelatedLocations.filter((f) => f.properties.level_id !== mainLocationLevel)\n const onePerLevelLocations = [...new Map(otherLevelLocations.map(loc => [loc.properties.level_id, loc])).values()]\n return compact([mainLocation, ...onePerLevelLocations])\n}\n","import { safeFetchFeature } from \"./api/delivery-project\"\nimport { FeatureResponseMap, FeatureType } from \"./types/feature-api\"\nimport {\n EnsureQueryDataOptions,\n QueryClient,\n QueryObserver,\n} from \"@tanstack/query-core\"\nimport {\n FeatureQueryOptions,\n FilterParams,\n FindParams,\n InternalFilterByType,\n InternalFindById,\n PopulatedParams,\n VenueClientOptions,\n VenueDataClient,\n} from \"./types/VenueDataClient\"\nimport { createPopulator } from \"./populator\"\nimport { FeaturePopulatedResponseMap } from \"./types\"\nimport { matchFilters } from \"./utils/match-filters\"\n\nexport const getDataClient = (options: VenueClientOptions): VenueDataClient => {\n const observers = new Map<\n FeatureType,\n { observer: QueryObserver<any, any>, unsubscribe: () => void }\n >()\n\n const queryClient = options.queryClient ?? new QueryClient()\n const { mode = 'delivery', projectId, apiKey, baseUrl, previewToken } = options\n\n if (!projectId)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `projectId` is missing\"\n )\n \n if (mode === 'delivery' && !apiKey)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `apiKey` is missing\"\n )\n\n if (mode === 'preview' && !previewToken)\n throw new Error(\n \"Cannot create VenueDataClient. Reason: `previewToken` is missing\"\n )\n\n const createDeliveryApiQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T\n ) => ({\n queryKey: [\"_deliveryapi\", featureType] as const,\n queryFn: () => safeFetchFeature<T>(featureType, { mode, projectId, apiKey, previewToken, baseUrl }),\n })\n\n /**\n * Internal Functions\n * ***********************************/\n const internalFilterByType: InternalFilterByType = async <T extends FeatureType = FeatureType>(\n featureType: T\n ) => {\n try {\n const features = await queryClient.ensureQueryData<\n FeatureResponseMap[T][],\n unknown,\n FeatureResponseMap[T][]\n >(createDeliveryApiQueryOptions(featureType))\n return features\n } catch (error) {\n throw error\n }\n }\n\n const internalFindById: InternalFindById = async <T extends FeatureType = FeatureType>(\n id: string\n ) => {\n if (id === null) return null\n const featureType = id.slice(0, id.lastIndexOf(\"-\")) as FeatureType\n const feature = await queryClient.ensureQueryData<FeatureResponseMap[T]>({\n queryKey: [\"_deliveryapi\", featureType, id],\n queryFn: async () => {\n const features = await internalFilterByType(featureType)\n const feature = features.find(\n (f) => f.id === id\n ) as FeatureResponseMap[T]\n return feature ?? null\n },\n })\n return feature\n }\n\n // Create `Feature Populator` with internal functions\n const populator = createPopulator({ internalFindById, internalFilterByType })\n\n /**\n * Public Functions\n * ***********************************/\n const registerObserver = (\n featureType: FeatureType,\n refetchInterval: number\n ) => {\n if (observers.has(featureType)) {\n console.warn(`Observer for ${featureType} already exists`)\n const record = observers.get(featureType)\n return record.observer\n }\n \n const options = createDeliveryApiQueryOptions(featureType)\n const observer = new QueryObserver(queryClient, {\n ...options,\n refetchInterval,\n })\n const unsubscribe = observer.subscribe(() => {\n console.log(`[venue-js] Listening to ${featureType} changes (interval = ${refetchInterval}ms)`)\n // TODO: add logs or what to do after subscribe\n })\n observers.set(featureType, { observer, unsubscribe })\n\n return observer\n }\n\n const destroyObserver = (featureType: FeatureType) => {\n const record = observers.get(featureType)\n if (!record) return\n\n record.unsubscribe()\n observers.delete(featureType)\n }\n\n const destroyObservers = () => {\n observers.forEach(({ observer, unsubscribe }) => {\n unsubscribe()\n observer.destroy()\n })\n observers.clear()\n }\n\n const createFilterByTypeQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T,\n params: FilterParams = {},\n options: FeatureQueryOptions = {}\n ): EnsureQueryDataOptions<FeatureResponseMap[T][] | FeaturePopulatedResponseMap[T][]> => ({\n queryKey: [featureType, \"list\", params] as const,\n queryFn: async () => {\n const features = await internalFilterByType<T>(featureType)\n \n // Filter \n const filters = params.filters ?? {}\n let result = features\n if (params.filters) {\n result = features.filter(f => matchFilters(f, filters))\n }\n\n // Populate\n return params.populate === true\n ? await Promise.all(result.map((f) => populator[featureType](f)))\n : result\n },\n ...(options ?? {}),\n })\n\n const createFindByIdQueryOptions = <T extends FeatureType = FeatureType>(\n featureType: T,\n id: string,\n params: FindParams = {},\n options: FeatureQueryOptions = {}\n ): EnsureQueryDataOptions<FeatureResponseMap[T] | FeaturePopulatedResponseMap[T]> => ({\n queryKey: [featureType, \"detail\", id, params] as const,\n queryFn: async () => {\n const feature = await internalFindById<T>(id)\n return params.populate === true\n ? await populator[featureType](feature)\n : Promise.resolve(feature)\n },\n ...(options ?? {}),\n })\n\n async function filterByType<T extends FeatureType>(featureType: T, params: FilterParams & PopulatedParams): Promise<FeaturePopulatedResponseMap[T][]>\n async function filterByType<T extends FeatureType>(featureType: T, params?: FilterParams): Promise<FeatureResponseMap[T][]>\n async function filterByType<T extends FeatureType>(featureType: T, params?: FilterParams) {\n const filterQueryOptions = createFilterByTypeQueryOptions<T>(\n featureType,\n params\n )\n const features = await queryClient.ensureQueryData(filterQueryOptions)\n return (params?.populate === true) ? features as FeaturePopulatedResponseMap[T][] : features as FeatureResponseMap[T][]\n }\n\n async function findById<T extends FeatureType>(featureType: T, id: string, params: FindParams & PopulatedParams): Promise<FeaturePopulatedResponseMap[T]>\n async function findById<T extends FeatureType>(featureType: T, id: string, params?: FindParams): Promise<FeatureResponseMap[T]>\n async function findById<T extends FeatureType>( featureType: T, id: string, params?: FindParams) {\n const findQueryOptions = createFindByIdQueryOptions<T>(\n featureType,\n id,\n params\n )\n const feature = await queryClient.ensureQueryData(findQueryOptions)\n return feature\n }\n\n return {\n projectId,\n queryClient,\n registerObserver,\n destroyObserver,\n destroyObservers,\n createFilterByTypeQueryOptions,\n createFindByIdQueryOptions,\n filterByType,\n findById,\n }\n}\n","import {\n FeatureResponseMap,\n FeaturePopulatedResponseMap,\n InternalFindById,\n InternalFilterByType,\n SectionFeature,\n} from \"../types\"\nimport { compact } from 'lodash-es'\n\nimport { booleanWithin } from \"@turf/boolean-within\"\n\ntype CreatePopulatorOptions = {\n internalFindById: InternalFindById\n internalFilterByType: InternalFilterByType\n}\n\ntype PopulatableFeatureType = Extract<\n keyof FeatureResponseMap,\n keyof FeaturePopulatedResponseMap\n>\ntype PopulatorFn<T extends PopulatableFeatureType> = (\n f: FeatureResponseMap[T]\n) => Promise<FeaturePopulatedResponseMap[T]>\n\nexport type Populator = {\n [K in PopulatableFeatureType]?: PopulatorFn<K>\n}\n\nexport const createPopulator = ({\n internalFindById,\n internalFilterByType,\n}: CreatePopulatorOptions): Populator => {\n const populateAddress: PopulatorFn<\"address\"> = (address) =>\n Promise.resolve(address)\n const populateBuilding: PopulatorFn<\"building\"> = (building) =>\n Promise.resolve(building)\n const populateDetail: PopulatorFn<\"detail\"> = (detail) =>\n Promise.resolve(detail)\n const populateFootprint: PopulatorFn<\"footprint\"> = (footprint) =>\n Promise.resolve(footprint)\n const populateGeofence: PopulatorFn<\"geofence\"> = (geofence) =>\n Promise.resolve(geofence)\n const populateRelationship: PopulatorFn<\"relationship\"> = (relationship) =>\n Promise.resolve(relationship)\n const populatePrivilege: PopulatorFn<\"privilege\"> = (privilege) =>\n Promise.resolve(privilege)\n const populateEvent: PopulatorFn<\"event\"> = (event) => Promise.resolve(event)\n\n const populatePromotion: PopulatorFn<\"promotion\"> = async (promotion) => {\n const venue = await internalFindById<\"venue\">(promotion.properties.venue_id)\n return {\n ...promotion,\n properties: {\n ...promotion.properties,\n venue,\n },\n }\n }\n\n const populateAmenity: PopulatorFn<\"amenity\"> = async (amenity) => {\n const units = await Promise.all(\n amenity.properties.unit_ids.map(internalFindById<\"unit\">)\n )\n\n const populatedUnits = await Promise.all(units.map(populateUnit))\n\n const venue = await internalFindById<\"venue\">(amenity.properties.venue_id)\n\n const defaultLevel = populatedUnits[0].properties.level\n\n const kiosks = await internalFilterByType<\"kiosk\">(\"kiosk\")\n const ordinalKiosks = kiosks.filter(\n (kiosk) => kiosk.properties.level_id === defaultLevel.id\n )\n const kiosk = ordinalKiosks.find((kiosk) => booleanWithin(amenity, kiosk))\n return {\n ...amenity,\n properties: {\n ...amenity.properties,\n\n ordinal: defaultLevel.properties.ordinal,\n level_name: defaultLevel.properties.name.en,\n units: populatedUnits,\n venue,\n\n _experimental_kiosk: kiosk ? await populateKiosk(kiosk) : null,\n },\n }\n }\n\n const populateAnchor: PopulatorFn<\"anchor\"> = async (anchor) => {\n const unit = await internalFindById<\"unit\">(anchor.properties.unit_id)\n const level = await internalFindById<\"level\">(unit.properties.level_id)\n\n const sections = await internalFilterByType<\"section\">(\"section\")\n const section = sections.find((section) => booleanWithin(anchor, section))\n\n return {\n ...anchor,\n properties: {\n ...anchor.properties,\n level: await populateLevel(level),\n unit: await populateUnit(unit),\n section: section ? await populateSection(section) : null,\n },\n }\n }\n\n const populateFixture: PopulatorFn<\"fixture\"> = async (fixture) => {\n const level = await internalFindById<\"level\">(fixture.properties.level_id)\n const venue = await internalFindById<\"venue\">(fixture.properties.venue_id)\n const anchor = await internalFindById<\"anchor\">(fixture.properties.anchor_id)\n\n return {\n ...fixture,\n properties: {\n ...fixture.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n level: await populateLevel(level),\n venue: await populateVenue(venue),\n ordinal: level.properties.ordinal,\n }\n }\n }\n\n const populateKiosk: PopulatorFn<\"kiosk\"> = async (kiosk) => {\n const level = await internalFindById<\"level\">(kiosk.properties.level_id)\n const venue = await internalFindById<\"venue\">(kiosk.properties.venue_id)\n const anchor = await internalFindById<\"anchor\">(kiosk.properties.anchor_id)\n\n // Find Kiosk's Unit\n const units = await internalFilterByType<\"unit\">(\"unit\")\n const unit = units.find(\n (unit) => {\n try {\n return unit.properties.category === \"walkway\" \n && unit.properties.level_id === kiosk.properties.level_id \n && booleanWithin(kiosk, unit)\n } catch (e) {\n console.log(`Cannot find kiosk(${kiosk.id})'s units:`, e.message)\n return false\n }\n }\n )\n\n let section: SectionFeature | null = null\n\n if (anchor) {\n const sections = await internalFilterByType<\"section\">(\"section\")\n section = sections.find((section) => booleanWithin(anchor, section))\n }\n\n return {\n ...kiosk,\n properties: {\n ...kiosk.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n level: await populateLevel(level),\n venue: await populateVenue(venue),\n ordinal: level.properties.ordinal,\n\n unit: unit ? await populateUnit(unit) : null,\n section: section ? await populateSection(section) : null,\n },\n }\n }\n\n const populateLevel: PopulatorFn<\"level\"> = async (level) => {\n const venue = await internalFindById<\"venue\">(level.properties.venue_id)\n return {\n ...level,\n properties: {\n ...level.properties,\n venue,\n },\n }\n }\n\n const populateOccupant: PopulatorFn<\"occupant\"> = async (occupant) => {\n const {\n anchor_id,\n venue_id,\n local_category_ids,\n promotion_ids,\n privilege_ids,\n kiosk_id,\n unit_id,\n kiosk_ids = [],\n unit_ids = [],\n } = occupant.properties\n const anchor = await internalFindById<\"anchor\">(anchor_id)\n const venue = await internalFindById<\"venue\">(venue_id)\n\n const localCategories = await Promise.all(\n local_category_ids.map(internalFindById<\"taxonomy\">)\n )\n const promotions = await Promise.all(\n promotion_ids.map(internalFindById<\"promotion\">)\n )\n const privileges = await Promise.all(\n privilege_ids.map(internalFindById<\"privilege\">)\n )\n const kiosk = await internalFindById<\"kiosk\">(kiosk_id)\n const unit = await internalFindById<\"unit\">(unit_id)\n\n const kiosks = await Promise.all(kiosk_ids.map(internalFindById<\"kiosk\">))\n const units = await Promise.all(unit_ids.map(internalFindById<\"unit\">))\n return {\n ...occupant,\n properties: {\n ...occupant.properties,\n anchor: anchor ? await populateAnchor(anchor) : null,\n local_categories: await Promise.all(\n compact(localCategories).map(populateTaxonomy)\n ),\n venue,\n promotions,\n privileges,\n\n kiosk: kiosk ? await populateKiosk(kiosk) : null,\n unit: unit ? await populateUnit(unit) : null,\n kiosks: await Promise.all(kiosks.map(populateKiosk)),\n units: await Promise.all(units.map(populateUnit)),\n },\n }\n }\n\n const populateOpening: PopulatorFn<\"opening\"> = async (opening) => {\n const venue = await internalFindById<\"venue\">(opening.properties.venue_id)\n const level = await internalFindById<\"level\">(opening.properties.level_id)\n return {\n ...opening,\n properties: {\n venue,\n level: await populateLevel(level),\n ordinal: level.properties.ordinal,\n }\n }\n }\n\n const populateSection: PopulatorFn<\"section\"> = async (section) => {\n const venue = await internalFindById<\"venue\">(section.properties.venue_id)\n const level = await internalFindById<\"level\">(section.properties.level_id)\n return {\n ...section,\n properties: {\n ...section.properties,\n venue,\n level: await populateLevel(level),\n ordinal: level.properties.ordinal,\n },\n }\n }\n\n const populateUnit: PopulatorFn<\"unit\"> = async (unit) => {\n const venue = await internalFindById<\"venue\">(unit.properties.venue_id)\n const level = await internalFindById<\"level\">(unit.properties.level_id)\n\n const sections = await internalFilterByType<\"section\">(\"section\")\n try {\n const section = unit.geometry.type !== 'MultiPolygon' ? sections.find((section) => booleanWithin(unit, section)) : null\n return {\n ...unit,\n properties: {\n ...unit.properties,\n venue,\n ordinal: level.properties.ordinal,\n level: await populateLevel(level),\n section: section ? await populateSection(section) : null,\n },\n }\n } catch (err) {\n console.log(`error finding section `, { unit, sections })\n }\n }\n\n const populateVenue: PopulatorFn<\"venue\"> = (venue) => {\n return Promise.resolve(venue)\n }\n\n const populateTaxonomy: PopulatorFn<\"taxonomy\"> = async (taxonomy) => {\n const venue = await internalFindById<\"venue\">(taxonomy.properties.venue_id)\n return {\n ...taxonomy,\n properties: {\n ...taxonomy.properties,\n venue: venue ? await populateVenue(venue) : null,\n },\n }\n }\n\n const populateFeature = (feature) => Promise.resolve(feature)\n\n return {\n address: populateAddress,\n building: populateBuilding,\n detail: populateDetail,\n fixture: populateFixture,\n footprint: populateFootprint,\n geofence: populateGeofence,\n opening: populateOpening,\n relationship: populateRelationship,\n privilege: populatePrivilege,\n promotion: populatePromotion,\n event: populateEvent,\n label: populateFeature,\n element: populateFeature,\n page: populateFeature,\n\n amenity: populateAmenity,\n anchor: populateAnchor,\n kiosk: populateKiosk,\n level: populateLevel,\n occupant: populateOccupant,\n section: populateSection,\n unit: populateUnit,\n venue: populateVenue,\n\n taxonomy: populateTaxonomy,\n }\n}\n","import {\n ui,\n Map,\n TileLayer,\n VectorLayer,\n LineString,\n Geometry,\n Coordinate,\n OverlayLayer,\n GroupGLLayer,\n GLTFLayer,\n} from \"maptalks-gl\"\nimport '@maptalks/transcoders.draco';\n\nimport { GeoJsonProperties, LineString as LineStringType, Feature } from \"geojson\"\nimport TWEEN from \"@tweenjs/tween.js\"\nimport _ from \"lodash\"\nimport {\n feature as turfFeature,\n lineString,\n point,\n} from \"@turf/helpers\"\nimport turfDistance from \"@turf/distance\"\nimport turfCenter from \"@turf/center\"\nimport { featureCollection } from '@turf/helpers';\n\nimport { PerspectiveCamera } from \"three\"\nimport { ThreeLayer } from \"maptalks.three\"\n\nimport {\n LAYERS,\n LAYER_OPTIONS,\n LAYER_FEATURE_TYPE_OBJ,\n HIGHLIGHT_LAYER_NAME,\n USER_LOCATION_LAYER_NAME,\n ORIGIN_MARKER_ID,\n DESTINATION_MARKER_ID,\n USER_LOCATION_ELEMENT_ID,\n LAST_USER_LOCATION_ELEMENT_ID_PREFIX,\n LOCALE_SYMBOL_KEY,\n DEFAULT_LOCALE,\n VENUE_EVENTS,\n} from \"./constants\"\n\nimport {\n styledFeatureGenerator,\n getExtrudeConfigByFeature,\n} from \"./utils/createElements\"\n\nimport { getBearingBetweenPoints } from \"./utils/math\"\n\nimport {\n NavigationPath,\n Billboard,\n SpriteMarker,\n} from \"./object3d\"\nimport {\n createHighlighBillboardController,\n} from \"./utils/createHighlightElement\"\nimport {\n IMapConfig,\n IndoorMapOptions,\n} from \"./types\"\n\nimport { CameraManager } from \"./camera/CameraManager\"\nimport { RendererManager } from \"./renderer\"\nimport { VenueDataClient } from \"../data\"\n\ntype MapPaddingType = {\n paddingLeft: number;\n paddingRight: number;\n paddingTop: number;\n paddingBottom: number;\n}\n\nconst INITIAL_CENTER = [100.5017051, 13.7572619] // just placeholder\nconst INITIAL_ZOOM = 18.5\nconst CLICK_TOLERANCE = 20\n\nconst defaultOptions: Partial<IndoorMapOptions> = {\n pixelRatio: 1,\n interactions: true,\n locale: DEFAULT_LOCALE,\n}\n\nconst parseMaptalksOptions = (options: IndoorMapOptions) => {\n return {\n centerCross: (options.centerCross ?? false),\n ...(options.interactions === false ? ({\n draggable: false,\n dragPan: false,\n dragRotate: false,\n dragPitch: false,\n scrollWheelZoom: false,\n touchZoom: false,\n doubleClickZoom: false\n }) : {}),\n }\n}\n\nexport class IndoorMap extends EventTarget {\n options: IndoorMapOptions\n //TODO: refac functions; let them do only 1 thing in a function\n\n /** Note: \"#\" means private variables */\n #styler = null\n #featuresInitted = false\n #elementsLoaded = false\n #elements: Record<string, any> = {}\n #features = []\n #markers = []\n #venues = []\n #venueInView: string | null = null\n #ordinals = []\n #mapTheme = {}\n #billboards = []\n #billboardObjects = []\n #spriteMarkerObjects = []\n #mapDecorations = []\n #groundObjects = []\n #navigationGeometries: Record<string, NavigationPath> = {}\n #venueObjects = []\n #glbObjects = []\n #objects = []\n #object3ds = []\n #isClicked = false\n #highlightElementIds = []\n #highlightObjectIds = []\n #highlightObjectControllers = []\n #userLocationGeometry = null\n #userLocationElement = null\n #mapConfig: IMapConfig = {}\n #locale: string = defaultOptions.locale\n #lastUserLocationGeometries = []\n #lastUserLocationElements = []\n\n #isLayersFadingOnZoom = false\n\n #touchStartTarget = null\n #touchStartPoint = null\n\n #onClickElement = (e) => {}\n #animationsToRun = []\n\n map: Map | null = null\n #dataClient: VenueDataClient\n camera: CameraManager\n rendererManager: RendererManager\n\n showVenueObject = false\n threeLayer: ThreeLayer | null = null\n\n onMapReady = () => {}\n onMapLoading = () => {}\n\n constructor(elementId, options: IndoorMapOptions) {\n super()\n const combinedOptions = _.merge({}, defaultOptions, options)\n this.options = combinedOptions\n const {\n onMapReady,\n onMapLoading,\n pixelRatio,\n locale,\n } = combinedOptions\n\n const maptalksOptions = parseMaptalksOptions(combinedOptions)\n\n this.map = new Map(elementId, {\n attribution: false,\n // Temporart set, not really default view\n // Default view is set in camera manager\n center: INITIAL_CENTER,\n zoom: INITIAL_ZOOM,\n clickTimeThreshold: 600,\n ...maptalksOptions,\n baseLayer: new TileLayer(\"base\", {\n urlTemplate:\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n subdomains: [\"a\", \"b\", \"c\", \"d\"],\n opacity: 1.0,\n attribution: \"\",\n hitDetect: false,\n decodeImageInWorker: true,\n errorUrl: \"/assets/img/tile-placeholder.png\",\n }),\n layers: [],\n })\n\n const groupLayer = new GroupGLLayer('group', [], {}).addTo(this.map);\n\n const threeLayer = new ThreeLayer(\"three\", {\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n })\n groupLayer.addLayer(threeLayer)\n\n const gltfLayer = new GLTFLayer('gltf');\n groupLayer.addLayer(gltfLayer);\n\n /** Manage create elements from imdf features */\n this.rendererManager = new RendererManager(this.map, options.dataClient, options.renderer)\n\n /** Manage zoom, bearing, pitch, flyTo, moveCamera to position */\n this.camera = new CameraManager(this.map, options.camera)\n \n this.locale = locale\n this.pixelRatio = pixelRatio\n\n this.onMapReady = onMapReady\n this.onMapLoading = onMapLoading\n this.showVenueObject = false\n\n // Bind events\n // @ts-expect-error\n this.map.on(\"click\", this.handleMapClick)\n\n this.dataClient = options.dataClient\n }\n\n setOptions(options) {\n const combinedOptions = _.merge({}, defaultOptions, options)\n this.options = combinedOptions\n\n const maptalksOptions = parseMaptalksOptions(combinedOptions)\n this.map.setOptions(maptalksOptions)\n }\n\n set dataClient(value) {\n this.#dataClient = value\n \n // If no defaultView is set, get center from dataClient and move map to center\n if (!this.options.camera?.defaultView?.center) {\n this.#dataClient.filterByType(\"venue\")\n .then(venues => {\n /** Find Venue's center */\n const venueCenters = turfCenter(featureCollection(venues));\n const [x, y] = venueCenters.geometry.coordinates\n const center = new Coordinate(x, y)\n\n /** Move Map to center */\n this.camera.setView({ center, pitch: 60, zoom: 19 })\n })\n }\n }\n\n \n\n /**\n * Events\n */\n on(eventName: string, handler) {\n this.map.on(eventName, handler)\n }\n\n handleMapClick = ({ coordinate }) => {\n const { x, y } = coordinate\n console.log(\n `[Coordinates]: x: ${_.round(x, 8)} y: ${_.round(\n y,\n 8\n )}, [Bearing]: ${this.map.getBearing()}, [Pitch]: ${this.map.getPitch()}`\n )\n }\n\n handleMapTouchEnd = ({ containerPoint }) => {\n const { x, y } = containerPoint\n const { x: touchStartX, y: touchStartY } = this.#touchStartPoint\n\n const dis = Math.hypot(x - touchStartX, y - touchStartY)\n // @ts-expect-error \n this.map.off(\"touchend\", this.handleMapTouchEnd)\n\n if (dis > 0 && dis < CLICK_TOLERANCE) {\n console.log(\"Forgiving click\", this.#touchStartTarget.properties.id)\n this.handleClickElement({ target: this.#touchStartTarget })\n }\n\n this.#touchStartTarget = null\n this.#touchStartPoint = null\n }\n\n /**\n * Getters & Setters\n */\n get elementsLoaded() {\n return this.#elementsLoaded\n }\n\n get pixelRatio() {\n return this.map.getDevicePixelRatio()\n }\n\n get locale() {\n return this.#locale\n }\n\n set mapTheme(value) {\n this.#mapTheme = value\n this.#styler = styledFeatureGenerator(this.#mapTheme)\n }\n\n get venues() {\n return this.#venues || []\n }\n\n #findAndSetVenueInView = () => {\n const venueInViewWithDistance = this.findVenueInView()\n if (\n venueInViewWithDistance &&\n (!this.#venueInView ||\n venueInViewWithDistance.venueId !== this.#venueInView)\n ) {\n this.#venueInView = venueInViewWithDistance.venueId\n this.map.fire(VENUE_EVENTS.VENUE_MOVEINTOVIEW, venueInViewWithDistance)\n }\n }\n\n set detectVenueInView(value) {\n if (value) {\n // Set initial venueInView\n this.#findAndSetVenueInView()\n this.map.on(\"moveend\", this.#findAndSetVenueInView)\n } else {\n this.map.off(\"moveend\", this.#findAndSetVenueInView)\n }\n }\n\n set billboards(value) {\n this.#billboards = value\n }\n\n set mapDecorations(value) {\n this.#mapDecorations = value\n }\n\n set pixelRatio(value: number) {\n this.map.setDevicePixelRatio(value)\n }\n\n set onClickElement(func) {\n this.rendererManager.onClickElement = func\n }\n\n set locale(value: string) {\n this.#locale = value || defaultOptions.locale\n\n // Update elements affected by locale changes.\n this.updateUserLocationSymbolByLocale(this.#locale)\n }\n\n /**\n * Private internal methods\n */\n\n #clearElements() {\n LAYERS.forEach((layerKey) => {\n this.#clearAllElementOnLayerByName(layerKey)\n })\n const scene = this.threeLayer.getScene()\n if (scene) {\n scene.children = scene.children.filter(\n (children) => children instanceof PerspectiveCamera\n )\n }\n }\n\n handleClickElement = (e) => {\n if (this.#isClicked) return\n this.#isClicked = true\n const onClickElement = this.#onClickElement\n if (!_.isFunction(onClickElement)) return\n this.#onClickElement(e)\n this.#isClicked = false\n }\n\n async #legacy_createElements() {\n const {\n // 2D\n createOpening,\n createSection,\n createDecoration,\n // 3D\n create3DBillboard,\n create3DAmenityMarker,\n create3DOpeningMarker,\n } = this.#styler\n\n let elements = {}\n let object3ds = []\n\n for (const feature of this.#features) {\n try {\n const { feature_type: featureType, properties, id } = feature\n const layerName = _.get(\n LAYER_FEATURE_TYPE_OBJ,\n featureType,\n featureType\n )\n const layer = this.map.getLayer(layerName)\n let geometry\n const category = _.get(feature, \"properties.category\")\n\n const extrudeConfig = _.get(this.#mapConfig, \"extrude\")\n const textMarkerType = _.get(\n this.#mapConfig,\n \"text_marker_type\",\n \"ui-marker\"\n )\n const featureExtrudeConfig = getExtrudeConfigByFeature(\n extrudeConfig,\n feature\n )\n\n switch (featureType) {\n \n case \"amenity\": {\n if (feature.properties.is_featured) {\n const billboardObj = create3DBillboard(feature, this.threeLayer)\n billboardObj?.on(\"click\", this.handleClickElement)\n this.#billboardObjects.push(billboardObj)\n this.#spriteMarkerObjects.push(billboardObj)\n object3ds.push(billboardObj)\n break\n }\n const marker3d = create3DAmenityMarker(\n feature,\n this.threeLayer,\n extrudeConfig\n )\n marker3d?.on(\"click\", this.handleClickElement)\n this.#spriteMarkerObjects.push(marker3d)\n object3ds.push(marker3d)\n break\n }\n case \"opening\": {\n switch (category) {\n case \"emergencyexit\":\n const { geometry } = turfCenter(feature)\n const markerFeature = {\n ...feature,\n geometry,\n }\n const marker3d = create3DOpeningMarker(\n markerFeature,\n this.threeLayer,\n extrudeConfig\n )?.on(\"click\", this.handleClickElement)\n object3ds.push(marker3d)\n break\n default:\n }\n geometry = createOpening(feature)\n ?.on(\"click\", this.handleClickElement)\n .addTo(layer)\n break\n }\n case \"section\": {\n geometry = createSection(feature)?.addTo(layer)\n break\n }\n \n default:\n break\n }\n if (!id) throw new Error(`Property is missing ID, ${id}`)\n elements[id] = { geometry, properties, featureType, feature }\n } catch (err) {\n console.warn(`Cannot create ${feature.id}: ${err.message}`)\n }\n }\n\n this.#mapDecorations.forEach((decoration) => {\n const { id, geometry, properties } = decoration\n const geometryType = decoration?.geometry?.type\n try {\n switch (geometryType) {\n case \"Point\":\n const createdBillboard = create3DBillboard(\n decoration,\n this.threeLayer\n )\n this.#billboardObjects.push(createdBillboard)\n object3ds.push(createdBillboard)\n break\n default:\n const decorationLayer = this.map.getLayer(`base`)\n const createdDecoration = createDecoration(geometry, {\n id,\n ...properties,\n }).addTo(decorationLayer)\n elements[id] = {\n geometry: createdDecoration,\n properties,\n featureType: \"decoration\",\n }\n break\n }\n } catch (error) {\n console.log(\n \"error creating decoration for \",\n decoration.properties.name\n )\n }\n })\n\n // Initiate Canvas render\n this.#elements = elements\n this.#elementsLoaded = true\n this.#featuresInitted = true\n this.#object3ds = object3ds\n if (typeof this.onMapReady === \"function\") this.onMapReady()\n }\n\n #clearAllElementOnLayerByName = (layerName: string) => {\n const layer = this.map.getLayer(layerName) as VectorLayer\n if (layer) layer.clear()\n }\n\n /**\n * Change Level & animate to path / geometry / view / etc.\n * ================================== */\n changeLevelByOrdinal(ordinal: null | number | number[]): void {\n this.rendererManager.changeLevelByOrdinal(ordinal)\n }\n\n findVenueInView = (): { venueId: string; distance: number } => {\n const mapCenter = this.map.getCenter()\n const result = this.#venues.reduce<{\n venueId: string\n distance: number\n } | null>((closest, venue) => {\n const { display_point: displayPoint } = venue.properties\n const distance = turfDistance(displayPoint, [mapCenter.x, mapCenter.y])\n if (!closest || distance < closest.distance) {\n return { venueId: venue.id, distance }\n }\n return closest\n }, null)\n return result\n }\n\n getLineStringBearing = (feature) => {\n const { geometry } = feature\n const path = new LineString(geometry.coordinates)\n return getBearingBetweenPoints(\n path.getFirstCoordinate(),\n path.getLastCoordinate()\n )\n }\n\n //map animation\n addAnimations(animation: { id: string; callback: () => void }) {\n this.#animationsToRun.push(animation)\n }\n\n removeAnimationById(id: string) {\n this.#animationsToRun = this.#animationsToRun.filter(\n (animation) => animation.id !== id\n )\n }\n\n clearAnimations() {\n this.#animationsToRun = []\n }\n\n /**\n * User Location\n ****************************/\n // TODO: To consider if we should use setter `set userLocation` instead?\n\n addUserLocation(value) {\n const { createUserLocationMarker } = this.#styler\n\n this.#userLocationGeometry = value\n\n const { properties, feature_type } = value\n\n // If UserLocationGeometry not exists, create one.\n\n const markerLayer = this.map.getLayer(USER_LOCATION_LAYER_NAME)\n\n if (!this.#userLocationElement?.geometry && markerLayer) {\n const geometry = createUserLocationMarker(value)\n geometry.addTo(markerLayer)\n\n // Add marker to this.#elements\n const element = {\n geometry,\n properties,\n featureType: feature_type,\n feature: value,\n }\n this.#elements[USER_LOCATION_ELEMENT_ID] = element\n this.#userLocationElement = element\n\n this.updateUserLocationSymbolByLocale(this.locale)\n }\n }\n\n updateUserLocationSymbolByLocale(locale: string) {\n const userLocationGeometry = _.get(\n this.#elements,\n `${USER_LOCATION_ELEMENT_ID}.geometry`\n )\n\n if (!userLocationGeometry) return\n\n const currentSymbol = userLocationGeometry.getSymbol()\n\n /**\n * Localized user location marker example.\n * Supports locale-based marker files.\n *\n * Example:\n * {\n * \"markerFile\": \"logo_url\", // Default marker\n * \"locale_symbol\": { \"th\": { \"markerFile\": \"logo_url\" }, \"default\": { \"markerFile\": \"logo_url\" } }\n * }\n */\n const localeSymbolToUpdate = currentSymbol.map((symbol) => {\n const localeSymbol =\n _.get(symbol, `${LOCALE_SYMBOL_KEY}.${locale}`) ||\n _.get(symbol, `${LOCALE_SYMBOL_KEY}.default`)\n if (!_.isPlainObject(localeSymbol)) return symbol\n\n return {\n ...symbol,\n ...localeSymbol,\n }\n })\n userLocationGeometry?.updateSymbol(localeSymbolToUpdate)\n }\n\n removeUserLocation() {\n this.#userLocationGeometry = null\n if (this.#userLocationElement) {\n const { geometry } = this.#userLocationElement\n if (geometry) geometry.remove()\n\n this.#userLocationElement = null\n this.#elements[USER_LOCATION_ELEMENT_ID] = null\n }\n }\n\n showUserLocationMarker() {\n this.#userLocationElement?.geometry.show()\n }\n\n hideUserLocationMarker() {\n this.#userLocationElement?.geometry.hide()\n }\n\n addLastUserLocation(value) {\n const newLastLocationId = value?.id\n // If the last location ID is undefined or exists, no new marker will be added.\n const isExists =\n this.#lastUserLocationGeometries.findIndex(\n ({ feature }) => feature?.id === newLastLocationId\n ) >= 0\n\n if (!newLastLocationId || isExists) return\n\n const { createLastUserLocationMarker } = this.#styler\n\n this.#lastUserLocationGeometries = [\n ...this.#lastUserLocationGeometries,\n value,\n ]\n\n const { properties, feature_type, id } = value\n\n const markerLayer = this.map.getLayer(USER_LOCATION_LAYER_NAME)\n\n const geometry = createLastUserLocationMarker(value)\n if (!geometry) return\n geometry.addTo(markerLayer)\n\n // Add marker to this.#elements\n const element = {\n geometry,\n properties,\n featureType: feature_type,\n feature: value,\n }\n this.#elements[`${LAST_USER_LOCATION_ELEMENT_ID_PREFIX}${id}`] = element\n this.#lastUserLocationElements = [\n ...this.#lastUserLocationElements,\n element,\n ]\n }\n\n removeLastUserLocation() {\n this.#lastUserLocationGeometries = []\n if (\n this.#lastUserLocationElements &&\n this.#lastUserLocationElements.length > 0\n ) {\n for (const lastUserLocationElem of this.#lastUserLocationElements) {\n const { geometry, properties = {} } = lastUserLocationElem\n if (geometry) {\n geometry.remove()\n delete this.#elements[`last_user_location-${properties?.id}`]\n }\n }\n this.#lastUserLocationElements = []\n }\n }\n\n hideLastUserLocationMarker() {\n for (const lastUserLocationElem of this.#lastUserLocationElements) {\n const { geometry } = lastUserLocationElem\n if (geometry) geometry.hide()\n }\n }\n\n /**\n * END of User Location\n ****************************/\n\n showGeometryByElementId = (elementId): void => {\n const geometry: Geometry | undefined = _.get(\n this.#elements,\n `${elementId}.geometry`\n )\n if (geometry) geometry.show()\n }\n\n hideGeometryByElementId = (elementId): void => {\n const geometry: Geometry = _.get(this.#elements, `${elementId}.geometry`)\n if (geometry) geometry.hide()\n }\n\n setSpriteMarkersOpacity = (opacity: number = 1): void => {\n const spriteMarkerObjects = this.#spriteMarkerObjects\n spriteMarkerObjects?.forEach((baseObject) => {\n baseObject.getObject3d().traverse((child) => {\n if (child.isLine || child.isSprite) {\n child.material.opacity = opacity\n }\n })\n })\n }\n\n setFeatureObject3DsOpacity = (opacity: number = 1): void => {\n const objects = this.#object3ds\n objects?.forEach((baseObject) => {\n if (baseObject instanceof NavigationPath) return\n baseObject.getObject3d().traverse((child) => {\n if (child.isMesh === true) {\n child.material.opacity = opacity\n }\n })\n })\n }\n\n /*\n * Enable or disable the fading effect based on the zoom level for all layers except the Venue Model.\n * This function applies when extruded units exceed the edges of the Venue Model while zooming out.\n * It can be enabled only when the Venue Model is present.\n */\n disableLayersFadingOnZoom = (): void => {\n this.#isLayersFadingOnZoom = false\n }\n\n enableLayersFadingOnZoom = (): void => {\n this.#isLayersFadingOnZoom = this.#venueObjects.length !== 0\n }\n\n /**\n * Navigation\n ****************************/\n combineNearbyLineStrings(\n lineStrings: Feature<LineStringType, GeoJsonProperties>[],\n options: {\n properties?: GeoJsonProperties\n distance?: number\n } = { properties: {}, distance: 0.0003 }\n // 0.0003 = 30cm\n ) {\n const { properties = {}, distance = 0.0003 } = options || {}\n const combinedLineStrings = []\n const accLine = []\n if (lineStrings.length === 1) return lineStrings\n\n for (let i = 0; i < lineStrings.length; i++) {\n const line = lineStrings[i]\n const coords = line.geometry.coordinates\n const prevLine = lineStrings[i - 1]\n const firstCoord = _.first(coords)\n const isFirstLine = i === 0\n\n if (isFirstLine) {\n accLine.push(...coords)\n continue\n }\n\n const prevLastCoord = _.last(prevLine.geometry.coordinates)\n const isNearby =\n turfDistance(point(firstCoord), point(prevLastCoord)) < distance\n\n if (!isNearby) {\n const remainingLines = lineStrings.slice(i)\n const res = this.combineNearbyLineStrings(remainingLines, properties)\n combinedLineStrings.push(...res)\n break\n }\n accLine.push(...coords)\n }\n combinedLineStrings.push(lineString(accLine, properties))\n return combinedLineStrings\n }\n\n createNavigationGeometries = (stepGeometries, destinationFeature) => {\n const {\n createOriginMarker,\n createDestinationPinMarker,\n createDestinationLogoMarker,\n create3DStepPath,\n } = this.#styler\n const routeMarkerLayer = this.map.getLayer(HIGHLIGHT_LAYER_NAME)\n\n const linesByOrdinal = _(stepGeometries)\n .filter(({ geometry }) => geometry.type === \"LineString\")\n .groupBy(\"properties.ordinal\")\n .value()\n\n const joinedLines = _(linesByOrdinal).reduce((acc, lines, key) => {\n const joined = this.combineNearbyLineStrings(lines, {\n properties: { ordinal: +key },\n })\n return [...acc, ...joined]\n }, [])\n\n joinedLines.forEach((line, index) => {\n try {\n const navPath: NavigationPath = create3DStepPath(line, this.threeLayer)\n this.threeLayer.addMesh([navPath])\n this.#navigationGeometries[`line-${index}`] = navPath\n this.#object3ds.push(navPath)\n } catch (err) {\n console.log(err)\n }\n })\n\n stepGeometries.forEach((stepGeometry) => {\n const { geometry, properties, feature_type = null } = stepGeometry\n let stepElement\n try {\n switch (geometry.type) {\n // Create a destination marker and route path\n case \"Point\":\n switch (feature_type) {\n case \"origin-marker\":\n stepElement =\n createOriginMarker(stepGeometry).addTo(routeMarkerLayer)\n break\n case \"destination-marker\":\n const extrudeConfig = _.get(this.#mapConfig, \"extrude\")\n if (destinationFeature.feature_type === \"occupant\") {\n const stepId = _.get(stepGeometry, \"id\")\n // !Update step ID to occupant destination feature ID to prevent unexpected clearing of occupant element from map\n const normalizedDestinationFeature = {\n ...destinationFeature,\n id: stepId,\n }\n const logoUrl = _.get(\n normalizedDestinationFeature,\n \"properties.logo.url\"\n )\n const createOccupantDestinationMarkerFn = logoUrl\n ? createDestinationLogoMarker\n : createDestinationPinMarker\n stepElement = createOccupantDestinationMarkerFn(\n normalizedDestinationFeature,\n { extrudeConfig }\n ).addTo(routeMarkerLayer)\n break\n }\n stepElement = createDestinationPinMarker(destinationFeature, {\n extrudeConfig,\n }).addTo(routeMarkerLayer)\n break\n default:\n this.#navigationGeometries[stepGeometry.id] = stepElement\n break\n }\n break\n default:\n break\n }\n if (stepElement) {\n const { id, feature_type: featureType } = stepGeometry\n // Add tot Elements object\n this.#elements[id] = {\n geometry: stepElement,\n featureType,\n properties: { ...stepGeometry, ...properties },\n }\n //\n }\n } catch (err) {\n // console.log(err, {\n // index: index,\n // stepGeometries,\n // })\n // throw err;\n console.log(err)\n }\n })\n }\n\n createOverviewStepPathByOrdinal = (stepGeometries, viewingOrdinal) => {\n const { createLineStringFromGeometries } = this.#styler\n const initialStepGeometries = stepGeometries\n .filter(({ properties }) => properties.ordinal === viewingOrdinal)\n .map(({ geometry }) => geometry)\n return createLineStringFromGeometries(initialStepGeometries)\n }\n\n clearNavigationGeometries(): void {\n // Remove origin and destination markers from the highlight layer\n const routeMarkerLayer = this.map.getLayer(\n HIGHLIGHT_LAYER_NAME\n ) as OverlayLayer\n const originMarkerGeometry = _.get(\n this.#elements,\n `${ORIGIN_MARKER_ID}.geometry`\n )\n const destinationMarkerGeometry = _.get(\n this.#elements,\n `${DESTINATION_MARKER_ID}.geometry`\n )\n const geometriesToRemove = _.compact([\n originMarkerGeometry,\n destinationMarkerGeometry,\n ])\n\n routeMarkerLayer.removeGeometry(geometriesToRemove)\n\n this.#elements[ORIGIN_MARKER_ID] = null\n this.#elements[DESTINATION_MARKER_ID] = null\n\n // Filter out NavigationPath objects from the global this.#object3ds list\n this.#object3ds = this.#object3ds.filter(\n (obj) => !(obj instanceof NavigationPath)\n )\n\n // Remove related navigation geometry objects\n const objects = this.#navigationGeometries || {}\n _.forEach(objects, (obj) => {\n if (!obj) return\n this.#navigationGeometries[obj.properties.id] = null\n obj.remove()\n })\n }\n /**\n * END of Navigation\n ****************************/\n\n /**\n * hide/show venue 3dmodel\n **/\n\n hideVenueObjects = () => {\n this.showVenueObject = false\n }\n showVenueObjects = () => {\n this.showVenueObject = true\n }\n\n /**\n * Other functions\n */\n\n enableClick = () => this.map.config({ geometryEvents: true })\n disableClick = () => this.map.config({ geometryEvents: false })\n\n freeze = () => this.map.config({ zoomable: false, draggable: false })\n unfreeze = () => this.map.config({ zoomable: true, draggable: true })\n\n /**\n * render (frame)\n */\n \n render() {\n // TODO: Update User Location marker position\n const view = this.map.getView()\n const currBearing = view.bearing\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n // @ts-ignore\n this.threeLayer.redraw()\n }\n\n if (this.threeLayer) {\n const currentView = this.camera.getView()\n const objectOpacity = _.clamp(38 - 2 * currentView.zoom, 0, 1)\n\n this.#objects.forEach((object) => {\n object.getObject3d().traverse((child) => {\n if (child.isMesh) child.material.opacity = objectOpacity\n //TODO: recheck this line if it actually works\n /** set Mesh visible = false when opacity is 0\n * and true when opacity > 0\n */\n child.visible = !!objectOpacity\n })\n object.getObject3d().visible = !!objectOpacity\n })\n\n if (this.#billboardObjects) {\n this.#billboardObjects.forEach((object) => {\n const objectScale = _.clamp(\n 20 - 1 * currentView.zoom,\n 1,\n 1.05\n )\n object.getObject3d().scale.set(objectScale, objectScale, 1)\n })\n }\n\n /*\n * The layer appears while zooming in and disappears when zooming out,\n * fully vanishing when the Venue Model is visible (opacity: 1).\n */\n if (this.#isLayersFadingOnZoom) {\n const layerOpacity = _.clamp(1 - objectOpacity, 0, 1)\n // Fading 2D layers.\n LAYERS.forEach((layerKey) => {\n const layer = this.map.getLayer(layerKey)\n if (layer) layer.setOpacity(layerOpacity)\n })\n\n // Fading 3D units, such as extruded units.\n this.setFeatureObject3DsOpacity(layerOpacity)\n\n // Fading sprite markers, such as billboards and amenity markers.\n this.setSpriteMarkersOpacity(layerOpacity)\n }\n\n this.#venueObjects.forEach((object) => {\n object.getObject3d().traverse((child) => {\n if (child.isMesh) child.material.opacity = objectOpacity\n /** set Mesh visible = false when opacity is 0\n * and true when opacity > 0\n */\n child.visible = this.showVenueObject && objectOpacity > 0.4\n })\n })\n\n // // Update bearing to each GroundLabel to determine if text should flip or not\n // this.#groundObjects.forEach((gLabel) => {\n // gLabel.bearing = currBearing\n // })\n }\n\n this.#animationsToRun.forEach(({ callback }) => callback(this))\n\n //update TWEEN.js animaton\n TWEEN.update()\n\n requestAnimationFrame(this.render.bind(this))\n }\n}\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in meters. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import { IHighlightOptions, ISetHighlight2DElementIdsOptions } from \"./types\"\n\nconst defaultLayerOption = { enableAltitude: true }\n\nconst VENUE = \"venue\"\nconst LEVEL = \"level\"\nconst UNIT = \"unit\"\nconst FIXTURE = \"fixture\"\nconst KIOSK = \"kiosk\"\nconst OPENING = \"opening\"\nconst SECTION = \"section\"\nconst FOOTPRINT = \"footprint\"\n\nconst AMENITY = \"amenity\"\nconst OCCUPANT = \"occupant\"\n\nconst GEOLOCATION = \"geolocation\"\nconst ORIGIN_MARKER = \"origin-marker\"\nconst DESTINATION_MARKER = \"destination-marker\"\n\nconst DECORATION = \"decoration\"\n\nexport const BASE_LAYER_NAME = \"base\"\nexport const POI_MARKER_LAYER_NAME = \"poi\"\nexport const MARKER_LAYER_NAME = \"marker\"\nexport const HIGHLIGHT_LAYER_NAME = \"highlight\"\nexport const USER_LOCATION_LAYER_NAME = \"user_location\"\n\nexport const ORIGIN_MARKER_ID = \"master-origin-marker\"\nexport const DESTINATION_MARKER_ID = \"master-destination-marker\"\nexport const USER_LOCATION_ELEMENT_ID = \"user_location\"\nexport const LAST_USER_LOCATION_ELEMENT_ID_PREFIX = \"last_user_location-\"\n\nexport const LOCALE_SYMBOL_KEY = \"locale_symbol\"\nexport const DEFAULT_LOCALE = \"en\"\n\nexport const LAYERS = [\n BASE_LAYER_NAME,\n POI_MARKER_LAYER_NAME,\n HIGHLIGHT_LAYER_NAME,\n USER_LOCATION_LAYER_NAME,\n]\n\nexport const LAYER_OPTIONS = {\n [BASE_LAYER_NAME]: {\n ...defaultLayerOption,\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n forceRenderOnZooming: true,\n },\n [POI_MARKER_LAYER_NAME]: {\n ...defaultLayerOption,\n forceRenderOnMoving: true,\n forceRenderOnRotating: true,\n forceRenderOnZooming: true,\n zIndex: 10,\n collision: true,\n collisionDelay: 1200,\n },\n [MARKER_LAYER_NAME]: { ...defaultLayerOption },\n [HIGHLIGHT_LAYER_NAME]: { ...defaultLayerOption, zIndex: 98 },\n [USER_LOCATION_LAYER_NAME]: { ...defaultLayerOption, zIndex: 99 },\n}\n\nexport const LAYER_FEATURE_TYPE_OBJ = {\n [VENUE]: BASE_LAYER_NAME,\n [LEVEL]: BASE_LAYER_NAME,\n [UNIT]: BASE_LAYER_NAME,\n [FIXTURE]: BASE_LAYER_NAME,\n [KIOSK]: BASE_LAYER_NAME,\n [OPENING]: BASE_LAYER_NAME,\n [SECTION]: BASE_LAYER_NAME,\n [FOOTPRINT]: BASE_LAYER_NAME,\n [AMENITY]: MARKER_LAYER_NAME,\n [OCCUPANT]: POI_MARKER_LAYER_NAME,\n [GEOLOCATION]: USER_LOCATION_LAYER_NAME,\n [ORIGIN_MARKER]: HIGHLIGHT_LAYER_NAME,\n [DESTINATION_MARKER]: HIGHLIGHT_LAYER_NAME,\n [DECORATION]: BASE_LAYER_NAME,\n}\n\n/** Custom Venue Platform Events. Prefix with \"venue:\" to avoid collision */\nexport const VENUE_EVENTS = {\n VENUE_MOVEINTOVIEW: \"venue:venuemoveintoview\", // When a map is moved and a venue moved into a viewport\n}\n","import _ from \"lodash\"\nimport {\n Polygon,\n MultiPolygon,\n LineString,\n Marker,\n Coordinate,\n MultiLineString,\n ui,\n} from \"maptalks\"\nimport turfCenter from \"@turf/center\"\nimport turfBuffer from \"@turf/buffer\"\n\nimport {\n TextureLoader,\n SpriteMaterial,\n MeshLambertMaterial,\n} from \"three\"\n\nimport {\n SpriteMarker,\n Billboard,\n NavigationPath,\n} from \"../object3d\"\nimport { getCenterFromGeometry, createPolygonFromLineString } from \"./geometry\"\nimport { createSVGPathFromMarkerSymbol, svgToPng } from \"./svg\"\n\nconst GeometryType = {\n Polygon,\n MultiPolygon,\n}\n\nconst ORDINAL_HEIGHT = 0 // in version 3D change ORDINAL_HEIGHT for set altitude of geometry\n\nconst VENUE_Z_INDEX = 0\n\nconst LEVEL_Z_INDEX = 2\nconst UNIT_Z_INDEX = 3\nconst FIXTURE_Z_INDEX = 4\nconst DECORATION_Z_INDEX = 4\nconst KIOSK_Z_INDEX = 5\nconst OPENING_Z_INDEX = 3\nconst SECTION_Z_INDEX = 6\nconst USER_LOCATION_Z_INDEX = 99\nconst LAST_LOCATION_Z_INDEX = USER_LOCATION_Z_INDEX - 1\n\nconst PREFIX_HIGHLIGHTED_SYMBOL_KEY = \"highlighted\"\nconst SPRITE_MARKER_FEATURE = [\n \"amenity-atm\",\n \"amenity-babychanging\",\n \"amenity-strollerrental\",\n \"amenity-boardinggate.ferry\",\n \"amenity-elevator\",\n \"amenity-escalator\",\n \"amenity-stairs\",\n \"amenity-information\",\n \"amenity-information.transit\",\n \"amenity-wheelchair\",\n \"amenity-restroom\",\n \"amenity-restroom.male\",\n \"amenity-restroom.female\",\n \"amenity-restroom.wheelchair\",\n \"amenity-restroom.family\",\n \"amenity-restroom.unisex\",\n \"amenity-taxi\",\n \"amenity-groundtransportation\",\n \"amenity-bus\",\n \"amenity-bus.muni\",\n \"amenity-shuttle\",\n \"amenity-parking\",\n \"amenity-parking.shortterm\",\n \"amenity-parking.longterm\",\n \"amenity-parking.waitingarea\",\n \"amenity-parking.compact\",\n \"amenity-parking.ev\",\n \"amenity-parking.bicycle\",\n \"amenity-parking.motorcycle\",\n \"amenity-privatelounge\",\n \"amenity-rideshare\",\n \"amenity-valet\",\n \"amenity-landmark\",\n \"amenity-rail.muni\",\n \"amenity-service\",\n \"amenity-smokingarea\",\n \"amenity-ticketing\",\n \"amenity-meetingpoint\",\n \"amenity-prayerroom\",\n \"amenity-firstaid\",\n \"amenity-ticketing.rail\",\n \"amenity-exhibit\",\n \"amenity-mothersroom\",\n \"amenity-checkin.desk\",\n \"amenity-baggagestorage\",\n \"amenity-baggagecarts\",\n \"amenity-library\",\n \"amenity-coinlocker\",\n \"amenity-powerchargingstation\",\n \"amenity-wheelchairassit\",\n \"amenity-lostandfound\",\n \"amenity-foodservice\",\n \"amenity-businesscenter\",\n \"amenity-guestservices\",\n \"amenity-emergencyshelter\",\n \"amenity-prayerroom.buddhism\",\n \"amenity-defibrillator\",\n \"amenity-drinkingfountain\",\n \"amenity-handsanitizerstation\",\n \"amenity-unspecified\",\n \"amenity-entry\",\n \"amenity-fireextinguisher\",\n \"amenity-security\",\n \"amenity-seating\",\n \"amenity-copymachine\",\n \"amenity-fieldofplay\",\n \"amenity-fieldofplay.soccer\",\n \"amenity-amphitheater\",\n \"amenity-hoteling\",\n \"occupant-currencyexchange\",\n \"occupant-donationcenter\",\n \"occupant-bank\",\n \"occupant-books\",\n \"occupant-postoffice\",\n \"opening-emergencyexit\",\n]\n\nconst SPRITE_HIGHLIGHT_MARKER_FEATURE = SPRITE_MARKER_FEATURE.map(\n (featCate) =>\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${featCate.split(\"-\").join(\".\")}`\n)\n\nconst OCCUPANT_TEXT_MARKER_CLASSNAME = \"mtk-occupant-text-marker\"\n\nconst getAltitude = (properties) =>\n Math.max(0, properties.ordinal * ORDINAL_HEIGHT || 0)\n\nconst createRoomUnit = (feature, style, options) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n })\n}\n\n\nconst createNonpublicUnit = (feature, style, options = {}) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n })\n}\nconst createWalkwayUnit = (feature, style, options) => {\n const { geometry, id, properties } = feature\n const { allowOverride, inheritFillColorToLine } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n id,\n feature_type: \"unit\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: {\n ...symbolStyle,\n },\n })\n}\n\nconst createWaterFixture = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n zIndex,\n })\n}\n\nconst createVegetationFixture = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...symbolStyle,\n },\n zIndex,\n })\n}\n\nconst createObstructionalFixture = (feature, style = {}, options = {}) => {\n const { geometry, properties = {} } = feature\n const { model3d } = properties\n const { allowOverride, inheritFillColorToLine, zIndex } = options\n const symbolStyle = { ...style }\n if (!_.isEmpty(model3d)) return\n if (allowOverride) _.merge(symbolStyle, properties.style)\n if (inheritFillColorToLine) symbolStyle.lineColor = symbolStyle.polygonFill\n //create polygon with line-offset if geometry is lineString\n if (geometry.type === \"LineString\") {\n const polygon = createPolygonFromLineString(geometry)\n return new GeometryType[\"Polygon\"](polygon, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n zIndex,\n })\n }\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n defaultSymbol: symbolStyle,\n zIndex,\n })\n}\n\nconst createVegetationSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst creatingSeatingSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst creatingDefaultSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n try {\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n } catch (error) {\n console.warn(`Error creatingDefaultSection`, geometry.type)\n }\n}\n\nconst createEatingDrinkingSection = (feature, symbol = {}) => {\n const { geometry, properties } = feature\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol,\n zIndex: SECTION_Z_INDEX,\n })\n}\n\nconst createPrincipalOpening = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating pedestrian principal opening:`, feature)\n }\n}\n\nconst createEmergencyExitOpening = (feature, style, options = {}) => {\n const { geometry, properties } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating emergency exit opening:`, feature)\n }\n}\nconst createPedestrianOpening = (feature, style, options = {}) => {\n const { geometry, properties, id } = feature\n const { allowOverride, zIndex } = options\n const symbolStyle = { ...style }\n\n if (allowOverride) _.merge(symbolStyle, properties.style)\n\n try {\n return new LineString(geometry.coordinates, {\n properties: {\n id,\n feature_type: \"opening\",\n category: properties.category,\n altitude: getAltitude(properties),\n },\n symbol: symbolStyle,\n zIndex,\n })\n } catch (error) {\n console.log(`error creating pedestrian opening:`, feature)\n }\n}\n\nconst createExtrudePolygon = (\n geometry,\n threeLayer,\n material,\n height,\n properties = {},\n options\n) => {\n const { offset = 0, altitude = 0 } = options\n const offsetGeometry = turfBuffer(geometry, offset, { units: \"meters\" })\n const object = threeLayer.toExtrudePolygon(\n offsetGeometry,\n { height, async: true, altitude },\n material\n )\n object.properties = properties\n return object\n}\n\nconst create3DMarker = (\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n) => {\n return new SpriteMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n}\n\n/**\n * Retrieves the extrude configuration for a feature.\n *\n * @param {Object} baseExtrudeConfig - The default extrude configuration defined in the map settings within the app config content type.\n * @param {Object} feature - The target feature object for which the extrude value is required.\n * @returns {Object|undefined} - The extrude value from the feature's `properties` field, or the base extrude configuration as a fallback if not defined.\n */\nexport const getExtrudeConfigByFeature = (baseExtrudeConfig, feature = {}) => {\n const { feature_type: featureType } = feature\n // Retrieve extrude configuration from the extrude field in the feature's properties\n const featureExtrudeConfig = _.get(feature, \"properties.extrude\")\n\n // Retrieve extrude configuration from the base extrude settings. (Map Config)\n const featureCategory = _.get(feature, \"properties.category\")\n const baseFeatureExtrudeConfig = _.get(\n baseExtrudeConfig,\n `${featureType}.${featureCategory || featureType}`\n )\n\n // Fallback to base extrude configuration if the feature's extrude field is not defined.\n return featureExtrudeConfig ?? baseFeatureExtrudeConfig\n}\n\nconst getFeatureMarkerConfig = (feature, mapConfig = {}) => {\n const { textMarkerType, extrudeConfig = {}, symbol } = mapConfig\n\n const location = getLocationByFeature(feature)\n const featureExtrudeConfig = getExtrudeConfigByFeature(\n extrudeConfig,\n location\n )\n\n return {\n markerSymbol: symbol,\n textMarkerType,\n featureExtrudeConfig,\n }\n}\n\nexport const createSpriteMaterialByLabelSymbol = (labelSymbol = []) => {\n const material = new SpriteMaterial()\n try {\n const [base, icon] = labelSymbol\n const { markerWidth: baseWidth = 24 } = base\n const { markerWidth: iconWidth = 24 } = icon\n const viewBoxDimension = Math.max(baseWidth, iconWidth)\n\n const baseSVG = createSVGPathFromMarkerSymbol(base)\n const iconSVG = createSVGPathFromMarkerSymbol(icon)\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${viewBoxDimension}\" height=\"${viewBoxDimension}\">${baseSVG}${iconSVG}</svg>`\n const textureLoader = new TextureLoader()\n const scaleFactor = 200 / 24 // Scale factor to upscale from 24px to 200px to ensure the resolution is high enough\n\n svgToPng(svg, scaleFactor).then((png) => {\n const texture = textureLoader.load(png, () => {\n material.map = texture\n material.needsUpdate = true\n })\n })\n } catch (error) {\n console.warn(`Error createSpriteMaterialByLabelSymbol: `, labelSymbol)\n }\n return material\n}\n\nexport const createStyledUIMarkerElement = ({\n style,\n textContent,\n className,\n}) => {\n const element = document.createElement(\"div\")\n for (const key in style) {\n element.style[key] = style[key]\n }\n element.className = className\n element.textContent = textContent\n //! Use outerHTML to return HTML string instead of element object to avoid DOM event warnings from Maptalks.js.\n return element.outerHTML\n}\n\nexport const styledFeatureGenerator = (mapTheme) => {\n const getElementSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.geometry.symbol`)\n if (featureType === key) return featureTypeTheme\n const categoryTheme = _.get(mapTheme, `${key}.geometry.symbol`)\n return _.merge({}, featureTypeTheme, categoryTheme)\n }\n\n const getLabelSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.label`)\n const categoryTheme = _.get(mapTheme, `${key}.label`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n let symbols = _.values(_.map(mergedSymbol, \"symbol\"))\n const markerIndexToMove = symbols.findIndex(\n ({ elementType }) => elementType === \"label.marker\"\n )\n\n // Move the label.marker symbol to the last of array\n if (markerIndexToMove >= 0) {\n const markerSymbolToMove = _.pullAt(symbols, markerIndexToMove)[0]\n symbols.push(markerSymbolToMove)\n }\n\n return symbols\n }\n\n const getUIMarkerSymbol = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.ui.marker`)\n const categoryTheme = _.get(mapTheme, `${key}.ui.marker`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n const symbol = _.get(mergedSymbol, \"symbol\")\n return symbol\n }\n const getUIMarkerOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeTheme = _.get(mapTheme, `${featureType}.ui.marker`)\n const categoryTheme = _.get(mapTheme, `${key}.ui.marker`)\n const mergedSymbol = _.merge({}, featureTypeTheme, categoryTheme)\n const options = _.get(mergedSymbol, \"options\")\n return options\n }\n\n const getLabelOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeSymbol = _.get(mapTheme, `${featureType}.label`)\n const categorySymbol = _.get(mapTheme, `${key}.label`)\n const mergedSymbol = _.merge({}, featureTypeSymbol, categorySymbol)\n return _.reduce(\n mergedSymbol,\n (acc, symbol) => ({ ...acc, ..._.get(symbol, \"options\", {}) }),\n {}\n )\n }\n\n const generateSpriteMarkerMaterial = () => {\n return SPRITE_MARKER_FEATURE.reduce((acc, featCate) => {\n const [featureType, category] = featCate.split(\"-\")\n const key = `${featureType}.${category}`\n const labelSymbol = getLabelSymbol(key)\n const material = createSpriteMaterialByLabelSymbol(labelSymbol)\n return { ...acc, [key]: material }\n }, {})\n }\n\n const generateSpriteHighlightMarkerOption = () => {\n return SPRITE_HIGHLIGHT_MARKER_FEATURE.reduce((acc, featCate) => {\n const categoryKey = _.last(featCate.split(\"-\")) // Example: highlighted-amenity.atm -> amenity.atm\n const defaultLabelSymbol = getLabelSymbol(categoryKey)\n const highlightLabelSymbol = getLabelSymbol(featCate)\n const [defaultBase, defaultIcon] = defaultLabelSymbol\n const [highlightBase, highlightIcon] = highlightLabelSymbol\n const base = _.merge({}, defaultBase, highlightBase)\n const icon = _.merge({}, defaultIcon, highlightIcon)\n\n const material = createSpriteMaterialByLabelSymbol([base, icon])\n const options = getLabelOptions(featCate)\n return { ...acc, [featCate]: { material, options } }\n }, {})\n }\n\n const spriteMarkerMaterialObj = generateSpriteMarkerMaterial()\n const spriteHighlightMarkerOptionObj = generateSpriteHighlightMarkerOption()\n\n const getElementOptions = (key) => {\n const [featureType] = key.split(\".\")\n const featureTypeOptions = _.get(\n mapTheme,\n `${featureType}.geometry.options`\n )\n\n const categoryOptions = _.get(mapTheme, `${key}.geometry.options`)\n\n return _.merge({}, featureTypeOptions, categoryOptions)\n }\n\n const createOccupantMarker = (feature, locatedFeature, mapConfig) => {\n const { textMarkerType, featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\", 0)\n const { properties, id, feature_type } = feature\n if (!properties.anchor) return\n\n /**\n * Prepare geometry for occupant marker positioning:\n * - Use anchor coordinates if the location feature is the main location\n * - Otherwise, use the center of the location feature\n */\n const mainLocationId =\n _.get(properties, \"unit.id\") || _.get(properties, \"kiosk.id\")\n const isMainLocationFeature = mainLocationId === locatedFeature?.id\n const { geometry: mainLocationGeometry } = properties?.anchor\n const geometry = isMainLocationFeature\n ? mainLocationGeometry\n : turfCenter(locatedFeature)?.geometry\n\n const baseProperties = {\n id,\n feature_type,\n category: properties.category,\n altitude: getAltitude(properties),\n }\n const occupantName = _.isEmpty(properties.short_name)\n ? properties.name\n : properties.short_name\n\n if (locatedFeature) {\n const { feature_type, properties } = locatedFeature\n const { category } = properties\n const locatedLabelOption =\n feature_type === \"kiosk\"\n ? getLabelOptions(`${feature_type}`)\n : getLabelOptions(`${feature_type}.${category}`)\n const { hidden = false } = locatedLabelOption || {}\n if (hidden) return\n }\n\n const getValidatedRenderType = (requestedType, logoUrl) => {\n // If requestType is \"Logo\" or \"Logo + Name\" and no logo, fallback to \"Name\"\n if (requestedType === \"Logo\" || requestedType === \"Logo + Name\") {\n return logoUrl ? requestedType : \"Name\"\n }\n return requestedType\n }\n\n const logoUrl = _.get(properties, \"logo.url\")\n const requestedRenderType = _.get(properties, \"render_type\", \"Name\")\n const renderType = getValidatedRenderType(requestedRenderType, logoUrl)\n if (renderType === \"Label\") return null\n\n const renderPriority = properties.render_priority || 3\n const labelSymbol = getLabelSymbol(`occupant-${_.toLower(renderType)}`)\n const markerSymbol = _.last(labelSymbol)\n\n const coordinates = _.get(geometry, \"coordinates\")\n\n const priorityLabelSymbol = getLabelSymbol(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n const priorityMarkerSymbol = _.last(priorityLabelSymbol) || {}\n\n switch (renderType) {\n case \"Logo\":\n _.set(priorityMarkerSymbol, \"markerFile\", logoUrl)\n\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: priorityLabelSymbol,\n })\n\n case \"Logo + Name\":\n return new Marker(coordinates, {\n properties: {\n name: occupantName.en,\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: {\n textName: \"{name}\",\n markerFile: logoUrl,\n textHaloRadius: {\n stops: [\n [20, 1],\n [21, 2],\n ],\n },\n ...markerSymbol,\n ...priorityMarkerSymbol,\n },\n })\n case \"None\":\n return new ui.UIMarker(coordinates, {\n properties: { ...baseProperties },\n content: createStyledUIMarkerElement({\n style: { display: \"none\" },\n textContent: occupantName.en,\n }),\n altitude: getAltitude(properties) + markerHeight,\n })\n case \"Name\":\n default:\n if (textMarkerType === \"marker\") {\n return new Marker(coordinates, {\n properties: {\n name: occupantName.en,\n altitude: getAltitude(properties) + markerHeight,\n ...baseProperties,\n },\n symbol: {\n textName: \"{name}\",\n //TODO:: implement symbol scaler later\n textHaloRadius: {\n stops: [\n [20, 1],\n [21, 2],\n ],\n },\n ...markerSymbol,\n ...priorityMarkerSymbol,\n },\n })\n }\n\n const uiMarkerSymbol = getUIMarkerSymbol(\n `occupant-${_.toLower(renderType)}`\n )\n const uiMarkerPrioritySymbol = getUIMarkerSymbol(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n const uiMarkerPriorityOptions = getUIMarkerOptions(\n `occupant-${_.toLower(renderType)}-${renderPriority}`\n )\n\n const style = { ...uiMarkerSymbol, ...uiMarkerPrioritySymbol }\n return new ui.UIMarker(coordinates, {\n properties: { ...baseProperties },\n content: createStyledUIMarkerElement({\n style,\n textContent: occupantName.en,\n className: OCCUPANT_TEXT_MARKER_CLASSNAME,\n }),\n collision: true,\n collisionFadeIn: true,\n altitude: getAltitude(properties) + markerHeight,\n ...uiMarkerPriorityOptions,\n })\n }\n }\n\n const getFeatureProperties = (feature) => {\n const { id, feature_type, properties } = feature\n const { category, ordinal, style = {} } = properties\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const { allowOverride } = getElementOptions(`${feature_type}.${category}`)\n if (allowOverride) _.merge(elementStyle, style)\n const { polygonFill: color } = elementStyle\n const featureProperty = {\n id,\n feature_type,\n category: category || feature_type,\n ordinal,\n defaultColor: color,\n }\n return featureProperty\n }\n\n return {\n getElementSymbol,\n getHilighPolygonalSymbol: (type) => {\n switch (type) {\n case \"MultiPolygon\":\n case \"Polygon\": {\n return getElementSymbol(\"hilight-polygonal\")\n }\n case \"Point\": {\n return getElementSymbol(\"hilight-marker\")\n }\n default:\n break\n }\n },\n getHighlightMarkerSymbol: () => {\n return getElementSymbol(\"highlighted-marker\")\n },\n createVenue: (feature) => {\n const { geometry, feature_type } = feature\n const symbolStyle = getElementSymbol(feature_type)\n return new GeometryType[geometry.type](geometry.coordinates, {\n symbol: {\n ...symbolStyle,\n },\n zIndex: VENUE_Z_INDEX,\n })\n },\n\n createLevel: (feature) => {\n const { geometry, properties, feature_type } = feature\n const { category } = properties\n\n const style = getElementSymbol(`${feature_type}.${category}`)\n // const options = getElementOptions(`${feature_type}.${category}`)\n\n return new GeometryType[geometry.type](geometry.coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: {\n ...style,\n },\n zIndex: LEVEL_Z_INDEX,\n })\n },\n\n\n createMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const markerSymbol = getElementSymbol(\"pin-marker\")\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n symbol: markerSymbol,\n })\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n createOriginMarker: (feature) => {\n const { id, geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const markerSymbol = getElementSymbol(\"origin-marker\")\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n },\n id,\n symbol: markerSymbol,\n })\n } catch (error) {\n console.log(`error creating origin marker:`, feature)\n }\n },\n createDestinationPinMarker: (feature, mapConfig) => {\n const { featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\")\n // Get Label from located unit / kiosk\n const { id, properties } = feature\n const geometry =\n _.get(feature, \"geometry\") ||\n _.get(feature, \"properties.anchor.geometry\")\n const coordinates = getCenterFromGeometry(geometry)\n const symbol = getElementSymbol(\"pin-marker\")\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n },\n id,\n symbol,\n })\n } catch (error) {\n console.log(`error creating destination marker:`, feature)\n }\n },\n createDestinationLogoMarker: (feature, mapConfig = {}) => {\n const { featureExtrudeConfig } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\", 0)\n\n // Get Label from located unit / kiosk\n const { properties, id } = feature\n const { geometry } = properties.anchor\n const logoUrl = _.get(properties, \"logo.url\")\n const coordinates = getCenterFromGeometry(geometry)\n const [markerBase, markerLabel] = getLabelSymbol(\n \"highlighted-logo-marker\"\n )\n try {\n return new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties) + markerHeight,\n },\n id,\n symbol: [markerBase, { ...markerLabel, markerFile: logoUrl }],\n })\n } catch (error) {\n console.log(`error creating destination marker:`, feature)\n }\n },\n\n createUserLocationMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const symbolStyle = getElementSymbol(\"user-location\") || {}\n const marker = new Marker(coordinates, {\n properties: {\n altitude: getAltitude(properties),\n ordinal: properties.ordinal !== null ? properties.ordinal : null,\n },\n symbol: symbolStyle.start,\n zIndex: USER_LOCATION_Z_INDEX,\n })\n\n marker.animate(\n {\n symbol: symbolStyle.end,\n },\n {\n repeat: true,\n easing: \"upAndDown\",\n duration: 1500,\n }\n )\n return marker\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n\n createLastUserLocationMarker: (feature) => {\n try {\n const { geometry, properties } = feature\n const coordinates = getCenterFromGeometry(geometry)\n const symbolStyle = getElementSymbol(\"last-user-location\") || {}\n const options = getElementOptions(\"last-user-location\") || {}\n const marker = new Marker(coordinates, {\n properties: {\n ...options,\n altitude: getAltitude(properties),\n ordinal: properties.ordinal !== null ? properties.ordinal : null,\n },\n symbol: symbolStyle,\n zIndex: LAST_LOCATION_Z_INDEX,\n })\n\n return marker\n } catch (err) {\n console.log(`error creating marker:`, feature)\n }\n },\n\n createHighlightOccupantMarker: (feature, mapConfig) => {\n const { featureExtrudeConfig, markerSymbol } = getFeatureMarkerConfig(\n feature,\n mapConfig\n )\n const markerHeight = _.get(featureExtrudeConfig, \"height\")\n const { id, feature_type, properties } = feature\n\n if (!properties.anchor) return\n\n const markerProperties = {\n ...properties,\n id,\n feature_type,\n altitude: getAltitude(properties) + markerHeight,\n }\n\n const { geometry } = properties?.anchor\n const coordinates = _.get(geometry, \"coordinates\")\n const logoUrl = _.get(properties, \"logo.url\")\n\n // If the symbol option is defined, create a marker.\n if (markerSymbol) {\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol: markerSymbol,\n })\n }\n\n //use pin-marker if no logo\n if (!logoUrl) {\n const symbol = getElementSymbol(\"pin-marker\")\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol,\n })\n }\n\n const labelSymbol = getLabelSymbol(\"highlight-occupant-logo\")\n const priorityMarkerSymbol = _.last(labelSymbol) || {}\n _.set(priorityMarkerSymbol, \"markerFile\", logoUrl)\n return new Marker(coordinates, {\n properties: markerProperties,\n symbol: labelSymbol,\n })\n },\n createHighlight2DAmenityMarkerFrom3DMarker: (feature, mapConfig) => {\n const { coordinates, units, kiosk } = feature\n const amenityLocatedUnit = _.first(units)\n\n const unitConfig = getExtrudeConfigByFeature(\n mapConfig,\n amenityLocatedUnit\n )\n const unitHeight = _.get(unitConfig, \"height\", 0)\n const kioskConfig = getExtrudeConfigByFeature(mapConfig, kiosk)\n const kioskHeight = _.get(kioskConfig, \"height\", 0)\n\n const markerHeight = unitHeight + kioskHeight\n\n const symbol = getElementSymbol(\"highlight-amenity-marker\")\n return new Marker(coordinates, {\n properties: {\n ...feature,\n altitude: markerHeight,\n },\n symbol,\n })\n },\n\n createSection: (feature) => {\n const { properties, feature_type } = feature\n const { category } = properties\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n switch (category) {\n case \"eatingdrinking\":\n return createEatingDrinkingSection(feature, elementStyle)\n case \"vegetation\":\n return createVegetationSection(feature, elementStyle)\n case \"seating\":\n return creatingSeatingSection(feature, elementStyle)\n default:\n return creatingDefaultSection(feature, elementStyle)\n }\n },\n\n createOccupant: (feature, location, mapConfig) => {\n return createOccupantMarker(feature, location, mapConfig)\n },\n\n createOpening: (feature) => {\n const {\n feature_type,\n properties: { category },\n } = feature\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const options = {\n ...getElementOptions(`${feature_type}.${category}`),\n zIndex: OPENING_Z_INDEX,\n }\n switch (feature.properties.category) {\n case \"pedestrian\":\n return createPedestrianOpening(feature, elementStyle, options)\n case \"pedestrian.principal\":\n return createPrincipalOpening(feature, elementStyle, options)\n case \"emergencyexit\":\n return createEmergencyExitOpening(feature, elementStyle, options)\n default:\n break\n }\n },\n\n createFixture: (feature) => {\n const {\n feature_type,\n properties: { category },\n } = feature\n const elementStyle = getElementSymbol(`${feature_type}.${category}`)\n const options = {\n ...getElementOptions(`${feature_type}.${category}`),\n zIndex: FIXTURE_Z_INDEX,\n }\n switch (feature.properties.category) {\n case \"water\":\n return createWaterFixture(feature, elementStyle, options)\n case \"vegetation\":\n return createVegetationFixture(feature, elementStyle, options)\n case \"equipment\":\n case \"obstruction\":\n case \"stage\":\n case \"desk\":\n case \"wall\":\n return createObstructionalFixture(feature, elementStyle, options)\n default:\n break\n }\n },\n\n createLineStringFromGeometries: (geometries) => {\n const mergedCoordinates = _(geometries)\n .map((geometry) => {\n switch (geometry.type) {\n case \"Point\":\n return [\n geometry?.getCoordinates\n ? geometry?.getCoordinates()\n : new Coordinate(geometry.coordinates),\n ]\n case \"Polygon\":\n return [\n geometry?.getCenter\n ? geometry?.getCenter()\n : new Polygon(geometry.coordinates).getCenter(),\n ]\n case \"MultiPolygon\":\n return [\n geometry?.getCenter\n ? geometry?.getCenter()\n : new MultiPolygon(geometry.coordinates).getCenter(),\n ]\n case \"LineString\":\n default:\n return geometry?.getCoordinates\n ? geometry?.getCoordinates()\n : new LineString(geometry.coordinates).getCoordinates()\n }\n })\n .flatten()\n .value()\n const stepPathLineSymbol = getElementSymbol(\"navigation-path\")\n const startPathSymbolMarker = getElementSymbol(\"navigation-path-start\")\n\n const line = new LineString(mergedCoordinates, {\n smoothness: 0.5,\n symbol: [...stepPathLineSymbol, startPathSymbolMarker],\n })\n\n return line\n },\n create3DStepPath: (feature, threeLayer, option = {}) => {\n const stepPathLineSymbol = getElementSymbol(\"navigation-path\")\n const pathLineSymbol = stepPathLineSymbol[1]\n const pathLineEffect = stepPathLineSymbol[0]\n const lineOptions = {\n color: pathLineSymbol?.lineColor,\n opacity: pathLineSymbol?.lineOpacity,\n }\n const outlineOptions = {\n color: pathLineEffect?.lineColor,\n opacity: pathLineEffect?.lineOpacity,\n }\n\n return new NavigationPath(\n feature,\n threeLayer,\n getFeatureProperties(feature),\n option,\n lineOptions,\n outlineOptions\n )\n },\n\n createDecoration: (decoration, options) => {\n const { type, coordinates } = decoration\n const { id, ordinal, symbol } = options\n const formattedProperties = {\n properties: {\n id,\n altitude: getAltitude(options),\n ordinal,\n },\n symbol,\n zIndex: DECORATION_Z_INDEX,\n }\n switch (type) {\n case \"Polygon\":\n return new Polygon(coordinates, formattedProperties)\n case \"MultiPolygon\":\n return new MultiPolygon(coordinates, formattedProperties)\n case \"LineString\":\n return new LineString(coordinates, formattedProperties)\n case \"MultiLineString\":\n return new MultiLineString(coordinates, formattedProperties)\n default:\n return null\n }\n },\n \n create3DBillboard: (billboard, threeLayer) => {\n const { id, feature_type, properties } = billboard\n const {\n logo,\n altitude,\n scale,\n alphaTest,\n legColor,\n showLeg,\n is_clickable,\n } = properties\n const coordinates = getCenterFromGeometry(billboard.geometry)\n const billboardProperties = {\n ...billboard.properties,\n id,\n feature_type,\n }\n\n const options = {\n altitude,\n scale,\n alphaTest,\n legColor,\n showLeg,\n interactive: is_clickable,\n }\n\n return new Billboard(\n coordinates,\n options,\n logo?.url,\n threeLayer,\n billboardProperties\n )\n },\n create3DAmenityMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, units, kiosk, is_clickable } = properties\n const amenityLocatedUnit = _.first(units)\n const isLocatedUnitModel3dAvailable = !_.isEmpty(\n amenityLocatedUnit?.properties?.model3d\n )\n const isLocatedKioskModel3dAvailable = !_.isEmpty(\n kiosk?.properties?.model3d\n )\n\n const unitConfig = getExtrudeConfigByFeature(config, amenityLocatedUnit)\n const unitHeight = isLocatedUnitModel3dAvailable\n ? 0\n : _.get(unitConfig, \"height\", 0)\n const kioskConfig = getExtrudeConfigByFeature(config, kiosk)\n const kioskHeight = isLocatedKioskModel3dAvailable\n ? 0\n : _.get(kioskConfig, \"height\", 0)\n\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: unitHeight + kioskHeight,\n highlight: highlightOptions,\n interactive: is_clickable,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n\n create3DOccupantAmenityMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, unit, kiosk } = properties\n const amenityLocation = kiosk || unit\n const locationConfig = getExtrudeConfigByFeature(config, amenityLocation)\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: _.get(locationConfig, \"height\", 0),\n highlight: highlightOptions,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n create3DOpeningMarker: (feature, threeLayer, config) => {\n const { geometry, properties, feature_type, id } = feature\n const { category, unit, kiosk } = properties\n const amenityLocation = kiosk || unit\n const locationConfig = getExtrudeConfigByFeature(config, amenityLocation)\n const coordinates = _.get(geometry, \"coordinates\")\n\n const markerProperties = {\n ...properties,\n coordinates,\n id,\n feature_type,\n }\n\n const material = _.get(\n spriteMarkerMaterialObj,\n `${feature_type}.${category}`\n )\n\n const highlightOptions = _.get(\n spriteHighlightMarkerOptionObj,\n `${PREFIX_HIGHLIGHTED_SYMBOL_KEY}-${feature_type}.${category}`\n )\n\n const options = {\n scale: 0.05,\n altitude: _.get(locationConfig, \"height\", 0),\n highlight: highlightOptions,\n }\n\n return create3DMarker(\n coordinates,\n options,\n material,\n threeLayer,\n markerProperties\n )\n },\n\n createExtrudedUnit: (unit, threeLayer, options) => {\n const extrudeHeight = _.get(options, \"height\")\n if (!extrudeHeight) return\n //NOTE: this is temporary condition that only extrude when the unit is \"room\"\n const unitProperty = getFeatureProperties(unit)\n //NOTE: offset will be dynamic in future improvement\n const options3d = {\n // TODO: Move to extrude config later\n offset: -0.1,\n altitude: _.get(options, \"altitude\", 0),\n }\n const color = unitProperty.defaultColor\n if (color === \"transparent\") return\n const material = new MeshLambertMaterial({\n color,\n transparent: true,\n })\n //create polygon with line-offset if geometry is lineString\n if (unit.geometry.type === \"LineString\") {\n const polygon = createPolygonFromLineString(unit.geometry)\n const geometry = {\n type: \"Polygon\",\n coordinates: polygon,\n }\n return createExtrudePolygon(\n geometry,\n threeLayer,\n material,\n extrudeHeight,\n unitProperty,\n options3d\n )\n }\n const object = createExtrudePolygon(\n unit.geometry,\n threeLayer,\n material,\n extrudeHeight,\n unitProperty,\n options3d\n )\n return object\n },\n }\n}\n\nconst EXCEPT_AMENITY_LOCATION_CATEGORIES = [\n \"walkway\",\n \"nonpublic\",\n \"parking\",\n \"opentobelow\",\n \"unspecified\",\n]\nexport const getLocationByAmenity = (feature) => {\n const unit = _.get(feature, \"properties.units[0]\", null)\n const unitCategory = _.get(unit, \"properties.category\")\n if (!unit) return feature.id\n return EXCEPT_AMENITY_LOCATION_CATEGORIES.includes(unitCategory)\n ? feature\n : unit\n}\n\nexport const getLocationByOccupant = (feature) => {\n const kiosk = _.get(feature, \"properties.kiosk\", null)\n const unit = _.get(feature, \"properties.anchor.properties.unit\", null)\n return kiosk || unit\n}\n\nexport const getLocationIdByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"kiosk\":\n case \"unit\":\n case \"opening\":\n return feature.id\n case \"amenity\":\n return getLocationByAmenity(feature)?.id\n case \"occupant\":\n return getLocationByOccupant(feature)?.id\n case \"promotion\":\n case \"event\":\n return feature.properties?.feature_id\n default:\n return\n }\n}\n\nexport const getFeatureByLocationId = (id, features = []) => {\n return features?.find((f) => {\n const mainLocationId = getLocationIdByFeature(f)\n const relatedLocationIds = getRelatedLocationIdsByFeature(f)\n return mainLocationId === id || relatedLocationIds.includes(id)\n })\n}\n\nexport const isClickableFeature = (feature) => {\n const isClickable = _.get(feature, \"properties.is_clickable\")\n switch (feature?.feature_type) {\n case \"amenity\":\n return _.isNull(isClickable) ? true : isClickable\n case \"occupant\":\n return true\n default:\n return\n }\n}\n\nexport const getLocationByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getLocationByAmenity(feature)\n case \"occupant\":\n return getLocationByOccupant(feature)\n default:\n return\n }\n}\n\n/*\n * Utility functions to retrieve related locations for amenities and occupants.\n * - Used for highlighting on the floor plan.\n * - Displays location details.\n */\n\nexport const getRelatedLocationsByOccupant = (feature) => {\n const kiosks = _.get(feature, \"properties.kiosks\", [])\n const units = _.get(feature, \"properties.units\", [])\n return [...kiosks, ...units]\n}\n\nexport const getRelatedLocationsByAmenity = (feature) => {\n const units = _.get(feature, \"properties.units\", [])\n\n if (units.length === 0) return [feature]\n\n return units.filter((unit) => {\n const unitCategory = _.get(unit, \"properties.category\")\n return !EXCEPT_AMENITY_LOCATION_CATEGORIES.includes(unitCategory)\n })\n}\n\nexport const getRelatedLocationIdsByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getRelatedLocationsByAmenity(feature).map((v) => v?.id)\n case \"occupant\":\n return getRelatedLocationsByOccupant(feature).map((v) => v?.id)\n default:\n return []\n }\n}\n\nexport const getRelatedLocationsByFeature = (feature) => {\n switch (feature?.feature_type) {\n case \"amenity\":\n return getRelatedLocationsByAmenity(feature)\n case \"occupant\":\n return getRelatedLocationsByOccupant(feature)\n default:\n return []\n }\n}\n\nexport const getOrdinalByLocationId = (locationId, feature) => {\n if (!feature) return null\n\n const mainUnit = _.get(feature, \"properties.unit\")\n const mainKiosk = _.get(feature, \"properties.kiosk\")\n const relatedLocations = getRelatedLocationsByFeature(feature)\n\n const allLocations = [mainUnit, mainKiosk, ...relatedLocations].filter(\n Boolean\n )\n const targetLocation = allLocations.find(\n (location) => location.id === locationId\n )\n\n return targetLocation\n ? _.get(targetLocation, \"properties.level.properties.ordinal\") ||\n _.get(targetLocation, \"properties.ordinal\")\n : null\n}\n","import * as maptalks from \"maptalks\"\nimport { BaseObject } from \"maptalks.three\"\nimport {\n LineBasicMaterial,\n BufferGeometry,\n Float32BufferAttribute,\n Line,\n TextureLoader,\n SpriteMaterial,\n Sprite,\n} from \"three\"\nimport _ from \"lodash\"\n\nconst OPTIONS = {\n altitude: 25,\n scale: 0.00015,\n alphaTest: 0.3,\n legColor: \"#ff0400\",\n showLeg: true,\n}\n\nconst getImgDimension = async (url) => {\n const img = new Image()\n img.src = url\n await img.decode()\n return { naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight }\n}\n\nexport class Billboard extends BaseObject {\n #layer = null\n constructor(coordinate, options, src, layer, properties) {\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n coordinate,\n })\n super()\n //Initialize internal configuration\n this.#layer = layer\n this._initOptions(options)\n const {\n altitude = OPTIONS.altitude,\n scale = OPTIONS.scale,\n alphaTest = OPTIONS.alphaTest,\n legColor = OPTIONS.legColor,\n showLeg = OPTIONS.showLeg,\n } = options\n this.properties = { ...properties }\n this._createGroup()\n\n // Screen size / base mobile screen size ratio => 375\n const divider = _.clamp(window.innerWidth / 375 / 1.75, 1, 1.7)\n // Leg\n if (showLeg) {\n const lineMaterial = new LineBasicMaterial({\n color: legColor,\n transparent: true,\n })\n const lineHeight = layer.altitudeToVector3(altitude, altitude).x\n const lineGeometry = new BufferGeometry()\n const positions = [0, 0, 0, 0, 0, -lineHeight]\n lineGeometry.setAttribute(\n \"position\",\n new Float32BufferAttribute(positions, 3)\n )\n const line = new Line(lineGeometry, lineMaterial)\n this.getObject3d().add(line)\n }\n\n getImgDimension(src).then(({ naturalWidth, naturalHeight }) => {\n // Image\n const map = new TextureLoader().load(src)\n const material = new SpriteMaterial({\n map: map,\n color: 0xffffff,\n alphaTest: alphaTest,\n })\n material.needsUpdate = true\n const sprite = new Sprite(material)\n sprite.material.sizeAttenuation = false\n sprite.scale.set(\n (scale * naturalWidth) / divider,\n (scale * naturalHeight) / divider,\n 1\n )\n this.getObject3d().add(sprite)\n })\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude, altitude).x\n const position = layer.coordinateToVector3(coordinate, z)\n _.set(this.properties, \"default.position\", position)\n _.set(this.properties, \"default.altitude\", altitude)\n _.set(this.properties, \"default.scale\", scale)\n this.getObject3d().position.copy(position)\n }\n\n setLineHeight(altitude) {\n const lineHeight = this.#layer.altitudeToVector3(altitude, altitude).x\n const geometry = this.getObject3d().children[0].geometry\n const positionAttribute = geometry.getAttribute(\"position\")\n positionAttribute.setZ(1, -lineHeight)\n positionAttribute.needsUpdate = true\n\n this.getObject3d().position.z = lineHeight\n }\n}\n","import { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Sprite, SpriteMaterial } from \"three\"\nimport _ from \"lodash\"\n\nconst DEFAULT_SCALE = 0.05\nconst DEFAULT_ALTITUDE = 0\nconst DEFAULT_ALPHATEST = 0.3\nconst DEFAULT_OPTIONS = {\n scale: DEFAULT_SCALE,\n altitude: DEFAULT_ALTITUDE,\n alphaTest: DEFAULT_ALPHATEST,\n highlight: {\n options: {\n scale: DEFAULT_SCALE * 1.25,\n },\n material: null,\n },\n}\n\ninterface IOptions {\n scale: number\n altitude: number\n alphaTest?: number\n highlight?: {\n options: {\n altitude?: number\n scale?: number\n }\n material?: SpriteMaterial\n }\n}\n\nexport class SpriteMarker extends BaseObject {\n #default = null\n #highlight = null\n constructor(\n coordinate,\n options: IOptions,\n material: SpriteMaterial,\n layer: ThreeLayer,\n properties: object\n ) {\n super()\n //Initialize internal configuration\n this._initOptions(options)\n this._createGroup()\n const {\n altitude = DEFAULT_OPTIONS.altitude,\n scale = DEFAULT_OPTIONS.scale,\n highlight = DEFAULT_OPTIONS.highlight,\n alphaTest = DEFAULT_OPTIONS.alphaTest,\n } = options\n this.properties = { ...properties }\n\n const modifiedAltitude = altitude + 2\n\n this.#default = { options: { scale, altitude: modifiedAltitude }, material }\n this.#highlight = _.merge({}, DEFAULT_OPTIONS.highlight, highlight)\n\n /**\n * Add alphaTest to render only non-transparent pixels in PNG images.\n * [@Doc](https://threejs.org/docs/#api/en/materials/Material.alphaTest)\n */\n if (material && material instanceof SpriteMaterial)\n material.alphaTest = alphaTest\n\n const sprite = new Sprite(material)\n sprite.scale.set(scale, scale, scale) // Set sprite scale\n\n const obj3d = this.getObject3d()\n obj3d.add(sprite)\n // set object3d position\n const z = layer.altitudeToVector3(modifiedAltitude, modifiedAltitude).x\n const position = layer.coordinateToVector3(coordinate, z)\n _.set(this.properties, \"default.position\", position)\n this.getObject3d().position.copy(position)\n }\n\n // Different objects need to implement their own methods\n setSymbol(material: SpriteMaterial) {\n if (material && material instanceof SpriteMaterial) {\n const sprite = (this.getObject3d() as any).children[0]\n\n if (!sprite) return this\n\n sprite.material = material\n sprite.material.needsUpdate = true\n }\n return this\n }\n\n setScale(scaleX: number, scaleY: number = scaleX, scaleZ: number = scaleX) {\n const sprite = (this.getObject3d() as any).children[0]\n if (!sprite) return this\n\n sprite.scale.set(scaleX, scaleY, scaleZ)\n\n return this\n }\n\n // Different objects need to implement their own methods\n getSymbol(): SpriteMaterial {\n return (this.getObject3d() as any)?.children[0]?.material\n }\n\n highlight() {\n const { material, options } = this.#highlight\n if (material) this.setSymbol(material)\n if (options.scale) this.setScale(options.scale)\n if (options.altitude) this.setAltitude(options.altitude)\n return this\n }\n\n removeHighlight() {\n const { material, options } = this.#default\n if (material) this.setSymbol(material)\n if (options.scale) this.setScale(options.scale)\n if (options.altitude) this.setAltitude(options.altitude)\n return this\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { BaseObject } from \"maptalks.three\"\nimport { MeshBasicMaterial, ShaderMaterial, Color } from \"three\"\n\nconst OPTIONS = {\n altitude: 0,\n}\n\nconst DEFAULT_LINE_OPTION = {\n color: \"#000\",\n opacity: 1,\n}\nconst DEFAULT_LINE_EFFECT_OPTION = {\n color: \"#000\",\n opacity: 1,\n}\n\n// In case we want to open/close this animation per project.\nconst ENABLE_ANIMATED_PATH = true\n\nexport class NavigationPath extends BaseObject {\n constructor(\n feature,\n layer,\n properties,\n options,\n lineOptions = DEFAULT_LINE_OPTION,\n outlineOption = DEFAULT_LINE_EFFECT_OPTION\n ) {\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n })\n super()\n //Initialize internal configuration\n this._initOptions(options)\n const { altitude = OPTIONS.altitude } = options\n this.properties = { ...properties }\n this._createGroup()\n\n const { color: lineColor, opacity: lineOpacity } =\n lineOptions || DEFAULT_LINE_OPTION\n\n const staticMaterial = new MeshBasicMaterial({\n transparent: true,\n color: lineColor || \"#fff\",\n opacity: lineOpacity || 1,\n depthWrite: false,\n })\n\n const uniforms = {\n time: { value: 0 },\n color: { value: new Color(lineColor || \"#fff\") },\n opacity: { value: lineOpacity || 1 },\n }\n this._uniforms = uniforms\n this._t = 0 // Start time = 0\n\n /**\n * Animation formula\n * float dash = smoothstep(0.3, 0.7, abs(sin(vUv.x * 1.0 - time * 0.1)));\n * | vUv.x * 1.0 | controls dash length & frequency\n * | - time * 1.0 | animates motion to the right\n */\n const animatedMaterial = new ShaderMaterial({\n uniforms,\n transparent: true,\n depthWrite: false,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float time;\n uniform vec3 color;\n uniform float opacity;\n varying vec2 vUv;\n\n void main() {\n float dash = smoothstep(0.3, 0.7, abs(sin(vUv.x * 1.0 - time * 0.1)));\n gl_FragColor = vec4(color, opacity * dash);\n }\n `,\n })\n\n const pathGeometry = maptalks.GeoJSON.toGeometry(feature)\n const line = layer.toPath(\n pathGeometry,\n {\n interactive: false,\n cornerRadius: 2,\n width: 0.5,\n },\n ENABLE_ANIMATED_PATH ? animatedMaterial : staticMaterial\n )\n\n const { color: outlineColor, opacity: outlineOpacity } = outlineOption || {}\n const outlineMaterial = new MeshBasicMaterial({\n transparent: true,\n color: outlineColor || \"#fff\",\n opacity: outlineOpacity || 1,\n })\n\n const lineOutLine = layer.toPath(\n pathGeometry,\n {\n interactive: false,\n cornerRadius: 2,\n width: 1,\n },\n outlineMaterial\n )\n this.getObject3d().add(lineOutLine.getObject3d())\n this.getObject3d().add(line.getObject3d())\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude + 0.25, altitude + 0.25).x\n const pos = this.getObject3d().position\n\n const position = layer.coordinateToVector3([pos.x, pos.y], z)\n // _.set(this.properties, \"default.position\", position)\n\n this.getObject3d().position.copy(position)\n }\n\n _animation() {\n this._t = this._t + 1\n this._uniforms.time.value = this._t\n }\n}\n","import center from \"@turf/center\"\nimport { Polygon, MultiPolygon, Point, LineString } from \"geojson\"\nimport _ from \"lodash\"\nimport turfLineOffset from \"@turf/line-offset\"\nimport { lineString as turfLineString } from \"@turf/helpers\"\n\n// Calculates the center point of a GeoJSON geometry and Return as a Coordinates.\nexport const getCenterFromGeometry = (geometry?: Polygon | MultiPolygon | Point | LineString): number[] | null => {\n try {\n const { type = null, coordinates = null } = geometry\n if (!type || !coordinates) return null\n const centerPoint = center(geometry)\n return _.get(centerPoint, \"geometry.coordinates\") // Coordinates\n } catch (error) {\n return null\n }\n}\n\nexport const createPolygonFromLineString = (geometry) => {\n const line = turfLineString(geometry.coordinates)\n const left = turfLineOffset(line, 0.3, { units: \"meters\" })\n const right = turfLineOffset(line, -0.3, { units: \"meters\" })\n const leftCoords = left.geometry.coordinates\n const rightCoords = right.geometry.coordinates.reverse()\n const polygon = [...leftCoords, ...rightCoords, leftCoords[0]]\n return [polygon]\n}\n","export const svgToPng = (svgString: string, scaleFactor: number = 1) => {\n const svgBlob = new Blob([svgString], { type: \"image/svg+xml\" })\n const url = URL.createObjectURL(svgBlob)\n const img = new Image()\n return new Promise((resolve, reject) => {\n img.onload = function () {\n // Calculate the new dimensions\n const newWidth = img.width * scaleFactor\n const newHeight = img.height * scaleFactor\n\n // Create a canvas with the new dimensions\n const canvas = document.createElement(\"canvas\")\n canvas.width = newWidth\n canvas.height = newHeight\n const ctx = canvas.getContext(\"2d\")\n\n // Draw the SVG image onto the canvas with the scaled dimensions\n ctx.drawImage(img, 0, 0, newWidth, newHeight)\n\n // Convert canvas to PNG\n const pngDataUrl = canvas.toDataURL(\"image/png\")\n\n // Resolve the Promise with the PNG data URL\n resolve(pngDataUrl)\n }\n\n // Handle image load errors\n img.onerror = function (error) {\n reject(error)\n }\n\n img.src = url\n })\n}\n\nexport const createSVGPathFromMarkerSymbol = (style) => {\n const {\n markerWidth = 24,\n markerDx = 0,\n markerDy = 0,\n markerFill,\n markerPath,\n } = style\n const scale = markerWidth / 24\n return `<path d=\"${markerPath}\" style=\"transform:translate(${markerDx}px, ${markerDy}px) scale(${scale})\" fill=\"${markerFill}\"/>`\n}\n","interface ICoordinate {\n x: number\n y: number\n z?: number\n}\n\ntype RadToDegree = (rad: number) => number\n\ntype GetBearingBetweenPoints = (\n origin: ICoordinate,\n destination: ICoordinate\n) => number\n\ntype GetSuitablyValueBetweenBearings = (\n newBearing: number,\n currentBearing: number\n) => number\n\nconst radToDegree: RadToDegree = (rad) => rad * (180 / Math.PI)\n\nexport const getBearingBetweenPoints: GetBearingBetweenPoints = (\n origin,\n destination\n) => {\n const twoPI = Math.PI * 2\n\n if (origin.x === destination.x && origin.y === destination.y) return\n let theta = Math.atan2(destination.x - origin.x, destination.y - origin.y)\n\n if (theta < 0.0) theta += twoPI\n\n return Math.floor(radToDegree(theta))\n}\n\nexport const getSuitablyValueBetweenBearings: GetSuitablyValueBetweenBearings =\n (newBearing, currentBearing) => {\n const difference = Math.abs(newBearing - currentBearing)\n\n // Adjust newBearing to ensure the shortest direction\n if (difference > 180)\n return newBearing > 0 ? newBearing - 360 : newBearing + 360\n\n return newBearing // Return as is if the difference is within limits\n }\n","import { Extent } from \"maptalks\"\nimport { Map } from \"maptalks-gl\"\nimport { MapAnimationOptionsType, MapPaddingType, MapViewType } from \"maptalks/dist/map/Map\"\nimport bbox from \"@turf/bbox\"\nimport scale from \"@turf/transform-scale\"\nimport bboxPolygon from \"@turf/bbox-polygon\"\n\nexport interface CameraManagerOptions {\n defaultView?: MapViewType\n}\n\nexport class CameraManager {\n map: Map\n\n constructor(map: Map, options?: CameraManagerOptions) {\n this.map = map\n\n if (options?.defaultView) {\n this.setView(options?.defaultView)\n }\n }\n\n /** Public methods */\n getView = (): MapViewType => {\n return this.map.getView()\n }\n \n setView = (value: MapViewType) => {\n if (this.map && Object.keys(value).length !== 0) {\n this.map.setView(value)\n }\n }\n\n animateTo = (view: MapViewType, options: MapAnimationOptionsType = {}, step?: (frame: any) => void) => {\n this.map.animateTo(view, options, step)\n }\n\n setMaxExtent(extent: Extent) {\n return this.map.setMaxExtent(extent)\n }\n\n getFeatureExtent = (feature, scaleFactor = 1) => {\n const [minX, minY, maxX, maxY] = bbox(\n scale(bboxPolygon(bbox(feature)), scaleFactor)\n )\n return new Extent(minX, minY, maxX, maxY)\n }\n\n getExtentZoom = (\n extent: Extent,\n options: { isFraction?: boolean; padding?: MapPaddingType } = {\n isFraction: false,\n padding: {\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n },\n }\n ) => {\n const { isFraction = false, padding } = options\n return this.map.getFitZoom(extent, isFraction, padding)\n }\n\n set maxZoom(value: number) {\n this.map.setMaxZoom(value)\n const spatialReference = {\n projection: \"EPSG:3857\",\n resolutions: (function () {\n const resolutions = []\n const d = 2 * 6378137 * Math.PI\n for (let i = 0; i < value; i++) {\n resolutions[i] = d / (256 * Math.pow(2, i))\n }\n return resolutions\n })(),\n }\n this.map.setSpatialReference(spatialReference)\n }\n\n set minZoom(value: number) {\n this.map.setMinZoom(value)\n }\n\n}\n","import { feature, point, lineString, isObject } from \"@turf/helpers\";\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordEachCallback} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[featureIndex].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[geomIndex]\n : geometryMaybeCollection;\n\n // Handles null Geometry -- Skips this geometry\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n\n wrapShrink =\n excludeWrapCoord &&\n (geomType === \"Polygon\" || geomType === \"MultiPolygon\")\n ? 1\n : 0;\n\n switch (geomType) {\n case null:\n break;\n case \"Point\":\n if (\n callback(\n coords,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (\n callback(\n coords[j],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (\n callback(\n coords[j][k],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (\n callback(\n coords[j][k][l],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n geometryIndex++;\n }\n multiFeatureIndex++;\n }\n break;\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++)\n if (\n coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===\n false\n )\n return false;\n break;\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordReduceCallback} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(\n geojson,\n function (\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) {\n if (coordIndex === 0 && initialValue === undefined)\n previousValue = currentCoord;\n else\n previousValue = callback(\n previousValue,\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n },\n excludeWrapCoord\n );\n return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {propEachCallback} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n var i;\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n break;\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {propReduceCallback} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentProperties;\n else\n previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureEachCallback} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentFeature;\n else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry|GeometryObject|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomEachCallback} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[i].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n featureProperties = isFeatureCollection\n ? geojson.features[i].properties\n : isFeature\n ? geojson.properties\n : {};\n featureBBox = isFeatureCollection\n ? geojson.features[i].bbox\n : isFeature\n ? geojson.bbox\n : undefined;\n featureId = isFeatureCollection\n ? geojson.features[i].id\n : isFeature\n ? geojson.id\n : undefined;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[g]\n : geometryMaybeCollection;\n\n // Handle null Geometry\n if (geometry === null) {\n if (\n callback(\n null,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n continue;\n }\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\": {\n if (\n callback(\n geometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n break;\n }\n case \"GeometryCollection\": {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (\n callback(\n geometry.geometries[j],\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n }\n break;\n }\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n // Only increase `featureIndex` per each feature\n featureIndex++;\n }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomReduceCallback} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(\n geojson,\n function (\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentGeometry;\n else\n previousValue = callback(\n previousValue,\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenEachCallback} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (\n callback(\n feature(geometry, properties, { bbox: bbox, id: id }),\n featureIndex,\n 0\n ) === false\n )\n return false;\n return;\n }\n\n var geomType;\n\n // Callback for multi-geometry\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (\n var multiFeatureIndex = 0;\n multiFeatureIndex < geometry.coordinates.length;\n multiFeatureIndex++\n ) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate,\n };\n if (\n callback(feature(geom, properties), featureIndex, multiFeatureIndex) ===\n false\n )\n return false;\n }\n });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(\n geojson,\n function (currentFeature, featureIndex, multiFeatureIndex) {\n if (\n featureIndex === 0 &&\n multiFeatureIndex === 0 &&\n initialValue === undefined\n )\n previousValue = currentFeature;\n else\n previousValue = callback(\n previousValue,\n currentFeature,\n featureIndex,\n multiFeatureIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {AllGeoJSON} geojson any GeoJSON\n * @param {segmentEachCallback} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0;\n\n // Exclude null Geometries\n if (!feature.geometry) return;\n // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return;\n\n // Generate 2-vertex line segments\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (\n coordEach(\n feature,\n function (\n currentCoord,\n coordIndex,\n featureIndexCoord,\n multiPartIndexCoord,\n geometryIndex\n ) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (\n previousCoords === undefined ||\n featureIndex > previousFeatureIndex ||\n multiPartIndexCoord > previousMultiIndex ||\n geometryIndex > prevGeomIndex\n ) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n var currentSegment = lineString(\n [previousCoords, currentCoord],\n feature.properties\n );\n if (\n callback(\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) === false\n )\n return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }\n ) === false\n )\n return false;\n });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {segmentReduceCallback} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(\n geojson,\n function (\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) {\n if (started === false && initialValue === undefined)\n previousValue = currentSegment;\n else\n previousValue = callback(\n previousValue,\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n );\n started = true;\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {void}\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {lineEachCallback} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @returns {void}\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)\n return false;\n break;\n case \"Polygon\":\n for (\n var geometryIndex = 0;\n geometryIndex < coords.length;\n geometryIndex++\n ) {\n if (\n callback(\n lineString(coords[geometryIndex], feature.properties),\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n }\n break;\n }\n });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(\n geojson,\n function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentLine;\n else\n previousValue = callback(\n previousValue,\n currentLine,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature<LineString<[[10, 10], [50, 30]]>>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature<LineString<[[-10, -10], [-50, -30]]>>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature<LineString<[[-50, -30], [-30, -40]]>>\n */\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find SegmentIndex\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString(\n [coords[segmentIndex], coords[segmentIndex + 1]],\n properties,\n options\n );\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[geometryIndex][segmentIndex],\n coords[geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][segmentIndex],\n coords[multiFeatureIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex =\n coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][geometryIndex][segmentIndex],\n coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature<Point<[10, 10]>>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature<Point<[-10, -10]>>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature<Point<[-30, -40]>>\n */\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find Coord Index\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n case \"MultiPoint\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0)\n coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0)\n coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0)\n coordIndex =\n coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(\n coords[multiFeatureIndex][geometryIndex][coordIndex],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\nexport {\n coordReduce,\n coordEach,\n propEach,\n propReduce,\n featureReduce,\n featureEach,\n coordAll,\n geomReduce,\n geomEach,\n flattenReduce,\n flattenEach,\n segmentReduce,\n segmentEach,\n lineReduce,\n lineEach,\n findSegment,\n findPoint,\n};\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","import * as maptalks from \"maptalks-gl\"\nimport { min, compact, isFunction } from \"lodash-es\"\nimport { center as turfCenter } from \"@turf/center\"\nimport { polygon } from \"@turf/helpers\"\nimport { Position } from \"geojson\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport * as THREE from \"three\"\n\nimport type { HighlightElementOptions, IHighlightController, MapElement, RendererManagerOptions } from \"./types\"\nimport { Element3DRenderer } from \"./3d/Element3DRenderer\"\nimport { Element2DRenderer } from \"./2d/Element2DRenderer\"\nimport { Marker2DRenderer } from \"./2d/Marker2DRenderer\"\nimport { AnyMarkerOptions, Marker3DRenderer } from \"./3d/Marker3DRenderer\"\n\nimport {\n KioskFeaturePopulated,\n OpeningFeature,\n OpeningFeaturePopulated,\n UnitFeaturePopulated,\n VenueDataClient,\n} from \"../../data\"\nimport { angleBetweenLineStrings } from \"./utils/angleBetweenLineString\"\nimport { findUnitOnPoint } from \"./utils/findUnitOnPoint\"\n\nfunction delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport class RendererManager extends EventTarget {\n map: maptalks.Map\n\n options: RendererManagerOptions\n\n // Client for fetching data\n #dataClient: VenueDataClient\n\n #isClicked = false\n #onClickElement = (e) => {}\n\n /** Elements: Responsible for converting feature info elements and add to map */\n private elementRenderer: Element2DRenderer | Element3DRenderer\n private markerRenderer: Marker2DRenderer | Marker3DRenderer\n\n private elementsMap: Map<string, MapElement>\n private elementsByOrdinal: Map<\n number,\n Array<MapElement>\n >\n\n private currentOrdinals: number | number[] | null\n\n private markersMap: Map<string, maptalks.ui.UIMarker | BaseObject>\n private markersByOrdinal: Map<\n number,\n Array<maptalks.ui.UIMarker> | Array<BaseObject>\n >\n\n private highlightControllers: IHighlightController[] = []\n\n constructor(map: maptalks.Map, dataClient: VenueDataClient, options: RendererManagerOptions) {\n super()\n this.map = map\n this.options = options\n this.elementsMap = new Map()\n this.elementsByOrdinal = new Map()\n\n this.markersMap = new Map()\n this.markersByOrdinal = new Map()\n\n this.#dataClient = dataClient\n \n const _this = this\n\n if (options.type === \"3D\") {\n const groupLayer = this.map.getLayer('group') as maptalks.GroupGLLayer\n const threeLayer = groupLayer.getLayer('three') as ThreeLayer\n\n threeLayer.prepareToDraw = function (gl, scene, camera) {\n \n function findBadMeshes(scene: THREE.Scene) {\n const bad: Array<{ mesh: THREE.Mesh; index: number; value: number }> = [];\n\n scene.traverse((obj: any) => {\n if (!obj?.isMesh) return;\n const geom = obj.geometry as THREE.BufferGeometry | undefined;\n const pos = geom?.attributes?.position?.array as Float32Array | undefined;\n if (!pos || pos.length === 0) return;\n\n for (let i = 0; i < pos.length; i++) {\n const v = pos[i];\n if (!Number.isFinite(v)) {\n bad.push({ mesh: obj, index: i, value: v });\n break;\n }\n }\n });\n\n if (bad.length) {\n console.group(`❌ Found ${bad.length} meshes with invalid positions`);\n for (const b of bad) {\n console.log({\n name: b.mesh.name,\n userData: b.mesh.userData,\n uuid: b.mesh.uuid,\n badIndex: b.index,\n badValue: b.value,\n });\n }\n console.groupEnd();\n } else {\n console.log(\"✅ No invalid meshes found\");\n }\n\n return bad;\n }\n\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.3)\n scene.add(ambientLight)\n \n const dirColor = 0xffffff\n const dllight = new THREE.DirectionalLight(dirColor, 0.8)\n dllight.position.set(0, -10, 20).normalize()\n scene.add(dllight)\n \n // nice optional fill\n const hemi = new THREE.HemisphereLight(0xffffff, 0x444444, 0.4)\n scene.add(hemi)\n\n // Element renderer creates and owns the ThreeLayer\n _this.elementRenderer = new Element3DRenderer(map, options.elements)\n\n // Get the ThreeLayer from element renderer to share with marker renderer\n _this.markerRenderer = new Marker3DRenderer(map, {}, threeLayer)\n\n if (typeof options.onRendererReady === 'function') {\n options.onRendererReady()\n }\n\n _this.#createElements()\n\n setTimeout(() => {\n findBadMeshes(scene)\n }, 3000)\n }\n \n } else {\n // 2D doesn't need shared layer\n this.elementRenderer = new Element2DRenderer(map, options.elements)\n this.markerRenderer = new Marker2DRenderer(map)\n\n this.#createElements()\n }\n }\n\n set onClickElement(func) {\n this.#onClickElement = func\n }\n\n handleClickElement = (e) => {\n if (this.#isClicked) return\n this.#isClicked = true\n const onClickElement = this.#onClickElement\n if (!isFunction(onClickElement)) return\n this.#onClickElement(e)\n this.#isClicked = false\n }\n\n getElementsByOrdinal = (ordinal: number) => {\n const exist = this.elementsByOrdinal.get(ordinal)\n if (!exist) this.elementsByOrdinal.set(ordinal, [])\n return this.elementsByOrdinal.get(ordinal)\n }\n\n addElementsToManager = (id, elements, ordinal) => {\n // console.log(`addElementsToManager`, { id, elements })\n this.elementsMap.set(id, elements)\n elements.forEach((el) => {\n el.on('click', e => this.handleClickElement(id))\n this.getElementsByOrdinal(ordinal).push(el)\n })\n\n const inOrdinal = Array.isArray(this.currentOrdinals) ? this.currentOrdinals.includes(ordinal) : ordinal === this.currentOrdinals\n if (inOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal)\n } else {\n this.elementRenderer.hideElements(elements as any, ordinal)\n }\n }\n\n async #createElements() {\n\n // Add some delay to mitigate react re-renders multiple times\n await delay(this.options.delayBeforeCreateElements ?? 0)\n\n /** Levels */\n const levels = await this.#dataClient.filterByType(\"level\", {\n populate: true,\n })\n\n const openings = await this.#dataClient.filterByType(\"opening\", {\n populate: true,\n })\n\n const relationships = await this.#dataClient.filterByType('relationship')\n /** Fixtures */\n const fixtures = (await this.#dataClient.filterByType(\"fixture\", { populate: true }))\n fixtures\n .forEach((fixture) => {\n const element = this.elementRenderer.createGeometry(fixture)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(fixture.id, _elements, fixture.properties.level.properties.ordinal)\n }\n })\n\n /** Units */\n const units = (await this.#dataClient.filterByType<\"unit\">(\"unit\", {\n populate: true,\n })) as UnitFeaturePopulated[]\n\n units\n .filter(\n (u) => ![\"opentobelow\", \"escalator\", \"room\"].includes(u.properties.category)\n )\n .forEach((unit) => {\n const element = this.elementRenderer.createGeometry(unit)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(unit.id, _elements, unit.properties.level.properties.ordinal)\n }\n })\n\n units\n .filter(u => u.properties.category === \"room\")\n .forEach(unit => {\n const openingRelationships = relationships.filter(r => r.properties.origin?.id === unit.id || r.properties.destination?.id === unit.id)\n const roomOpenings = compact(openingRelationships.map(rel => {\n const openingId = rel?.properties.intermediary[0].id\n return openings.find(o => o.id === openingId)\n })) as OpeningFeature[]\n \n const innerElements = this.elementRenderer.createGeometry(unit)\n const wallElements = this.elementRenderer.createRoomWall(unit, roomOpenings)\n if (innerElements || wallElements) {\n const _innerElements = Array.isArray(innerElements) ? innerElements : [innerElements]\n const _wallElements = Array.isArray(wallElements) ? wallElements : [wallElements]\n const _elements = [..._innerElements, ..._wallElements]\n const ordinal = unit.properties.level.properties.ordinal\n this.addElementsToManager(unit.id, _elements, ordinal)\n }\n\n })\n\n /** Kiosks */\n const kiosks = (await this.#dataClient.filterByType<\"kiosk\">(\"kiosk\", {\n populate: true,\n })) as KioskFeaturePopulated[]\n kiosks.forEach((kiosk) => {\n const element = this.elementRenderer.createGeometry(kiosk)\n if (element) {\n const _elements = Array.isArray(element) ? element : [element]\n this.addElementsToManager(kiosk.id, _elements, kiosk.properties.level.properties.ordinal)\n }\n })\n\n /**\n * Escalators\n */\n const escalators = units.filter(u => u.properties.category === 'escalator')\n for (const escalator of escalators) {\n try {\n const escalatorRelationships = relationships.filter(r => (r.properties?.intermediary || []).some(inter => inter.id === escalator.id))\n if (escalatorRelationships.length === 0) {\n throw new Error('Cannot find escalator relationship')\n }\n if (escalatorRelationships.length > 1) {\n throw new Error('Found more than one relationship')\n }\n const thisOrdinal = escalator.properties.ordinal\n const relationship = escalatorRelationships[0]\n if (!relationship.properties.origin?.id) throw new Error(`relationship (id=${relationship.id}) - origin not exists`)\n if (!relationship.properties.destination?.id) throw new Error(`relationship (id=${relationship.id}) - destination not exists`)\n\n const bothOpeningIds = [relationship.properties.origin.id, relationship.properties.destination.id]\n const bothOpenings = await Promise.all(\n bothOpeningIds.map(id => this.#dataClient.findById('opening', id, { populate: true }))\n ) as OpeningFeaturePopulated[]\n const thisLevelOpening = bothOpenings.find(opening => opening.properties.ordinal === thisOrdinal)\n const thatLevelOpening = bothOpenings.find(opening => opening.properties.ordinal !== thisOrdinal)\n const angle = 180 * (1 / Math.PI) * angleBetweenLineStrings(thisLevelOpening.geometry.coordinates, thatLevelOpening.geometry.coordinates)\n const direction = thisOrdinal < thatLevelOpening.properties.ordinal ? 'up' : 'down'\n const escalatorEntryPoint = turfCenter(thisLevelOpening).geometry.coordinates\n const element = await this.elementRenderer.createEscalator(escalator, escalatorEntryPoint, { direction, angle })\n if (element) {\n const _elements = (Array.isArray(element)) ? element : [element]\n this.addElementsToManager(escalator.id, _elements, escalator.properties.ordinal)\n }\n } catch (err) {\n console.warn(`cannot create escalator`, err.message)\n }\n }\n\n /** \n * Ground Label \n */\n const groundLabels = await this.#dataClient.filterByType(\"label\")\n for (const label of groundLabels) {\n const center = turfCenter(polygon(label.geometry.coordinates)).geometry.coordinates\n const unit = findUnitOnPoint(units, center) \n const element = this.elementRenderer.createGroundLabel(label, unit)\n if (element) {\n const _elements = (Array.isArray(element)) ? element : [element]\n this.addElementsToManager(label.id, _elements, label.properties.ordinal)\n }\n }\n \n if (this.options.type === \"3D\") {\n const model3ds = await this.#dataClient.filterByType(\"model3d\")\n for (const model3d of model3ds) {\n (this.elementRenderer as Element3DRenderer).createModel3d(model3d)\n }\n }\n // const buildingElement = await this.elementRenderer.createBuilding([100.51015958563418, 13.72669948541647], 0)\n // if (buildingElement) {\n // const _elements = (Array.isArray(buildingElement)) ? buildingElement : [buildingElement]\n // this.addElementsToManager('venue', _elements, 0)\n // }\n\n // Call changeLevelByOrdinal again to show/hide elements\n this.changeLevelByOrdinal(this.currentOrdinals)\n\n this.dispatchEvent(new CustomEvent('renderermanager:elements_created'))\n\n }\n\n changeLevelByOrdinal(targetOrdinal: null | number | number[]): void {\n // if targetOrdinal = null, show all\n this.currentOrdinals = targetOrdinal\n\n if (targetOrdinal === null) {\n const baseOrdinal = 0\n for (const [ordinal, elements] of this.elementsByOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal - baseOrdinal)\n }\n\n for (const [ordinal, markers] of this.markersByOrdinal) {\n this.markerRenderer.showMarkers(markers as any, ordinal - baseOrdinal)\n }\n } else {\n // if targetOrdinal = number | number[], show target levels\n const baseOrdinal = Array.isArray(targetOrdinal) ? min(targetOrdinal) : targetOrdinal\n\n for (const [ordinal, elements] of this.elementsByOrdinal) {\n const inOrdinal = Array.isArray(targetOrdinal) ? targetOrdinal.includes(ordinal) : ordinal === targetOrdinal\n if (inOrdinal) {\n this.elementRenderer.showElements(elements as any, ordinal - baseOrdinal)\n } else {\n this.elementRenderer.hideElements(elements as any, ordinal - baseOrdinal)\n }\n }\n\n for (const [ordinal, markers] of this.markersByOrdinal) {\n const inOrdinal = Array.isArray(targetOrdinal) ? targetOrdinal.includes(ordinal) : ordinal === targetOrdinal\n if (inOrdinal) {\n this.markerRenderer.showMarkers(markers as any, ordinal - baseOrdinal)\n } else {\n this.markerRenderer.hideMarkers(markers as any, ordinal - baseOrdinal)\n }\n }\n }\n }\n\n highlightElements = (elemIds: string[], options?: HighlightElementOptions) => {\n const { reset = true } = options ?? {};\n\n if (reset) {\n this.clearHighlightElements()\n }\n\n const elements = elemIds.map(id => this.elementsMap.get(id)).flat()\n\n elements.forEach(element => {\n const controller: IHighlightController = this.elementRenderer.createHighlightController(element) \n if (controller && isFunction(controller.start)) {\n controller.start()\n this.highlightControllers.push(controller)\n }\n })\n }\n\n clearHighlightElements = () => {\n this.highlightControllers.forEach((controller) => {\n if (isFunction(controller?.clear)) controller.clear()\n })\n }\n\n /** \n * ========================================================================\n * Markers\n * ======================================================================== */\n _getMarkersByOrdinal = (ordinal: number) => {\n const exist = this.markersByOrdinal.get(ordinal)\n if (!exist) this.markersByOrdinal.set(ordinal, [])\n return this.markersByOrdinal.get(ordinal)\n }\n\n _addMarkersToManager = (id, markers, ordinal) => {\n this.markersMap.set(id, markers)\n markers.forEach((el) => {\n this._getMarkersByOrdinal(ordinal).push(el)\n })\n\n const inOrdinal = Array.isArray(this.currentOrdinals) ? this.currentOrdinals.includes(ordinal) : ordinal === this.currentOrdinals\n if (inOrdinal) {\n this.markerRenderer.showMarkers(markers, ordinal)\n } else {\n this.markerRenderer.hideMarkers(markers, ordinal)\n }\n }\n\n createMarker(coordinate: Position, ordinal: number, text: string, options: AnyMarkerOptions) {\n const marker = this.markerRenderer.createMarker(coordinate, ordinal, text, options)\n const markerId = `${this.markersMap.size + 1}`\n this._addMarkersToManager(markerId, [marker], ordinal)\n }\n\n clearMarkers() {\n for (const [markerId, marker] of this.markersMap) {\n this.markerRenderer.removeMarker(marker as any)\n }\n }\n\n \n}\n","import * as maptalks from \"maptalks-gl\"\nimport { GeoJSONLineStringFeature, GeoJSONMultiPolygonFeature, GeoJSONPolygonFeature } from \"maptalks.three/dist/type\"\nimport * as THREE from \"three\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Feature, LineString, Polygon, Position } from \"geojson\"\nimport turfBuffer from \"@turf/buffer\"\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { point, multiPoint, polygon } from \"@turf/helpers\"\nimport { polygonToLine } from \"@turf/polygon-to-line\"\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { length } from \"@turf/length\"\nimport { along } from \"@turf/along\";\nimport { pointToLineDistance } from \"@turf/point-to-line-distance\";\nimport { ImdfFeature, LabelFeature, Model3dFeature, OpeningFeature, UnitFeature } from \"../../../data\"\nimport {\n Element3DRendererOptions,\n IElementRenderer,\n IHighlightController,\n MapElement,\n} from \"../types\"\nimport { GroundLabel, GroundLabelOptions } from \"./objects/GroundLabel\"\nimport { get3DRendererOption } from \"./utils/get3DRendererOption\"\nimport lineSplit from \"@turf/line-split\"\n\nexport const HEIGHT_METER = 4\nexport const MULTIORDINAL_HEIGHT_METER = 9\nexport const WALKWAY_HEIGHT = 0.5\n\nexport class Element3DRenderer\n extends EventTarget\n implements IElementRenderer\n{\n private options: Element3DRendererOptions\n private map: maptalks.Map\n private gltfLayer: maptalks.GLTFLayer\n public threeLayer: ThreeLayer\n public scene: THREE.Scene\n private lineMaterial: THREE.LineBasicMaterial\n private materialByColorMap: Map<string, THREE.Material>\n\n // Renderer is Ready\n public isReady: boolean = false\n\n constructor(map: maptalks.Map, options: Element3DRendererOptions) {\n super()\n\n this.options = options\n this.map = map\n const groupLayer = this.map.getLayer('group') as maptalks.GroupGLLayer\n this.threeLayer = groupLayer.getLayer('three') as ThreeLayer\n this.gltfLayer = groupLayer.getLayer('gltf') as maptalks.GLTFLayer\n\n this.lineMaterial = new THREE.LineBasicMaterial({ color: \"#000\" })\n \n this.render()\n }\n\n animation() {\n // layer animation support Skipping frames\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n this.threeLayer.redraw()\n }\n requestAnimationFrame(this.animation)\n }\n\n /** Materials */\n getOrCreateMaterialByColor(color) {\n if (!this.materialByColorMap) this.materialByColorMap = new Map()\n\n const existingMaterial = this.materialByColorMap.get(color)\n if (existingMaterial) return existingMaterial\n\n const created = new THREE.MeshLambertMaterial({ color, transparent: true })\n created.toneMapped = false\n this.materialByColorMap.set(color, created)\n return created\n }\n\n createGeometry = (feature: ImdfFeature): MapElement | MapElement[] => {\n const {\n offset = 0,\n height: heightOptions,\n bottomHeight: bottomHeightOptions,\n color: colorOptions,\n ...options\n } = get3DRendererOption(feature.feature_type, feature.properties.category, this.options)\n\n const _this = this\n\n /** Internal createPolygon function */\n const createPolygon = (geometry: Polygon, feature: GeoJSONPolygonFeature|GeoJSONMultiPolygonFeature) => {\n try {\n const [outerRing, ...innerRings] = geometry.coordinates\n const offsetFeature =\n offset !== 0\n ? turfBuffer(geometry, offset, { units: \"meters\" }) as GeoJSONPolygonFeature\n : feature\n const color =\n feature.properties.style.polygonFill ?? colorOptions ?? \"#ffffff\"\n if (color === \"transparent\") return\n const material = this.getOrCreateMaterialByColor(color)\n const altitude = 0\n const height = feature.properties.height ?? heightOptions ?? HEIGHT_METER\n const bottomHeight = feature.properties.bottomHeight ?? bottomHeightOptions ?? 0\n const extrudedPolygon = this.threeLayer.toExtrudePolygon(\n offsetFeature,\n { asynchronous: true, ...options, height, bottomHeight, altitude },\n material\n )\n\n // Create extra lines for visual clarity\n const topLineStrings = [\n new maptalks.LineString(outerRing),\n ...innerRings.map(innerRing => new maptalks.LineString(innerRing))\n ]\n const topLines = this.threeLayer.toLines(\n topLineStrings,\n { altitude, bottomHeight: bottomHeight + height + 0.001, interactive: false },\n this.lineMaterial\n )\n\n const bottomLineStrings = [\n new maptalks.LineString(outerRing),\n ...innerRings.map(innerRing => new maptalks.LineString(innerRing))\n ]\n const bottomLines = this.threeLayer.toLines(\n bottomLineStrings,\n { altitude: altitude, bottomHeight, interactive: false },\n this.lineMaterial\n )\n return [extrudedPolygon, topLines, bottomLines]\n } catch (err) {\n return []\n }\n }\n\n const createLineString = (geometry: LineString, feature: GeoJSONLineStringFeature) => {\n try {\n const color =\n feature.properties.style.polygonFill ?? colorOptions ?? \"#000000\"\n const material = this.getOrCreateMaterialByColor(color)\n const extrudedLine = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(geometry.coordinates),\n { height: heightOptions, ...options },\n material\n )\n return [extrudedLine]\n } catch (err) {\n return []\n }\n }\n\n try {\n switch (feature.geometry.type) {\n case \"MultiPolygon\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const multiMeshes = coordinates.flatMap(polygonCoordinates => {\n const meshes = createPolygon({ type: 'Polygon', coordinates: polygonCoordinates }, feature as GeoJSONMultiPolygonFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n })\n return multiMeshes\n }\n case \"Polygon\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const meshes = createPolygon(feature.geometry, feature as GeoJSONPolygonFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n }\n\n case \"LineString\": {\n const { coordinates } = feature.geometry\n if (!coordinates) return []\n\n const meshes = createLineString(feature.geometry, feature as GeoJSONLineStringFeature)\n this.threeLayer.addMesh(meshes)\n return meshes\n }\n }\n } catch (err) {\n console.log(`error createGeometry`, err, { feature, options })\n }\n }\n\n createRoomWall(unit: UnitFeature, openings: OpeningFeature[] = []): MapElement | MapElement[] | null {\n\n const polygons = unit.geometry.type === 'Polygon' ? [unit.geometry.coordinates] : unit.geometry.coordinates\n return polygons.map(plg => {\n return plg.map(ring => {\n const roomWall = cleanCoords(polygonToLine(polygon([ring]))) as Feature<LineString>\n if (openings.length === 0) {\n const color = \"#ababab\"\n const material = this.getOrCreateMaterialByColor(color)\n const extrudedWall = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(roomWall.geometry.coordinates),\n { height: 4, width: 1 },\n material\n )\n return extrudedWall\n }\n \n // Split ring with each opening\n let openingPoints = []\n openings.forEach(opening => {\n const doorCoords = opening?.geometry?.coordinates;\n \n const p0 = point(doorCoords[0]);\n const p1 = point(doorCoords[doorCoords.length - 1]);\n\n // 3) snap door endpoints to boundary\n const s0 = nearestPointOnLine(roomWall, p0, { units: \"meters\" });\n const s1 = nearestPointOnLine(roomWall, p1, { units: \"meters\" });\n\n // Optional sanity check: ensure the door is actually on the boundary (within tolerance)\n const d0 = s0.properties.dist as number;\n const d1 = s1.properties.dist as number;\n if (d0 > 1 || d1 > 1) {\n // Door endpoints are not on (or near) the roomWall. Increase tolerance or fix input.\");\n } else {\n openingPoints = openingPoints.concat([s0.geometry.coordinates, s1.geometry.coordinates])\n }\n })\n \n try {\n const split = lineSplit(roomWall, multiPoint(openingPoints))\n /** \n * Remove the segment that corresponds to the door:\n * use midpoint distance-to-door test (robust for angled doors)\n */\n \n const wallsOnly = split.features.filter((seg) => {\n const mid = along(seg, length(seg, { units: \"meters\" }) / 2, { units: \"meters\" });\n for (const opening of openings) {\n const dist = pointToLineDistance(mid, opening, { units: \"meters\" });\n if (dist < 0.05) return false\n }\n return true\n });\n\n const wallMeshes = wallsOnly.map((feature, i) => {\n const color = \"#ababab\"\n const material = this.getOrCreateMaterialByColor(color)\n \n const extrudedLine = this.threeLayer.toExtrudeLine(\n new maptalks.LineString(feature.geometry.coordinates),\n { height: 3, width: 0.4, id: unit.id },\n material\n )\n extrudedLine.getObject3d().userData = {\n unitId: unit.id,\n coords: feature.geometry.coordinates, \n }\n return extrudedLine\n }).flat()\n\n this.threeLayer.addMesh(wallMeshes)\n return wallMeshes\n } catch (e) {\n console.log(e.message, { unit, roomWall })\n return []\n }\n }).flat()\n }).flat()\n }\n\n async createEscalator(\n f: ImdfFeature,\n coordinate: Position,\n options: { angle: number; direction: 'up' | 'down' },\n ): Promise<MapElement | MapElement[] | null> {\n\n const model = {\n url: 'https://cdn.venue.in.th/static/glb/escalator.glb',\n size: 4.4, \n }\n \n const { direction: dir, angle } = options;\n const rotationZ = (dir === \"up\") ? (180 + angle) : angle\n var escalatorMarker = new maptalks.GLTFMarker(coordinate, {\n symbol: {\n url: model.url,\n rotationZ,\n translationX: dir === \"up\" ? 0 : model.size * Math.cos(Math.PI * rotationZ / 180),\n translationY: dir === \"up\" ? 0 : model.size * Math.sin(Math.PI * rotationZ / 180),\n translationZ: dir === \"up\" ? -0.05 * model.size : -0.5 * model.size,\n },\n });\n\n escalatorMarker.addTo(this.gltfLayer);\n return escalatorMarker\n }\n\n // Note: Move to another renderer and keep this file on Geometry only?\n createGroundLabel(f: LabelFeature, unit: UnitFeature): MapElement | MapElement[] | null {\n const text = f.properties.name\n const bound = f.geometry.coordinates[0]\n\n const { height: unitHeight } = get3DRendererOption('unit', unit.properties.category, this.options)\n const options: GroundLabelOptions = { bottomHeight: unitHeight + 0.005 }\n\n const groundLabel = new GroundLabel(bound, text, options, this.threeLayer)\n this.threeLayer.addMesh(groundLabel)\n return groundLabel\n }\n\n async createModel3d(f: Model3dFeature): Promise<MapElement | MapElement[] | null> {\n const marker = new maptalks.GLTFMarker(f.properties.center, {\n symbol: {\n url: f.properties.model,\n },\n });\n\n marker.addTo(this.gltfLayer);\n return marker\n }\n\n async createBuilding(coordinate: Position, ordinal: number): Promise<MapElement | MapElement[] | null> {\n // const marker = new maptalks.GLTFMarker(coordinate, {\n // symbol: {\n // url: 'https://cdn.venue.in.th/static/glb/iconsiam.glb',\n // rotationZ: 4,\n // translationY: -10,\n // scaleX: 49,\n // scaleY: 49,\n // scaleZ: 49,\n // },\n // });\n // marker.on(\"zoom\", (e) => {\n // console.log(`zoom`, e)\n // })\n // marker.addTo(this.gltfLayer);\n // return marker\n return Promise.resolve(null)\n }\n \n createElement(f: ImdfFeature): MapElement[] | null {\n switch (f.feature_type) {\n default:\n return null\n }\n }\n\n showElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n\n hideElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n try { \n element.hide()\n } catch (err) {\n console.log(`cannot hide`, err, element)\n }\n })\n }\n\n createHighlightController(element: MapElement): IHighlightController {\n if (!(element instanceof BaseObject)) {\n return null; // not my responsibility\n }\n switch (element.type) {\n case 'ExtrudePolygon':\n case 'ExtrudeLine': {\n const mesh = element.getObject3d() as THREE.Mesh\n const originalMaterial = mesh.material;\n const highlightMaterial = this.getOrCreateMaterialByColor('#ff0000');\n\n return {\n start: () => {\n mesh.material = highlightMaterial;\n },\n clear: () => {\n mesh.material = originalMaterial;\n },\n };\n }\n\n default: {\n return {\n start() {},\n clear() {}\n }\n }\n }\n \n }\n\n render() {\n this.threeLayer._needsUpdate = !this.threeLayer._needsUpdate\n if (this.threeLayer._needsUpdate) {\n // @ts-ignore\n this.threeLayer.redraw()\n }\n\n // this.#animationsToRun.forEach(({ callback }) => callback(this))\n\n //update TWEEN.js animaton\n // TWEEN.update()\n\n requestAnimationFrame(this.render.bind(this))\n }\n}\n\n\n/**\n * Legacy threejs way\n * async loadModel3d(model3d: LoadModel3dParameters) {\n const loader = new GLTFLoader()\n loader.setDRACOLoader(this.dracoLoader)\n\n const { url, properties: modelProperties } = model3d\n const gltf = await loader.loadAsync(url)\n \n const model = gltf.scene\n // จัดขนาด + scale ที่เหมาะสม\n model.rotation.x = modelProperties.rotation.x\n model.rotation.y = modelProperties.rotation.y\n\n model.position.x = modelProperties.position.x\n model.position.y = modelProperties.position.y\n model.position.z = modelProperties.position.z\n \n const scale = modelProperties.scale\n model.scale.set(scale, scale, scale)\n return model\n }\n\n * const model = await this.loadModel3d({\n url: 'https://dashboard.situm.com/uploads/3dmodels/demoaccount/new_escalator.glb',\n properties: {\n rotation: {\n x: 0.5 * Math.PI, // Rotate the model up (new_escalator.glb)\n y: 0,\n z: 0,\n },\n position: { x: 0, y: 0, z: 0 },\n scale: 0.01,\n },\n });\n\n // map heading\n model.rotation.y += (dir === \"up\") ? Math.PI + angle : angle;\n\n const box = new THREE.Box3().setFromObject(model);\n const pivotPoint =\n dir === 'up'\n ? new THREE.Vector3(0, 0, 0)\n : new THREE.Vector3(\n 1 * (box.min.x + box.max.x),\n 1 * (box.min.y + box.max.y),\n 0.60 * box.max.z,\n );\n\n const pivot = new THREE.Group();\n pivot.add(model);\n\n model.position.sub(pivotPoint);\n model.updateMatrixWorld(true);\n\n const altitude = f.properties.ordinal * HEIGHT_METER;\n\n const baseObjectModel = this.threeLayer.toModel(pivot, {\n coordinate,\n altitude,\n });\n\n this.threeLayer.addMesh(baseObjectModel);\n return baseObjectModel;\n */","import * as maptalks from \"maptalks-gl\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport {\n Texture,\n Mesh,\n MeshPhongMaterial,\n PlaneGeometry,\n Material,\n} from \"three\"\nimport { largestRect } from \"d3plus-shape\"\nimport { max, merge, isNumber, isArray, range } from \"lodash-es\"\nimport { Position } from \"geojson\"\n\nexport type GroundLabelOptions = {\n bottomHeight?: number\n altitude?: number\n fontSize?: number\n fontWeight?: number\n fillStyle?: string\n textAlign?: string\n fontFamily?: string\n textBaseline?: string\n strokeStyle?: string\n lineWidth?: number\n lineHeight?: number\n margin?: number\n angle?: number[]\n scaleMin?: number\n scaleStep?: number\n maxFontScale?: number\n offsetX?: number\n offsetY?: number\n}\n\nconst OPTIONS = {\n // Allowing click through and prevent interaction\n interactive: false,\n altitude: 0,\n}\n\nconst defaultFlatLabelOptions: GroundLabelOptions = {\n fontSize: 14,\n fontFamily: \"Manrope\",\n fontWeight: 600,\n margin: 0,\n scaleMin: 0.5,\n lineHeight: 1.05,\n scaleStep: 0.05,\n textAlign: \"center\",\n textBaseline: \"middle\",\n fillStyle: \"#000\",\n}\n\nconst defaultRectAngleToCalc = range(-90, 92, 2)\n\nexport const getMaterial = (text, flatLabelOptions) => {\n const options = merge({}, defaultFlatLabelOptions, flatLabelOptions)\n\n const {\n fontSize: initialFontSize,\n fontFamily,\n fontWeight,\n margin,\n scaleMin,\n scaleStep,\n fillStyle,\n lineHeight,\n textAlign,\n strokeStyle,\n lineWidth,\n textBaseline,\n } = options\n\n const pixelMultiplier = 4\n const SIZE = 100 * pixelMultiplier\n const fontSize = initialFontSize * (pixelMultiplier * 1.25)\n const canvas = document.createElement(\"canvas\")\n canvas.width = canvas.height = SIZE\n const ctx = canvas.getContext(\"2d\")\n\n ctx.font = `${fontWeight} ${fontSize}px \"${fontFamily}\", Arial`\n ctx.textAlign = textAlign\n ctx.textBaseline = textBaseline\n ctx.fillStyle = fillStyle\n ctx.strokeStyle = strokeStyle\n ctx.lineWidth = lineWidth\n\n // Function to wrap text automatically\n const wrapText = (ctx, text, maxWidth) => {\n const words = text.trim().split(/\\s+/)\n if (words.length <= 1) return [text]\n\n const lines = []\n const MAX_LINES = 3\n let currentLine = words[0]\n\n for (let i = 1; i < words.length; i++) {\n const lineToMeasure = currentLine + \" \" + words[i]\n if (ctx.measureText(lineToMeasure).width > maxWidth) {\n lines.push(currentLine)\n currentLine = words[i]\n } else {\n currentLine = lineToMeasure\n }\n }\n lines.push(currentLine)\n return lines.slice(0, MAX_LINES) // Limit to 3 lines\n }\n\n /** Check if text contains manual line breaks */\n const hasManualBreaks = text.includes(\"\\n\")\n let texts\n\n if (hasManualBreaks) {\n // Use manual line breaks\n texts = text.split(/\\n/g)\n } else {\n // Auto-wrap text\n const maxWidth = SIZE - 2 * margin\n texts = wrapText(ctx, text, maxWidth)\n }\n\n /** Automatically recalculate font size to fit the bound */\n let textWidth: number = max(texts.map((text) => ctx.measureText(text).width))\n let scale = 1\n while (scale > 0 && textWidth + 2 * margin > SIZE) {\n scale -= scaleStep\n ctx.font = `${fontWeight} ${scale * fontSize}px \"${fontFamily}\", Arial`\n textWidth = max(texts.map((text) => ctx.measureText(text).width))\n }\n\n // If the text is larger than scaleMin, then render it\n const center = { x: 0.5 * SIZE, y: 0.5 * SIZE }\n\n if (scale > scaleMin) {\n const totalHeight = texts.length * (fontSize * scale * lineHeight)\n const startY =\n center.y - totalHeight / 2 + fontSize * scale * lineHeight * 0.5 // Adjust startY when offset multi text line\n\n texts.forEach((text, index) => {\n const yOffset = startY + index * (fontSize * scale * lineHeight)\n if (strokeStyle && lineWidth) {\n ctx.strokeText(text, center.x, yOffset) // Draw outlined text\n }\n ctx.fillText(text, center.x, yOffset)\n })\n }\n\n const texture = new Texture(canvas)\n texture.needsUpdate = true\n\n const material = new MeshPhongMaterial({\n map: texture,\n transparent: true,\n // @ref: https://threejs.org/docs/#api/en/materials/Material.alphaTest\n alphaTest: 0.3,\n })\n return material\n}\n\nexport class GroundLabel extends BaseObject {\n\n declare options: GroundLabelOptions;\n \n #angle = 0\n #bearing = 0\n #text = \"\"\n #offsetX = 0\n #offsetY = 0\n #originalPosition = null\n #layer: ThreeLayer = null\n\n constructor(bound: Position[], text: string, options: GroundLabelOptions, layer: ThreeLayer) {\n\n options = maptalks.Util.extend({}, OPTIONS, options, {\n layer,\n coordinate: bound,\n })\n\n const {\n altitude = 0,\n bottomHeight = 0,\n fontSize,\n fillStyle,\n textAlign,\n fontFamily,\n textBaseline,\n strokeStyle,\n lineWidth,\n angle = defaultRectAngleToCalc,\n maxFontScale,\n offsetX = 0,\n offsetY = 0,\n ...properties\n } = options\n\n super()\n this._initOptions(options)\n this.properties = properties\n\n this.#offsetX = offsetX\n this.#offsetY = offsetY\n this.#layer = layer\n\n const material = getMaterial(text, {\n fillStyle,\n fontSize,\n textAlign,\n textBaseline,\n fontFamily,\n strokeStyle,\n lineWidth,\n })\n\n // Convert angle to array if it's a single number\n const rectAngles = isArray(angle) ? angle : [angle]\n\n material.needsUpdate = true\n\n const rect = largestRect(bound, {\n cache: true,\n /**\n * Black magic here:\n * For some reason if we allow angle -90 or 90, some polygon will use that angle even if it's wrong angle to use.\n * So we remove -90 and 90 from choices, and use -85 & 85 instead.\n */\n angle: rectAngles,\n })\n\n const { cx, cy, width, angle: calculatedAngle } = rect\n this.#text = text\n this.#angle = calculatedAngle // Always use calculated angle from largestRect\n\n const geometry = new PlaneGeometry(1, 1)\n this._createMesh(geometry, material)\n\n // set object3d position\n const z = layer.altitudeToVector3(altitude + bottomHeight, altitude + bottomHeight).x\n const basePosition = layer.coordinateToVector3([cx, cy], z)\n\n this.#originalPosition = basePosition.clone()\n const finalPosition = this.#calculateFinalPosition(basePosition)\n\n const scale = width / 0.0006456122659\n // check if it has maxFontScaleLimit from option use maxFontScale\n const finalScale =\n maxFontScale && scale > maxFontScale ? maxFontScale : scale\n this.getObject3d().scale.set(finalScale, finalScale, finalScale)\n this.getObject3d().position.copy(finalPosition)\n this.getObject3d().rotation.z = (Math.PI / 180) * this.#angle\n }\n\n #calculateFinalPosition(basePosition) {\n if (this.#offsetX === 0 && this.#offsetY === 0) {\n return basePosition\n }\n\n const offsetCoordinate = [this.#offsetX, this.#offsetY]\n\n const z = this.#layer.altitudeToVector3(0, 0).x\n const offsetVector = this.#layer.coordinateToVector3(offsetCoordinate, z)\n const zeroVector = this.#layer.coordinateToVector3([0, 0], z)\n\n const worldOffsetX = offsetVector.x - zeroVector.x\n const worldOffsetY = offsetVector.y - zeroVector.y\n\n return {\n x: basePosition.x + worldOffsetX,\n y: basePosition.y + worldOffsetY,\n z: basePosition.z,\n }\n }\n\n #updatePosition() {\n if (this.#originalPosition && this.#layer) {\n const finalPosition = this.#calculateFinalPosition(this.#originalPosition)\n this.getObject3d().position.copy(finalPosition)\n }\n }\n\n set bearing(value) {\n this.#bearing = value\n const degree = this.#angle + this.#bearing\n const angle = degree > 90 || degree < -90 ? this.#angle + 180 : this.#angle\n this.getObject3d().rotation.z = (Math.PI / 180) * angle\n }\n\n get angle() {\n return this.#angle\n }\n\n get currentAngle() {\n return this.#angle\n }\n\n get text() {\n return this.#text\n }\n\n get offsetX() {\n return this.#offsetX\n }\n\n get offsetY() {\n return this.#offsetY\n }\n\n get offset() {\n return { x: this.#offsetX, y: this.#offsetY }\n }\n\n set offsetX(value) {\n if (isNumber(value)) {\n this.#offsetX = value\n this.#updatePosition()\n }\n }\n\n set offsetY(value) {\n if (isNumber(value)) {\n this.#offsetY = value\n this.#updatePosition()\n }\n }\n\n set angle(newAngle) {\n if (isNumber(newAngle)) {\n this.#angle = newAngle\n this.getObject3d().rotation.z = (Math.PI / 180) * this.#angle\n }\n }\n\n setOffset(offsetX, offsetY) {\n if (isNumber(offsetX) && isNumber(offsetY)) {\n this.#offsetX = offsetX\n this.#offsetY = offsetY\n this.#updatePosition()\n }\n }\n\n addOffset(deltaX, deltaY) {\n if (isNumber(deltaX) && isNumber(deltaY)) {\n this.#offsetX += deltaX\n this.#offsetY += deltaY\n this.#updatePosition()\n }\n }\n\n resetOffset() {\n this.#offsetX = 0\n this.#offsetY = 0\n this.#updatePosition()\n }\n\n moveToPosition(targetX, targetY) {\n if (this.#originalPosition && this.#layer) {\n const currentCenter = this.#layer.vector3ToCoordinate(\n this.#originalPosition\n )\n this.#offsetX = targetX - currentCenter.x\n this.#offsetY = targetY - currentCenter.y\n this.#updatePosition()\n }\n }\n\n updateText(newText, options: Record<string, unknown> = {}) {\n this.#text = newText\n\n const materialOptions = {\n fillStyle: options.fillStyle || this.properties.fillStyle,\n fontSize: options.fontSize || this.properties.fontSize,\n textAlign: options.textAlign || this.properties.textAlign,\n textBaseline: options.textBaseline || this.properties.textBaseline,\n fontFamily: options.fontFamily || this.properties.fontFamily,\n strokeStyle: options.strokeStyle || this.properties.strokeStyle,\n lineWidth: options.lineWidth || this.properties.lineWidth,\n }\n\n const newMaterial = getMaterial(newText, materialOptions) as Material\n ;(this.getObject3d() as Mesh).material = newMaterial\n newMaterial.needsUpdate = true\n }\n\n _animation() {\n // Flip text, if needed\n const map = this.getMap();\n if (!map) return;\n\n const bearing = map.getBearing();\n this.bearing = bearing\n }\n\n // Add bottomHeight to altitude as final altitude position\n setAltitude(altitude: number) {\n const bottomHeight = this.options.bottomHeight ?? 0\n return super.setAltitude(altitude + bottomHeight)\n }\n}\n","import { Element3DRendererOptions } from \"../types\";\n\n/**\n * minZoom, maxZoom = สำหรับระบุ zoom ที่จะให้ปรากฎตัว\n */\n\nexport const element3DRendererOptions: Element3DRendererOptions = {\n unit: {\n default: { color: \"#ffffff\", height: 0.2 },\n byCategory: {\n walkway: { color: \"#cccccc\", height: 0.1 },\n terrace: { color: \"#cccccc\", height: 0.1 },\n unenclosedarea: { color: \"#cccccc\", height: 0.2 },\n nonpublic: { color: \"#999999\", height: 0.3 },\n escalator: { height: 0.2 },\n parking: { color: \"#999999\", height: 0.1 },\n room: { color: \"#ffffff\", height: 0.5, bottomHeight: 0.12 }\n },\n },\n kiosk: {\n default: { color: \"#666666\", height: 0.6, bottomHeight: 0.12 },\n },\n fixture: {\n default: { color: \"#ffffff\", height: 0.5 },\n byCategory: {\n water: { color: \"#ACD7EC\", height: 0.1 },\n vegetation: { color: \"#91C499\", height: 0.5 },\n wall: { color: \"#787878\", topColor: '#ffffff', height: 4.2, width: 1 }\n }\n }\n}","import {\n CreateExtrudeLineStringOptionType,\n CreateExtrudePolygonOptionType,\n Element3DRendererOptions,\n} from '../../types'\nimport { element3DRendererOptions as defaultOptions } from '../element3DRendererOptions'\n\n\nconst DEFAULT_POLYGON_OPTION: CreateExtrudePolygonOptionType = {\n color: \"#FFFFFF\",\n offset: 0,\n altitude: 0,\n}\n\nexport const get3DRendererOption = (\n featureType: string,\n category: string,\n options: Element3DRendererOptions\n): CreateExtrudePolygonOptionType | CreateExtrudeLineStringOptionType => {\n try {\n const option = options[featureType] ?? defaultOptions[featureType]\n return (\n (category && option.byCategory?.[category]) ??\n option?.default ??\n DEFAULT_POLYGON_OPTION\n )\n } catch (err) {\n console.log(err.message, { options, featureType, category })\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { Element2DRendererOptions, IElementRenderer, IHighlightController, MapElement } from \"../types\"\nimport { ImdfFeature, LabelFeature, LevelFeature, OpeningFeature, UnitFeature } from \"../../../data\"\nimport { element2DRendererOptions as defaultOptions } from \"./element2DRendererOptions\"\nimport { PolygonOptionsType } from \"maptalks/dist/geometry/Polygon\"\nimport { Position } from \"geojson\"\n\nconst DEFAULT_POLYGON_OPTION: PolygonOptionsType = {\n zIndex: 0,\n symbol: {\n polygonFill: \"#FFFFFF\",\n lineColor: \"#34495E\",\n polygonOpacity: 1,\n lineWidth: 2,\n },\n}\n\nconst ORDINAL_HEIGHT = 4\nconst MULTIORDINAL_HEIGHT_METER = 10\n\nconst getAltitude = (f: LevelFeature) =>\n Math.max(0, f.properties.ordinal * ORDINAL_HEIGHT || 0)\n\nconst getGeometryProperties = (feature: ImdfFeature) => ({\n // Core\n type: \"Feature\",\n id: feature.id,\n geometry: feature.geometry,\n properties: feature.properties,\n // Extra\n feature_type: feature.feature_type,\n category: feature.properties.category,\n name: feature.properties.name?.en,\n})\n\nconst getGeometryOption = (\n feature: ImdfFeature,\n options: Element2DRendererOptions\n): PolygonOptionsType => {\n try {\n const option = options[feature.feature_type] ?? defaultOptions[feature.feature_type]\n const category = feature.properties.category\n return (\n (category && option.byCategory?.[category]) ??\n option?.default ??\n DEFAULT_POLYGON_OPTION\n )\n } catch (err) {\n console.log(err.message, { options, feature })\n }\n}\n\nexport class Element2DRenderer\n extends EventTarget\n implements IElementRenderer\n{\n public isReady: boolean = false\n\n private options: Element2DRendererOptions\n private map: maptalks.Map\n private elementLayer: maptalks.VectorLayer\n private markerLayer: maptalks.VectorLayer\n\n constructor(map: maptalks.Map, options: Element2DRendererOptions) {\n super()\n this.options = options\n this.map = map\n\n // Create Layer for elements\n this.elementLayer = new maptalks.VectorLayer(\"elements\")\n this.elementLayer.addTo(this.map)\n\n this.markerLayer = new maptalks.VectorLayer(\"markers\")\n this.markerLayer.addTo(this.map)\n\n // Dispatch ready event, to let manager know we're ready to start\n this.isReady = true\n }\n\n createGeometry = (imdfFeature: ImdfFeature): MapElement => {\n // Create Element (Geometry)\n const feature = getGeometryProperties(imdfFeature)\n const { symbol, ...options } = getGeometryOption(imdfFeature, this.options)\n const altitude = feature.properties.ordinal * 10\n const geometry = maptalks.Geometry.fromJSON({\n feature,\n symbol,\n options: {\n ...options,\n zIndex: altitude,\n properties: { altitude },\n },\n })\n\n // Add to layer, and return\n if (Array.isArray(geometry)) {\n geometry.forEach((g) => g.addTo(this.elementLayer))\n return new maptalks.GeometryCollection(geometry)\n } else {\n geometry.addTo(this.elementLayer)\n return geometry\n }\n }\n\n createRoomWall(unit: UnitFeature, openings: OpeningFeature[]): MapElement | MapElement[] | null {\n return null\n }\n\n async createEscalator(f: ImdfFeature, coordinates: Position): Promise<MapElement | null> {\n return Promise.resolve(null)\n }\n\n createGroundLabel(f: LabelFeature, unit: UnitFeature): MapElement | MapElement[] | null {\n const text = f.properties.name\n const bound = f.geometry.coordinates[0]\n return null\n }\n\n async createBuilding(coordinate: Position, ordinal: number): Promise<MapElement | null> {\n return Promise.resolve(null)\n }\n\n createElement = (imdfFeature: ImdfFeature): MapElement | null => {\n switch (imdfFeature.feature_type) {\n default:\n return null\n }\n }\n\n showElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n hideElements(elements: MapElement[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.hide()\n })\n }\n\n createHighlightController(element: MapElement): IHighlightController {\n if (!(element instanceof maptalks.Geometry)) return null;\n return {\n start() {},\n clear() {}\n }\n }\n \n \n}\n","import { Element2DRendererOptions } from \"../types\";\n\nexport const element2DRendererOptions: Element2DRendererOptions = {\n unit: { \n default: { symbol: { polygonFill: '#cccccc' } },\n byCategory: {\n room: { symbol: { polygonFill: '#fff' } },\n walkway: { symbol: { polygonFill: \"#efefef\", lineColor: \"#dadada\", lineWidth: 2 } },\n terrace: { symbol: { polygonFill: \"#efefef\" } },\n unenclosedarea: { symbol: { polygonFill: \"#fff\" } },\n nonpublic: { symbol: { polygonFill: \"#999999\" }},\n }\n },\n kiosk: { \n default: {},\n },\n fixture: {\n default: { symbol: { polygonFill: \"#ffffff\" } },\n byCategory: {\n water: { symbol: { polygonFill: \"#ACD7EC\" } },\n vegetation: { symbol: { polygonFill: \"#91C499\" } }\n }\n }\n}\n","import * as maptalks from \"maptalks\"\nimport { IMarkerRenderer } from \"../types\"\nimport { Position } from \"geojson\"\n\nexport class Marker2DRenderer\n extends EventTarget\n implements IMarkerRenderer<maptalks.ui.UIMarker>\n{\n public isReady: boolean = false\n\n private map: maptalks.Map\n private markerLayer: maptalks.VectorLayer\n\n constructor(map: maptalks.Map) {\n super()\n this.map = map\n }\n\n createMarker = (\n coordinates: Position,\n ordinal: number,\n content: string\n ): maptalks.ui.UIMarker => {\n const marker = new maptalks.ui.UIMarker(coordinates, {\n content,\n collision: true,\n collisionFadeIn: true,\n altitude: 0,\n })\n marker.addTo(this.map)\n return marker\n }\n\n removeMarker = (marker: maptalks.ui.UIMarker) => {\n marker.remove()\n }\n\n showMarkers(elements: maptalks.ui.UIMarker[], ordinalDiff: number = 0) {}\n hideMarkers(elements: maptalks.ui.UIMarker[], ordinalDiff: number = 0) {}\n}","import * as maptalks from \"maptalks-gl\"\nimport * as THREE from \"three\"\nimport { IMarkerRenderer } from \"../types\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\"\nimport { Position } from \"geojson\"\n// import { createSpriteMaterialByLabelSymbol } from \"../utils/svg2material\"\nimport { TextMarkerOptions, TextSpriteMarker } from \"./objects/TextSpriteMarker\"\n\nexport const HEIGHT_METER = 4\nexport const MULTIORDINAL_HEIGHT_METER = 9\n\nexport type AnyMarkerOptions = TextMarkerOptions\n\nexport class Marker3DRenderer\n extends EventTarget\n implements IMarkerRenderer<BaseObject>\n{\n public isReady: boolean = false\n\n private threeLayer: ThreeLayer\n\n private map: maptalks.Map\n \n private materialByKey: Map<string, THREE.Material>\n \n\n constructor(map: maptalks.Map, options: any, layer: ThreeLayer) {\n super()\n this.map = map\n this.threeLayer = layer\n }\n\n createTextMarker = (\n position: Position,\n ordinal: number,\n label: string,\n options?: TextMarkerOptions\n ): BaseObject => {\n const combinedOptions = {\n altitude: ordinal * HEIGHT_METER,\n text: label,\n ...(options ?? {})\n }\n const [lng, lat] = position\n const marker = new TextSpriteMarker(new maptalks.Coordinate(lng, lat), combinedOptions, this.threeLayer)\n this.threeLayer.addMesh([marker])\n return marker\n }\n\n createImageMarker = () => {\n /**\n * function createMateria(fillStyle) {\n const idx = Math.floor(Math.random() * 3);\n return new THREE.PointsMaterial({\n // size: 10,\n sizeAttenuation: false,\n color: fillStyle,\n // alphaTest: 0.5,\n // vertexColors: THREE.VertexColors,\n // transparent: true\n // color: 0xffffff,\n size: 40,\n transparent: true, //使材质透明\n blending: THREE.AdditiveBlending,\n depthTest: true, //深度测试关闭,不消去场景的不可见面\n depthWrite: false,\n map: new THREE.TextureLoader().load('./data/' + idx + '.svg')\n //刚刚创建的粒子贴图就在这里用上\n });\n }\n */\n // const material = this.getOrCreateIconMaterial(\n // \"amenity.escalator\"\n // ) as THREE.SpriteMaterial\n // const marker = new SpriteMarker(\n // coordinates,\n // options,\n // material,\n // this.threeLayer,\n // {}\n // )\n }\n\n createMarker = (\n coordinates: Position,\n ordinal: number,\n label: string,\n options: AnyMarkerOptions\n ): BaseObject => {\n return this.createTextMarker(coordinates, ordinal, label, options)\n }\n\n removeMarker = (marker: BaseObject) => {\n marker.remove()\n }\n\n showMarkers(elements: BaseObject[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n element.setAltitude(ordinalDiff * MULTIORDINAL_HEIGHT_METER)\n element.show()\n })\n }\n\n hideMarkers(elements: BaseObject[], ordinalDiff: number = 0) {\n elements.forEach((element) => {\n try { \n element.hide()\n } catch (err) {\n console.log(`cannot hide`, err, element)\n }\n })\n }\n\n /** Marker */\n // getOrCreateIconMaterial(key) {\n // if (!this.materialByKey) this.materialByKey = new Map()\n\n // const existingMaterial = this.materialByKey.get(key)\n // if (existingMaterial) return existingMaterial\n\n // // Create new\n // const baseSymbol: maptalks.Path = {\n // markerType: \"path\",\n // markerPath: [\n // {\n // path: \"M20.775 1.2H1.225V20.35H8.215L11.3 22.8L14.385 20.35H20.775V1.2Z\",\n // fill: \"#ff0000\",\n // },\n // ],\n // markerPathWidth: 24,\n // markerPathHeight: 24\n // }\n\n // const markerSymbol: maptalks.PathMarkerSymbol = {\n // markerType: \"path\",\n // markerPath: [],\n // // TODO: Get Path by featureType.category\n // // markerPath: [{ fill: \"#FFFFFF\", path: \"M 19 3 H 5 c -1.1 0 -2 0.9 -2 2 v 14 c 0 1.1 0.9 2 2 2 h 14 c 1.1 0 2 -0.9 2 -2 V 5 c 0 -1.1 -0.9 -2 -2 -2 Z m -2 6 h -1.7 l -5 9 H 7 c -0.83 0 -1.5 -0.67 -1.5 -1.5 S 6.17 15 7 15 h 1.7 l 5 -9 H 17 c 0.83 0 1.5 0.67 1.5 1.5 S 17.83 9 17 9 Z\" }],\n // markerPathWidth: 24,\n // markerPathHeight: 24,\n // markerWidth: 24,\n // markerHeight: 24,\n // markerDy: 1.5,\n // markerDx: 1.5,\n // }\n\n // const created = createSpriteMaterialByLabelSymbol([\n // baseSymbol,\n // markerSymbol,\n // ])\n // this.materialByKey.set(key, created)\n // return created\n // }\n}","// TextSpriteMarker.js\nimport { Coordinate, Util } from \"maptalks\"\nimport * as THREE from \"three\"\nimport { BaseObject, ThreeLayer } from \"maptalks.three\" // in some builds it's maptalks.three.BaseObject\nimport { BaseObjectOptionType } from \"maptalks.three/dist/type\"\nimport { isNil, set } from \"lodash\"\nimport { Stop } from \"../../types\"\nimport { interpolateStops } from \"../../utils/interpolateStops\"\n\nconst OPTIONS: TextMarkerOptions = {\n // Texture options\n text: \"\",\n textAlign: \"center\",\n color: \"#ffffff\",\n fontFamily: \"sans-serif\",\n fontSize: 28,\n fontWeight: 400,\n background: \"transparent\",\n lineHeight: 32,\n padding: 8,\n strokeColor: \"#000000\",\n strokeWidth: 3,\n strokeStyle: \"round\",\n // Sprite options\n /* Overall scale multiplier */\n scale: 1,\n altitude: 0,\n opacity: 1\n}\n\nexport type TextMarkerOptions = BaseObjectOptionType & {\n // Texture options\n text?: string\n textAlign?: CanvasTextAlign\n color?: CanvasFillStrokeStyles[\"fillStyle\"]\n fontFamily?: string\n fontSize?: number\n fontWeight?: number\n background?: CanvasFillStrokeStyles[\"fillStyle\"]\n lineHeight?: number\n strokeColor?: CanvasFillStrokeStyles[\"strokeStyle\"]\n strokeWidth?: number\n strokeStyle?: CanvasLineJoin\n padding?: number\n maxWidth?: number\n // Sprite options\n scale?: number\n altitude?: number\n bottomHeight?: number\n opacity?: number | { stops: Stop[] }\n}\n\nexport class TextSpriteMarker extends BaseObject {\n #altitudeOffset: number = 0\n declare options: TextMarkerOptions;\n\n constructor(\n coordinate: Coordinate,\n options: TextMarkerOptions,\n layer: ThreeLayer,\n properties: Record<string, any> = {}\n ) {\n options = Util.extend({}, OPTIONS, options, { layer })\n super()\n this._coordinate = new Coordinate(coordinate)\n this._initOptions(options)\n this._createGroup()\n\n this.properties = { ...properties }\n const sprite = this._createSprite()\n\n this.getObject3d().add(sprite)\n\n this._updatePosition()\n\n this.type = \"TextSpriteMarker\"\n }\n\n getOptions(): TextMarkerOptions {\n return super.getOptions()\n }\n\n _createSprite() {\n const options = this.getOptions()\n const texture = this._createTextTexture(options.text, options)\n\n const material = new THREE.SpriteMaterial({\n map: texture,\n transparent: true,\n alphaTest: 0.1,\n })\n\n const sprite = new THREE.Sprite(material)\n\n // position will be set in _animation or directly after added to layer\n // scale to match texture aspect\n const w = texture.image.width\n const h = texture.image.height\n const base = 1 / 16 // to bring canvas px to map size-ish\n\n // Normalize text scale by the current map resolution so sprite size stays visually consistent across zoom levels.\n const normalizedScale = options.scale / this.getMap().getGLRes()\n\n sprite.scale.set(w * base * normalizedScale, h * base * normalizedScale, 1)\n\n // Compute world-space height for text and use it as altitude offset.\n this.#altitudeOffset = Math.max(\n h * base * options.scale * 0.5,\n 0.05 // minimum lift in world units\n )\n\n return sprite\n }\n\n _createTextTexture(text: string, options: TextMarkerOptions = {}) {\n const {\n padding,\n fontSize,\n fontFamily,\n fontWeight,\n lineHeight,\n background,\n color,\n textAlign,\n strokeColor,\n strokeWidth,\n maxWidth,\n } = options || {}\n\n // 1. create a temp canvas to measure\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")!\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\n // 2. split into paragraphs (explicit \\n from user)\n const paragraphs = String(text).split(\"\\n\")\n\n // 3. wrap each paragraph to lines\n const wrappedLines: string[] = []\n\n paragraphs.forEach((paragraph) => {\n if (isNil(maxWidth) || isNaN(maxWidth)) {\n // no wrapping, keep as-is\n wrappedLines.push(paragraph)\n return\n }\n\n const words = paragraph.split(/\\s+/)\n let currentLine = \"\"\n\n words.forEach((word) => {\n const testLine = currentLine ? currentLine + \" \" + word : word\n const testWidth = ctx.measureText(testLine).width\n\n if (testWidth > maxWidth && currentLine) {\n // push current and start new\n wrappedLines.push(currentLine)\n currentLine = word\n } else {\n currentLine = testLine\n }\n })\n\n if (currentLine) {\n wrappedLines.push(currentLine)\n }\n })\n\n // 4. figure out final canvas size\n const lines = wrappedLines.length ? wrappedLines : [\"\"]\n const widest = Math.max(...lines.map((l) => ctx.measureText(l).width), 0)\n const finalWidth =\n (maxWidth ? Math.min(widest, maxWidth) : widest) + padding * 2\n const finalHeight = lineHeight * lines.length + padding * 2\n\n canvas.width = finalWidth\n canvas.height = finalHeight\n\n // 5. reapply styles after resize\n const ctx2 = canvas.getContext(\"2d\")!\n ctx2.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n ctx2.textAlign = textAlign\n\n // background\n if (background && background !== \"transparent\") {\n ctx2.fillStyle = background\n ctx2.fillRect(0, 0, canvas.width, canvas.height)\n }\n\n // 6. draw all lines (stroke first, then fill)\n lines.forEach((line, i) => {\n const y = padding + lineHeight * (i + 0.8)\n let x = padding\n if (textAlign === \"center\") x = canvas.width / 2\n if (textAlign === \"right\" || textAlign === \"end\")\n x = canvas.width - padding\n\n if (strokeWidth > 0) {\n ctx2.lineWidth = strokeWidth\n ctx2.lineJoin = \"round\"\n ctx2.miterLimit = 2\n ctx2.strokeStyle = strokeColor\n ctx2.strokeText(line, x, y)\n }\n\n ctx2.fillStyle = color\n ctx2.fillText(line, x, y)\n })\n\n const texture = new THREE.CanvasTexture(canvas)\n texture.needsUpdate = true\n texture.minFilter = THREE.LinearFilter\n return texture\n }\n\n _updatePosition() {\n const options = this.getOptions()\n const layer = options.layer\n\n if (!layer) return\n\n const altitude = (options.altitude || 0) + this.#altitudeOffset\n const z = layer.altitudeToVector3(altitude, altitude).x\n const position = layer.coordinateToVector3(this._coordinate, z)\n set(this.properties, \"default.position\", position)\n this.getObject3d().position.copy(position)\n }\n\n _animation() {\n const layer = this.getLayer() as ThreeLayer\n\n if (!this.isAdd || !layer) return\n\n if (this._visible === true) {\n const zoom = layer.map.getZoom()\n \n const object3d = this.getObject3d()\n const { opacity } = this.getOptions()\n \n // Calculate opacity based on type\n let opacityValue: number\n if (typeof opacity === 'number') {\n opacityValue = opacity ?? 1\n } else if (Array.isArray(opacity.stops)) {\n opacityValue = interpolateStops(opacity, zoom)\n } else {\n throw new Error(`Unknown opacity value ${opacity}`)\n }\n // Hide object outside zoom range\n const visible = opacityValue > 0.5\n object3d.visible = visible\n }\n }\n\n setText(text: string) {\n const options = this.getOptions()\n options.text = text\n\n const newSprite = this._createSprite()\n const group = this.getObject3d()\n\n // Remove all old sprites from the group (but keep group itself)\n group.children.forEach((child) => group.remove(child))\n group.add(newSprite)\n\n this._updatePosition()\n }\n\n setAltitude(altitude: number) {\n const bottomHeight = this.options.bottomHeight ?? 0\n return super.setAltitude(altitude + bottomHeight + this.#altitudeOffset)\n }\n}\n","import { Stop } from \"../types\"\n\nexport const interpolateStops = ({ stops }: { stops: Stop[] }, zoom: number) => {\n // If zoom is before the first stop\n if (zoom <= stops[0][0]) return stops[0][1]\n // If zoom is after the last stop\n if (zoom >= stops[stops.length - 1][0]) return stops[stops.length - 1][1]\n \n // Find the two stops around the zoom\n for (let i = 0; i < stops.length - 1; i++) {\n const [z1, v1] = stops[i]\n const [z2, v2] = stops[i + 1]\n\n if (zoom >= z1 && zoom <= z2) {\n const t = (zoom - z1) / (z2 - z1)\n return v1 + t * (v2 - v1)\n }\n }\n}","export const getLineCenter = (line: number[][]) => {\n let x = 0, y = 0;\n for (const [lx, ly] of line) {\n x += lx;\n y += ly;\n }\n const len = line.length;\n return [x / len, y / len];\n};\n\n// Returns angle in radians\nexport const angleBetweenLineStrings = (\n line1: number[][],\n line2: number[][],\n): number => {\n const [x1, y1] = getLineCenter(line1);\n const [x2, y2] = getLineCenter(line2);\n\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n // angle in radians, range (-PI, PI)\n return Math.atan2(dy, dx);\n};\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","import {\n Feature,\n FeatureCollection,\n Geometry,\n LineString,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { isNumber } from \"@turf/helpers\";\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @function\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(coord: Feature<Point> | Point | number[]): number[] {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n\n if (!Array.isArray(coord)) {\n if (\n coord.type === \"Feature\" &&\n coord.geometry !== null &&\n coord.geometry.type === \"Point\"\n ) {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (\n Array.isArray(coord) &&\n coord.length >= 2 &&\n !Array.isArray(coord[0]) &&\n !Array.isArray(coord[1])\n ) {\n return [...coord];\n }\n\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @function\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords<\n G extends\n | Point\n | LineString\n | Polygon\n | MultiPoint\n | MultiLineString\n | MultiPolygon,\n>(coords: any[] | Feature<G> | G): any[] {\n if (Array.isArray(coords)) {\n return coords;\n }\n\n // Feature\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n // Geometry\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @function\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates: any[]): boolean {\n if (\n coordinates.length > 1 &&\n isNumber(coordinates[0]) &&\n isNumber(coordinates[1])\n ) {\n return true;\n }\n\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @function\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value: any, type: string, name: string): void {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n value.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature: Feature<any>, type: string, name: string): void {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(\n featureCollection: FeatureCollection<any>,\n type: string,\n name: string\n) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom<G extends Geometry>(geojson: Feature<G> | G): G {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(\n geojson: Feature<any> | FeatureCollection<any> | Geometry,\n _name?: string\n): string {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\n\nexport {\n getCoord,\n getCoords,\n containsNumber,\n geojsonType,\n featureOf,\n collectionOf,\n getGeom,\n getType,\n};\n// No default export!\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","import { Position } from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { polygon } from \"@turf/helpers\"\nimport { UnitFeature } from \"../../../data\";\n\nexport const findUnitOnPoint = (units: UnitFeature[], point: Position) => {\n return units.find(unit => booleanPointInPolygon(point, polygon(unit.geometry.coordinates as Position[][])))\n}"],"mappings":"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","names":["QueryObserver","point","polygon","lineString","v","compact","kiosk","section","unit","feature","feature","options","Map","LineString","Coordinate","_","turfCenter","ThreeLayer","_","TextureLoader","SpriteMaterial","scale","BaseObject","Sprite","SpriteMaterial","_","scale","maptalks","BaseObject","OPTIONS","feature","_","_","polygon","scale","feature","_","polygon","SpriteMaterial","TextureLoader","feature_type","properties","logoUrl","scale","v","feature","compact","turfCenter","THREE","maptalks","BaseObject","turfBuffer","maptalks","BaseObject","isNumber","OPTIONS","ctx","text","scale","center","feature","turfBuffer","BaseObject","maptalks","DEFAULT_POLYGON_OPTION","MULTIORDINAL_HEIGHT_METER","feature","DEFAULT_POLYGON_OPTION","MULTIORDINAL_HEIGHT_METER","maptalks","maptalks","Coordinate","Util","THREE","BaseObject","OPTIONS","BaseObject","Util","Coordinate","HEIGHT_METER","MULTIORDINAL_HEIGHT_METER","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","point","scene","v","u","compact","turfCenter","center","_","Map","ThreeLayer","turfCenter","center","Coordinate","feature","geometry","LineString"]}