leaflet-city-mapper 0.0.9 → 0.1.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.
- package/README.md +6 -46
- package/dist/README.md +18 -0
- package/dist/leaflet-city-mapper-src.js +279 -110
- package/dist/leaflet-city-mapper-src.js.map +4 -4
- package/dist/leaflet-city-mapper-worker-src.js.map +2 -2
- package/dist/leaflet-city-mapper-worker.js.map +2 -2
- package/dist/leaflet-city-mapper.js +5 -5
- package/dist/leaflet-city-mapper.js.map +4 -4
- package/libs/README.md +18 -0
- package/libs/leaflet-lens.js +151 -151
- package/libs/leaflet.js +3 -3
- package/libs/openlayers-bindings.js +1129 -1129
- package/libs/openlayers-bindings.min.js.map +1 -1
- package/package.json +2 -4
- package/src/README.md +148 -0
- package/src/animations/README.md +30 -0
- package/src/animations/cancelCameraAnimation.js +13 -11
- package/src/animations/cancelGridFade.js +5 -3
- package/src/animations/endZoom.js +0 -5
- package/src/animations/mapAnimateCamera.js +13 -3
- package/src/animations/mapStopPitchBearingAnimation.js +8 -1
- package/src/animations/onZoomAnim.js +5 -4
- package/src/animations/renderPendingZoomAnimation.js +1 -4
- package/src/animations/runCameraAnimations.js +7 -4
- package/src/animations/runGridFades.js +1 -4
- package/src/animations/runMarkerPanFrame.js +1 -1
- package/src/animations/scheduleCameraAnimation.js +10 -8
- package/src/animations/scheduleGridFade.js +5 -4
- package/src/animations/scheduleMarkerPan.js +10 -6
- package/src/animations/startZoom.js +0 -3
- package/src/animations/synchronizeZoomView.js +6 -1
- package/src/animations/updateZoomCamera.js +21 -17
- package/src/archives/README.md +28 -0
- package/src/archives/decodeDirectory.js +13 -2
- package/src/archives/decodeHeader.js +9 -2
- package/src/archives/decompress.js +10 -0
- package/src/archives/findDirectoryEntry.js +17 -9
- package/src/archives/findTile.js +45 -31
- package/src/archives/getDirectoryEntries.js +28 -17
- package/src/archives/getHeader.js +7 -2
- package/src/archives/getTileData.js +26 -13
- package/src/archives/getZxy.js +11 -3
- package/src/archives/loadDirectory.js +10 -0
- package/src/archives/loadSource.js +12 -3
- package/src/archives/readArchiveRange.js +45 -31
- package/src/archives/readVarint.js +11 -2
- package/src/archives/tileId.js +11 -2
- package/src/astronomy/README.md +25 -0
- package/src/astronomy/horizontalPosition.js +11 -0
- package/src/astronomy/moonPosition.js +9 -2
- package/src/astronomy/solarPosition.js +9 -2
- package/src/astronomy/solarTime.js +21 -11
- package/src/camera/README.md +30 -0
- package/src/camera/cameraMapReady.js +6 -8
- package/src/camera/cleanupCameraMap.js +8 -10
- package/src/camera/constrainCameraToBounds.js +3 -2
- package/src/camera/createSceneCamera.js +25 -21
- package/src/camera/fitCameraBounds.js +9 -1
- package/src/camera/getBearing.js +10 -5
- package/src/camera/getPitch.js +10 -5
- package/src/camera/initializeCameraMap.js +1 -3
- package/src/camera/mapCamera.js +0 -2
- package/src/camera/mapContainerPointToLayerPoint.js +7 -2
- package/src/camera/mapGetBearing.js +7 -2
- package/src/camera/mapGetBounds.js +5 -2
- package/src/camera/mapGetBoundsCenterZoom.js +9 -2
- package/src/camera/mapGetBoundsZoom.js +9 -2
- package/src/camera/mapGetCenterLayerPoint.js +5 -1
- package/src/camera/mapGetPitch.js +7 -2
- package/src/camera/mapLayerPointToContainerPoint.js +7 -1
- package/src/camera/mapLimitCenter.js +9 -2
- package/src/camera/mapLimitOffset.js +12 -6
- package/src/camera/mapPanBy.js +10 -3
- package/src/camera/mapPanInside.js +8 -2
- package/src/camera/mapResetNorth.js +8 -0
- package/src/camera/mapResetNorthPitch.js +8 -0
- package/src/camera/mapSetBearing.js +10 -0
- package/src/camera/mapSetPitch.js +10 -0
- package/src/camera/mapSetPitchAndBearing.js +12 -3
- package/src/camera/mapSetZoomAround.js +9 -1
- package/src/camera/mapTryAnimatedPan.js +8 -1
- package/src/camera/mapUpdateCameraOverlays.js +6 -0
- package/src/camera/setBearing.js +13 -5
- package/src/camera/setPitch.js +13 -5
- package/src/camera/updateMapCamera.js +6 -4
- package/src/camera/updateSceneCamera.js +7 -1
- package/src/camera/updateSky.js +1 -3
- package/src/cog/README.md +29 -0
- package/src/cog/decodeCogTile.js +37 -24
- package/src/cog/finiteCogValues.js +12 -5
- package/src/cog/getCogAssetEntry.js +26 -15
- package/src/cog/getCogBase.js +22 -10
- package/src/cog/getCogHeader.js +10 -3
- package/src/cog/getCogProfile.js +25 -16
- package/src/cog/getCogTile.js +25 -12
- package/src/cog/getColorTile.js +38 -25
- package/src/cog/getElevationTile.js +29 -16
- package/src/cog/hasCogProjection.js +16 -9
- package/src/cog/initCog.js +13 -7
- package/src/cog/invalidCogFullResponse.js +10 -3
- package/src/cog/openCog.js +40 -30
- package/src/cog/openCogAsset.js +22 -14
- package/src/cog/readCog.js +39 -25
- package/src/cog/readCogBlock.js +19 -8
- package/src/cog/readCogBody.js +30 -20
- package/src/cog/readCogDirectories.js +32 -20
- package/src/cog/readCogDirectory.js +34 -21
- package/src/cog/readCogLevel.js +36 -27
- package/src/cog/readCogTag.js +28 -15
- package/src/cog/validCogDimensions.js +15 -6
- package/src/cog/validCogEncoding.js +18 -5
- package/src/cog/validCogGeoArrays.js +17 -8
- package/src/cog/validCogGrid.js +22 -9
- package/src/cog/validCogTileCoordinates.js +13 -4
- package/src/cog/validateCogContainer.js +17 -9
- package/src/cog/validateCogContentRange.js +18 -8
- package/src/cog/validateCogOffsets.js +19 -10
- package/src/cog/validateCogRange.js +16 -7
- package/src/cog/validateCogResponse.js +26 -15
- package/src/collision/README.md +28 -0
- package/src/collision/advanceFeature.js +13 -0
- package/src/collision/boxNormal.js +29 -0
- package/src/collision/cachedCollider.js +18 -0
- package/src/collision/collectIntersections.js +41 -16
- package/src/collision/collectMeshes.js +6 -0
- package/src/collision/collideTrip.js +56 -0
- package/src/collision/collider.js +28 -18
- package/src/collision/countCrossings.js +35 -15
- package/src/collision/enclosesOrigin.js +13 -0
- package/src/collision/flipsNormal.js +15 -0
- package/src/collision/hiddenLightHit.js +19 -8
- package/src/collision/horizontalRay.js +13 -1
- package/src/collision/indexTriangle.js +18 -11
- package/src/collision/insideMesh.js +47 -33
- package/src/collision/insideWalker.js +52 -46
- package/src/collision/intersectMeshes.js +40 -32
- package/src/collision/localRay.js +31 -21
- package/src/collision/mergeHits.js +19 -11
- package/src/collision/missesBox.js +13 -0
- package/src/collision/rayBounds.js +28 -19
- package/src/collision/readTriangle.js +32 -23
- package/src/collision/slabDistance.js +14 -0
- package/src/collision/slabMiss.js +14 -0
- package/src/collision/sortCrossings.js +17 -0
- package/src/collision/sortHits.js +9 -1
- package/src/collision/trafficBounds.js +24 -0
- package/src/collision/trafficCollision.js +30 -55
- package/src/collision/trafficRay.js +21 -0
- package/src/collision/transformTriangle.js +18 -9
- package/src/collision/transformVertices.js +18 -0
- package/src/collision/triangleDistance.js +34 -21
- package/src/collision/vertexCount.js +11 -3
- package/src/collision/worldHit.js +30 -18
- package/src/colors/README.md +25 -0
- package/src/colors/formatRGB.js +7 -0
- package/src/colors/hslChannel.js +10 -0
- package/src/colors/mixColor.js +10 -0
- package/src/colors/parseColor.js +4 -1
- package/src/colors/toSRGB.js +7 -0
- package/src/controls/README.md +26 -0
- package/src/controls/acceptPitchDrag.js +10 -3
- package/src/controls/acceptRotateDrag.js +9 -2
- package/src/controls/addCameraHandler.js +18 -11
- package/src/controls/adjustCameraDrag.js +8 -10
- package/src/controls/cameraControls.js +5 -4
- package/src/controls/cameraDragClick.js +5 -1
- package/src/controls/cameraDragContextMenu.js +10 -6
- package/src/controls/cameraDragDown.js +5 -2
- package/src/controls/cameraDragEnd.js +7 -3
- package/src/controls/cameraDragMove.js +24 -20
- package/src/controls/changeCameraTouch.js +12 -14
- package/src/controls/cleanupCameraTouch.js +1 -4
- package/src/controls/compassAddHooks.js +1 -0
- package/src/controls/compassOrientation.js +11 -5
- package/src/controls/compassRemoveHooks.js +3 -2
- package/src/controls/containerResizeAddHooks.js +1 -0
- package/src/controls/containerResizeRemoveHooks.js +3 -2
- package/src/controls/dragCamera.js +11 -2
- package/src/controls/endAllCameraDrags.js +1 -2
- package/src/controls/endAllCameraTouches.js +1 -2
- package/src/controls/endCameraTouch.js +18 -12
- package/src/controls/endCameraTouchEvent.js +5 -2
- package/src/controls/failCompassPermission.js +10 -4
- package/src/controls/finishCameraDrag.js +14 -8
- package/src/controls/finishCompassPermission.js +24 -17
- package/src/controls/isEditableTarget.js +9 -2
- package/src/controls/loadCameraControls.js +18 -9
- package/src/controls/moveCameraTouch.js +30 -27
- package/src/controls/notifyCameraTouchChange.js +1 -0
- package/src/controls/pitchDragAddHooks.js +1 -1
- package/src/controls/pitchDragRemoveHooks.js +1 -0
- package/src/controls/refreshRotateControl.js +2 -0
- package/src/controls/refreshRotateFocus.js +3 -2
- package/src/controls/removeCameraDrag.js +18 -15
- package/src/controls/resizeMap.js +7 -2
- package/src/controls/rotateButtonClick.js +15 -10
- package/src/controls/rotateButtonKeydown.js +16 -10
- package/src/controls/rotateControl.js +11 -3
- package/src/controls/rotateOnAdd.js +7 -1
- package/src/controls/rotateOnRemove.js +5 -0
- package/src/controls/shiftRotateAddHooks.js +1 -1
- package/src/controls/shiftRotateRemoveHooks.js +3 -2
- package/src/controls/shiftRotateWheel.js +11 -6
- package/src/controls/startCameraTouch.js +5 -2
- package/src/core/README.md +28 -0
- package/src/core/adjustCameraMarkerPan.js +7 -2
- package/src/core/cameraCircleBounds.js +5 -1
- package/src/core/cameraMarkerDrag.js +1 -2
- package/src/core/cameraMarkerOnDrag.js +13 -10
- package/src/core/closestCameraLayerPoint.js +7 -1
- package/src/core/constructLayer.js +16 -9
- package/src/core/extendLeafletClass.js +12 -5
- package/src/core/extendTerrainPixelBounds.js +41 -31
- package/src/core/fireRasterLoad.js +1 -1
- package/src/core/gridlayerGetEvents.js +5 -2
- package/src/core/gridlayerGetTiledPixelBounds.js +7 -1
- package/src/core/initializeGridContainer.js +1 -1
- package/src/core/initializeNativeLayer.js +1 -4
- package/src/core/layerAddInitHook.js +12 -7
- package/src/core/layerCallInitHooks.js +1 -2
- package/src/core/layerMergeOptions.js +14 -7
- package/src/core/markerGetEvents.js +5 -2
- package/src/core/markerInitInteraction.js +7 -4
- package/src/core/markerSetIcon.js +10 -5
- package/src/core/markerSetPos.js +5 -2
- package/src/core/markerSetRotation.js +19 -9
- package/src/core/markerUpdateZIndex.js +6 -4
- package/src/core/popupAdjustPan.js +5 -2
- package/src/core/popupGetEvents.js +5 -1
- package/src/core/popupUpdatePosition.js +1 -2
- package/src/core/projectNativePath.js +30 -23
- package/src/core/redrawPath.js +11 -6
- package/src/core/removeLayer.js +23 -20
- package/src/core/setRotation.js +12 -5
- package/src/core/tooltipGetEvents.js +5 -1
- package/src/core/tooltipSetPosition.js +5 -2
- package/src/core/updateGridOpacity.js +2 -1
- package/src/core/whenReady.js +11 -8
- package/src/geometry/README.md +29 -0
- package/src/geometry/addBridges.js +30 -28
- package/src/geometry/addGeneratedTriangle.js +7 -3
- package/src/geometry/appendAreaTriangle.js +32 -17
- package/src/geometry/appendNativeTriangle.js +17 -3
- package/src/geometry/appendRouteDash.js +33 -15
- package/src/geometry/appendRouteSegment.js +28 -15
- package/src/geometry/assembleAreaGeometry.js +48 -41
- package/src/geometry/boundsQuad.js +8 -0
- package/src/geometry/box.js +10 -0
- package/src/geometry/bridgeEdge.js +18 -11
- package/src/geometry/bridgeElevation.js +8 -1
- package/src/geometry/bridgeFaces.js +22 -15
- package/src/geometry/bridgePaths.js +19 -11
- package/src/geometry/bridgePolygon.js +37 -31
- package/src/geometry/bridgeSides.js +18 -11
- package/src/geometry/buildGeometryParts.js +7 -0
- package/src/geometry/buildProjectedPoint.js +32 -21
- package/src/geometry/buildProjectedPolygon.js +34 -25
- package/src/geometry/circleAt.js +18 -5
- package/src/geometry/circleGeometry.js +41 -35
- package/src/geometry/clipLine.js +8 -1
- package/src/geometry/clipSegment.js +9 -0
- package/src/geometry/computeBounds.js +5 -2
- package/src/geometry/conformModelToTerrain.js +6 -3
- package/src/geometry/createLampRing.js +8 -0
- package/src/geometry/createModelGeometry.js +44 -34
- package/src/geometry/createRasterQuadGeometry.js +7 -1
- package/src/geometry/createTreeRing.js +8 -1
- package/src/geometry/crossVector.js +15 -7
- package/src/geometry/dashValues.js +23 -14
- package/src/geometry/dashedSegment.js +33 -21
- package/src/geometry/disk.js +9 -0
- package/src/geometry/diskAt.js +16 -4
- package/src/geometry/emitter.js +18 -8
- package/src/geometry/fillNativePolygon.js +28 -20
- package/src/geometry/generateTreeGeometry.js +15 -9
- package/src/geometry/indexBridge.js +34 -28
- package/src/geometry/instanceAreaGeometry.js +37 -31
- package/src/geometry/interpolateRoute.js +10 -2
- package/src/geometry/lampPostGeometry.js +9 -2
- package/src/geometry/lightGeometry.js +9 -2
- package/src/geometry/line.js +28 -21
- package/src/geometry/lineJoin.js +35 -26
- package/src/geometry/markerImageBounds.js +20 -11
- package/src/geometry/markerQuadCorners.js +9 -3
- package/src/geometry/meshShadowBounds.js +33 -24
- package/src/geometry/nativeGeometry.js +9 -1
- package/src/geometry/offsetBelowGround.js +10 -3
- package/src/geometry/polygon.js +7 -0
- package/src/geometry/quad.js +23 -9
- package/src/geometry/restoreGeometry.js +29 -23
- package/src/geometry/roofCoverage.js +29 -22
- package/src/geometry/roofFootprint.js +36 -28
- package/src/geometry/routeGeometry.js +7 -2
- package/src/geometry/samePoint.js +11 -3
- package/src/geometry/segment.js +32 -23
- package/src/geometry/setVertexColor.js +1 -1
- package/src/geometry/shadowBounds.js +8 -0
- package/src/geometry/subtractRoofTile.js +28 -19
- package/src/geometry/subtractVector.js +8 -0
- package/src/geometry/surface.js +11 -1
- package/src/geometry/terrainBuffers.js +33 -26
- package/src/geometry/terrainGrid.js +7 -2
- package/src/geometry/terrainTileGeometry.js +24 -15
- package/src/geometry/treeGeometry.js +7 -4
- package/src/geometry/triangle.js +11 -0
- package/src/geometry/validateTree.js +19 -7
- package/src/geometry/vertexNormals.js +8 -2
- package/src/geometry/visitNativeCoordinates.js +7 -0
- package/src/globals/CELL.js +6 -2
- package/src/globals/Compass.js +5 -0
- package/src/globals/ContainerResize.js +5 -0
- package/src/globals/HEIGHT.js +5 -0
- package/src/globals/L.js +6 -1
- package/src/globals/PitchDrag.js +5 -0
- package/src/globals/README.md +28 -0
- package/src/globals/ShiftRotate.js +5 -0
- package/src/globals/TILE_RADIUS.js +5 -0
- package/src/globals/TILE_SIZE.js +5 -0
- package/src/globals/TouchMode.js +5 -0
- package/src/globals/alphaBlend.js +5 -0
- package/src/globals/archiveDecoder.js +5 -0
- package/src/globals/archiveNorthWest.js +5 -0
- package/src/globals/archiveSouthEast.js +5 -0
- package/src/globals/atmosphereColor.js +5 -0
- package/src/globals/atmosphereStops.js +5 -0
- package/src/globals/blobParts.js +5 -0
- package/src/globals/cameraAngles.js +5 -0
- package/src/globals/cameraAnimatedOptions.js +5 -0
- package/src/globals/cameraAnimationFrame.js +5 -0
- package/src/globals/cameraAnimations.js +5 -0
- package/src/globals/cameraBearingSensitivity.js +5 -0
- package/src/globals/cameraDragSensitivity.js +5 -0
- package/src/globals/cameraDrags.js +5 -0
- package/src/globals/cameraEmptyOptions.js +5 -0
- package/src/globals/cameraFocusOptions.js +5 -0
- package/src/globals/cameraFov.js +8 -3
- package/src/globals/cameraListenerOptions.js +5 -0
- package/src/globals/cameraTouchStates.js +5 -0
- package/src/globals/cameraZeroPadding.js +5 -0
- package/src/globals/cogTags.js +6 -1
- package/src/globals/colorLayout.js +5 -0
- package/src/globals/colorTexture.js +11 -6
- package/src/globals/coreEventTypes.js +5 -0
- package/src/globals/coreMatrixKeys.js +5 -0
- package/src/globals/coreQuadIndices.js +5 -0
- package/src/globals/coreQuadUV.js +5 -0
- package/src/globals/coreSampler.js +5 -0
- package/src/globals/coreWhite.js +5 -0
- package/src/globals/cosObliquity.js +8 -3
- package/src/globals/coverageTiles.js +5 -0
- package/src/globals/dark.js +5 -0
- package/src/globals/defaultMaterial.js +5 -0
- package/src/globals/degrees.js +6 -1
- package/src/globals/demBuffer.js +5 -0
- package/src/globals/demLayout.js +5 -0
- package/src/globals/demSize.js +5 -0
- package/src/globals/demTarget.js +5 -0
- package/src/globals/demTexture.js +5 -0
- package/src/globals/depthBindGroup.js +5 -0
- package/src/globals/depthTexture.js +5 -0
- package/src/globals/directoryReader.js +5 -0
- package/src/globals/disabledShadow.js +5 -0
- package/src/globals/drawEntries.js +5 -0
- package/src/globals/drawFrameEntry.js +5 -0
- package/src/globals/drawMeshEntry.js +5 -0
- package/src/globals/drawSamplerEntries.js +5 -0
- package/src/globals/drawTerrainEntry.js +5 -0
- package/src/globals/drawTextureEntries.js +5 -0
- package/src/globals/earthCirc.js +6 -1
- package/src/globals/elevationWGSL.js +2 -0
- package/src/globals/fragmentShader.js +5 -0
- package/src/globals/frameBuffer.js +5 -0
- package/src/globals/frameCommands.js +5 -0
- package/src/globals/frameLayoutEntry.js +5 -0
- package/src/globals/geometryDecoder.js +5 -0
- package/src/globals/geometryEmpty.js +5 -0
- package/src/globals/geometryImageOptions.js +5 -0
- package/src/globals/geometryPixelStates.js +5 -0
- package/src/globals/geometryQuaternion.js +5 -0
- package/src/globals/geometryScale.js +5 -0
- package/src/globals/geometrySemantics.js +5 -0
- package/src/globals/geometryTranslation.js +5 -0
- package/src/globals/geometryWorkerUrl.js +8 -3
- package/src/globals/glass.js +5 -0
- package/src/globals/gridEvents.js +5 -0
- package/src/globals/gridFadeFrame.js +5 -0
- package/src/globals/halfRadians.js +6 -1
- package/src/globals/headerBounds.js +5 -0
- package/src/globals/headerFlags.js +5 -0
- package/src/globals/headerOffsets.js +5 -0
- package/src/globals/headlight.js +5 -0
- package/src/globals/hull.js +5 -0
- package/src/globals/instanceLayout.js +5 -0
- package/src/globals/lampDirections.js +13 -8
- package/src/globals/layerControlAddItem.js +8 -3
- package/src/globals/layerProto.js +5 -0
- package/src/globals/leafletLayer.js +8 -3
- package/src/globals/lightScale.js +6 -1
- package/src/globals/limbs.js +5 -1
- package/src/globals/loading.js +5 -0
- package/src/globals/mapMethods.js +5 -0
- package/src/globals/markerMethods.js +5 -0
- package/src/globals/markerPanFrame.js +5 -0
- package/src/globals/meshBindGroup.js +5 -0
- package/src/globals/meshBuffer.js +5 -0
- package/src/globals/meshCopySize.js +5 -0
- package/src/globals/meshImage.js +5 -0
- package/src/globals/meshLayoutEntry.js +5 -0
- package/src/globals/meshOffsets.js +5 -0
- package/src/globals/meshPipeline.js +5 -0
- package/src/globals/meshStack.js +5 -0
- package/src/globals/meshTarget.js +5 -0
- package/src/globals/moves.js +5 -1
- package/src/globals/mvtTextDecoder.js +6 -1
- package/src/globals/nativeMethodHandlers.js +5 -0
- package/src/globals/nativeScalableStyleKeys.js +6 -1
- package/src/globals/nextId.js +5 -0
- package/src/globals/normalLayout.js +5 -0
- package/src/globals/paints.js +5 -0
- package/src/globals/parts.js +5 -0
- package/src/globals/pendingGridFades.js +5 -0
- package/src/globals/pendingInitializations.js +5 -0
- package/src/globals/pendingMapChanges.js +5 -0
- package/src/globals/pendingMarkerPan.js +5 -0
- package/src/globals/pendingPlacements.js +5 -0
- package/src/globals/pendingRasterLoads.js +5 -0
- package/src/globals/pendingUpdates.js +5 -0
- package/src/globals/pendingZoomAnimations.js +5 -0
- package/src/globals/pipelineLayout.js +5 -0
- package/src/globals/popupEvents.js +5 -0
- package/src/globals/popupPan.js +5 -0
- package/src/globals/popupPosition.js +5 -0
- package/src/globals/positionLayout.js +5 -0
- package/src/globals/programEntries.js +5 -0
- package/src/globals/programLayout.js +5 -0
- package/src/globals/radians.js +5 -0
- package/src/globals/rasterBuffer.js +5 -0
- package/src/globals/rasterIndices.js +5 -0
- package/src/globals/rasterNormals.js +5 -0
- package/src/globals/rasterPoint.js +5 -0
- package/src/globals/rasterPositions.js +5 -0
- package/src/globals/rasterSampler.js +5 -0
- package/src/globals/rasterTexture.js +5 -0
- package/src/globals/rasterUVs.js +5 -0
- package/src/globals/removeLayer.js +5 -0
- package/src/globals/renderEmpty.js +5 -0
- package/src/globals/ringDirections.js +5 -0
- package/src/globals/roofBindGroup.js +5 -0
- package/src/globals/roofBlitSampler.js +5 -0
- package/src/globals/roofBuffer.js +5 -0
- package/src/globals/roofCommands.js +5 -0
- package/src/globals/roofCopySize.js +5 -0
- package/src/globals/roofImage.js +5 -0
- package/src/globals/roofMin.js +5 -0
- package/src/globals/roofOpacities.js +5 -0
- package/src/globals/roofPass.js +5 -0
- package/src/globals/roofPipeline.js +5 -0
- package/src/globals/roofSampler.js +5 -0
- package/src/globals/roofShader.js +5 -0
- package/src/globals/roofSignatures.js +5 -0
- package/src/globals/roofSize.js +5 -0
- package/src/globals/roofTarget.js +5 -0
- package/src/globals/roofTexture.js +5 -0
- package/src/globals/roofTiles.js +5 -0
- package/src/globals/roundProfile.js +5 -0
- package/src/globals/samplerLayoutEntries.js +5 -0
- package/src/globals/sceneCleanupFields.js +5 -0
- package/src/globals/sceneEmptyOptions.js +5 -0
- package/src/globals/scenePass.js +5 -0
- package/src/globals/sceneSunlightUniforms.js +5 -0
- package/src/globals/sceneTransferFields.js +5 -0
- package/src/globals/sceneWalkHandlers.js +5 -0
- package/src/globals/shadowBindGroup.js +5 -0
- package/src/globals/shadowBounds.js +5 -0
- package/src/globals/shadowCamera.js +5 -0
- package/src/globals/shadowDepthLayout.js +5 -0
- package/src/globals/shadowHigh.js +5 -0
- package/src/globals/shadowInstanceLayouts.js +5 -0
- package/src/globals/shadowLayouts.js +5 -0
- package/src/globals/shadowLow.js +5 -0
- package/src/globals/shadowMeshLayout.js +5 -0
- package/src/globals/shadowOffsets.js +5 -0
- package/src/globals/shadowPass.js +5 -0
- package/src/globals/shadowPipeline.js +5 -0
- package/src/globals/shadowPipelineLayout.js +5 -0
- package/src/globals/shadowShader.js +5 -0
- package/src/globals/shadowTexture.js +5 -0
- package/src/globals/shadowValues.js +5 -0
- package/src/globals/shirt.js +5 -0
- package/src/globals/sinObliquity.js +8 -3
- package/src/globals/sizes.js +5 -0
- package/src/globals/skin.js +5 -0
- package/src/globals/speed.js +5 -1
- package/src/globals/sunBindGroup.js +5 -0
- package/src/globals/taillight.js +5 -0
- package/src/globals/tau.js +6 -1
- package/src/globals/terrainLayoutEntry.js +5 -0
- package/src/globals/textureLayoutEntries.js +5 -0
- package/src/globals/tiledBounds.js +5 -0
- package/src/globals/tooltipEvents.js +5 -0
- package/src/globals/tooltipPosition.js +5 -0
- package/src/globals/trafficClocks.js +5 -0
- package/src/globals/trafficEmptyList.js +5 -0
- package/src/globals/trafficEmptyOptions.js +5 -0
- package/src/globals/trafficRouteMaterial.js +5 -0
- package/src/globals/trafficShader.js +5 -1
- package/src/globals/triangleContexts.js +5 -0
- package/src/globals/trousers.js +5 -0
- package/src/globals/types.js +5 -0
- package/src/globals/tyre.js +5 -0
- package/src/globals/uVLayout.js +5 -0
- package/src/globals/vectorStyleNamedColors.js +13 -8
- package/src/globals/vectorTileEvents.js +6 -1
- package/src/globals/vehicles.js +2 -0
- package/src/globals/vertexShader.js +5 -0
- package/src/globals/wantedTiles.js +5 -0
- package/src/globals/white.js +5 -0
- package/src/globals/workerCogSource.js +6 -1
- package/src/gpu/README.md +29 -0
- package/src/gpu/initializeRendererResources.js +39 -34
- package/src/gpu/initializeSharedRenderer.js +51 -44
- package/src/gpu/mountRenderer.js +25 -19
- package/src/gpu/releaseRenderer.js +8 -0
- package/src/gpu/rendererDeviceError.js +5 -3
- package/src/gpu/rendererDeviceLost.js +5 -3
- package/src/gpu/reportShaderCompilation.js +8 -0
- package/src/gpu/requestAdapter.js +8 -0
- package/src/gpu/requestDevice.js +9 -0
- package/src/gpu/showWebGPUWarning.js +5 -0
- package/src/index.js +0 -2
- package/src/layer-controls/README.md +25 -0
- package/src/layer-controls/layerControlInputId.js +18 -11
- package/src/layer-controls/layerCountTitle.js +16 -6
- package/src/layer-controls/placeEntry.js +9 -0
- package/src/layer-controls/placeEntryElement.js +29 -22
- package/src/layer-controls/placeUnderEntry.js +7 -0
- package/src/layer-controls/removeEntry.js +1 -0
- package/src/layer-controls/renderLayerCount.js +28 -20
- package/src/layer-controls/replaceEntry.js +1 -2
- package/src/layer-controls/runPlacements.js +1 -2
- package/src/layer-controls/underEntry.js +6 -2
- package/src/layer-controls/updateLayerCount.js +5 -1
- package/src/lighting/README.md +28 -0
- package/src/lighting/cacheLightGrid.js +9 -1
- package/src/lighting/collectLightMeshes.js +7 -1
- package/src/lighting/lightGrid.js +10 -1
- package/src/lighting/updatePointLights.js +7 -3
- package/src/lighting/visitLightCells.js +26 -13
- package/src/lighting/visitLightGridCells.js +11 -0
- package/src/lighting/worldLights.js +8 -1
- package/src/lighting/writeLightCell.js +14 -5
- package/src/materials/README.md +28 -0
- package/src/materials/createProgram.js +8 -4
- package/src/materials/createProgramLayout.js +44 -36
- package/src/materials/createProgramUniforms.js +25 -18
- package/src/materials/modelMaterialFor.js +29 -21
- package/src/materials/prepareMeshCutout.js +21 -12
- package/src/materials/terrainRasterProgram.js +57 -50
- package/src/materials/validateRoofMaterial.js +17 -10
- package/src/models/README.md +27 -0
- package/src/models/applyModelTransform.js +16 -12
- package/src/models/buildModelNodes.js +24 -14
- package/src/models/createModelContext.js +24 -15
- package/src/models/decodeModel.js +13 -2
- package/src/models/hasUnsupportedPrimitives.js +7 -0
- package/src/models/loadBuffer.js +16 -6
- package/src/models/loadModel.js +10 -7
- package/src/models/loadModelResources.js +22 -14
- package/src/models/modelNode.js +11 -1
- package/src/models/normalizeAccessor.js +21 -11
- package/src/models/prepareModel.js +29 -19
- package/src/models/prepareModelGeometry.js +35 -25
- package/src/models/prepareModelPrimitive.js +25 -17
- package/src/models/readAccessor.js +10 -4
- package/src/models/readAccessorValue.js +16 -7
- package/src/models/readAccessorValues.js +17 -0
- package/src/models/readModelAttributes.js +32 -20
- package/src/models/readModelIndices.js +28 -16
- package/src/models/readSparseAccessor.js +31 -19
- package/src/models/releaseModelResources.js +15 -10
- package/src/mvt/README.md +28 -0
- package/src/mvt/addMvtCrossings.js +23 -17
- package/src/mvt/appendMvtBandTriangles.js +42 -31
- package/src/mvt/appendMvtCoordinates.js +20 -11
- package/src/mvt/appendMvtPolygonTriangles.js +29 -19
- package/src/mvt/beginMvtPath.js +19 -9
- package/src/mvt/closeMvtPath.js +16 -7
- package/src/mvt/collectMvtEdges.js +29 -19
- package/src/mvt/createMvtReader.js +14 -7
- package/src/mvt/decodeVectorTile.js +39 -32
- package/src/mvt/expectMvtWire.js +11 -3
- package/src/mvt/finishMvtPath.js +14 -5
- package/src/mvt/finiteMvtCoordinate.js +14 -7
- package/src/mvt/groupMvtPolygons.js +35 -25
- package/src/mvt/isMvtFallbackError.js +13 -6
- package/src/mvt/mergeMvtActiveEdges.js +18 -9
- package/src/mvt/mvtEdgeX.js +12 -4
- package/src/mvt/mvtPathsVertices.js +15 -8
- package/src/mvt/mvtPolygonPaths.js +19 -12
- package/src/mvt/numericMvtValue.js +11 -4
- package/src/mvt/readMvtFeature.js +46 -34
- package/src/mvt/readMvtField.js +17 -8
- package/src/mvt/readMvtGeometry.js +42 -29
- package/src/mvt/readMvtInteger.js +22 -12
- package/src/mvt/readMvtKnownValue.js +30 -21
- package/src/mvt/readMvtLayer.js +40 -31
- package/src/mvt/readMvtMessage.js +18 -10
- package/src/mvt/readMvtNumber.js +18 -9
- package/src/mvt/readMvtNumbers.js +18 -11
- package/src/mvt/readMvtString.js +14 -6
- package/src/mvt/readMvtValue.js +29 -19
- package/src/mvt/skipMvtField.js +22 -14
- package/src/mvt/sortMvtActiveEdges.js +20 -15
- package/src/mvt/sortedMvtLevels.js +29 -22
- package/src/mvt/takeMvtBytes.js +18 -8
- package/src/mvt/tessellateVectorRings.js +26 -19
- package/src/mvt/triangulateVectorRings.js +23 -19
- package/src/native/README.md +27 -0
- package/src/native/beforeNativeRender.js +21 -16
- package/src/native/bypassNativeEvent.js +21 -11
- package/src/native/canScaleNativeStyle.js +26 -17
- package/src/native/compareNativeHits.js +10 -2
- package/src/native/createNativeMesh.js +46 -31
- package/src/native/disposeNativeLayer.js +3 -2
- package/src/native/forwardNativeError.js +8 -3
- package/src/native/getGridTerrainTile.js +47 -34
- package/src/native/gridTerrainElevation.js +34 -26
- package/src/native/handleNativeMapEvent.js +9 -4
- package/src/native/hideTargets.js +6 -0
- package/src/native/initNativeGPU.js +6 -3
- package/src/native/isCurrentNativeLayer.js +9 -4
- package/src/native/loadGridTerrain.js +36 -26
- package/src/native/nativeAddLatLng.js +7 -0
- package/src/native/nativeBringToBack.js +7 -0
- package/src/native/nativeBringToFront.js +7 -0
- package/src/native/nativeEventSource.js +27 -18
- package/src/native/nativeEvents.js +5 -4
- package/src/native/nativeLayer.js +10 -6
- package/src/native/nativeLayerMethod.js +9 -2
- package/src/native/nativeProgram.js +28 -20
- package/src/native/nativeRedraw.js +7 -0
- package/src/native/nativeSetBounds.js +7 -0
- package/src/native/nativeSetIcon.js +7 -0
- package/src/native/nativeSetLatLng.js +7 -0
- package/src/native/nativeSetLatLngs.js +7 -0
- package/src/native/nativeSetOpacity.js +7 -0
- package/src/native/nativeSetRadius.js +7 -0
- package/src/native/nativeSetStyle.js +7 -0
- package/src/native/nativeSetUrl.js +7 -0
- package/src/native/nativeSetZIndex.js +7 -0
- package/src/native/nativeSetZIndexOffset.js +7 -0
- package/src/native/nativeTerrainElevation.js +27 -16
- package/src/native/nativeVectorGeometry.js +30 -23
- package/src/native/orderNativeGridLayer.js +20 -14
- package/src/native/prepareGridTerrainRequests.js +23 -16
- package/src/native/pruneNativeResources.js +25 -20
- package/src/native/putNativeMesh.js +14 -0
- package/src/native/quadNativeMesh.js +11 -1
- package/src/native/readyNativeGPU.js +10 -6
- package/src/native/refreshNativeEvent.js +5 -0
- package/src/native/refreshNativeLayer.js +5 -3
- package/src/native/refreshNativeLayerContract.js +5 -2
- package/src/native/rejectNativeReady.js +7 -2
- package/src/native/removeNativeEvents.js +18 -14
- package/src/native/removeTargets.js +5 -2
- package/src/native/reorderNativeLayer.js +5 -3
- package/src/native/resolveNativeReady.js +5 -2
- package/src/native/restoreNativeEvents.js +8 -5
- package/src/native/retainGridTerrain.js +15 -10
- package/src/native/styleNativeMesh.js +17 -11
- package/src/native/syncGridLayer.js +5 -1
- package/src/native/syncGridTile.js +28 -18
- package/src/native/syncImageOverlay.js +10 -5
- package/src/native/syncMarker.js +5 -0
- package/src/native/syncNativeStrokeAnchors.js +18 -12
- package/src/native/syncNativeStrokeZoom.js +34 -29
- package/src/native/syncTerrainGridTile.js +38 -28
- package/src/native/syncVectorLayer.js +5 -0
- package/src/native/synchronizeNativeLayer.js +5 -3
- package/src/native/terrainGridMesh.js +47 -34
- package/src/native/updateNativeHover.js +15 -7
- package/src/native/updateNativeLayerView.js +3 -3
- package/src/native/updateNativeStrokeRadius.js +14 -9
- package/src/picking/README.md +29 -0
- package/src/picking/collectVisibleMesh.js +8 -0
- package/src/picking/findFeature.js +4 -4
- package/src/picking/hit.js +14 -7
- package/src/picking/hitColliderCell.js +29 -19
- package/src/picking/hitMesh.js +8 -2
- package/src/picking/onClick.js +6 -5
- package/src/picking/onPointerLeave.js +5 -5
- package/src/picking/onPointerMove.js +6 -5
- package/src/picking/pointerClick.js +5 -0
- package/src/picking/pointerLeave.js +1 -0
- package/src/picking/pointerMove.js +5 -0
- package/src/picking/raycast.js +2 -4
- package/src/picking/setHighlight.js +6 -5
- package/src/picking/shouldSkipOther.js +8 -2
- package/src/picking/showFeature.js +7 -4
- package/src/picking/validateCameraInverse.js +15 -8
- package/src/projections/README.md +28 -0
- package/src/projections/cameraAngles.js +8 -1
- package/src/projections/displayContainerPoint.js +32 -23
- package/src/projections/groundBounds.js +9 -1
- package/src/projections/localPixel.js +8 -0
- package/src/projections/localPixelForGeometry.js +8 -1
- package/src/projections/localPosition.js +8 -2
- package/src/projections/markerCameraIconPoint.js +9 -1
- package/src/projections/projectBridgePoint.js +16 -4
- package/src/projections/projectCameraPoint.js +11 -1
- package/src/projections/projectCelestialBody.js +11 -2
- package/src/projections/projectRing.js +11 -1
- package/src/projections/projectTreePoint.js +9 -1
- package/src/projections/toPoint.js +12 -4
- package/src/projections/transformZoomAnimationPoint.js +16 -9
- package/src/projections/verticalGroundY.js +14 -3
- package/src/projections/walkerLocalPosition.js +7 -0
- package/src/raster/README.md +28 -0
- package/src/raster/addRasterTile.js +10 -2
- package/src/raster/comparePendingTiles.js +8 -0
- package/src/raster/createRasterMesh.js +6 -5
- package/src/raster/finishRasterAttachment.js +9 -4
- package/src/raster/finishRasterTile.js +11 -2
- package/src/raster/getRasterEvents.js +7 -0
- package/src/raster/getRasterTileSize.js +5 -1
- package/src/raster/initRaster.js +6 -3
- package/src/raster/isRasterLoading.js +7 -3
- package/src/raster/loadRasterTile.js +8 -3
- package/src/raster/onPMTileAdd.js +6 -3
- package/src/raster/onPMTileRemove.js +6 -3
- package/src/raster/pruneRasterTiles.js +7 -3
- package/src/raster/pumpRasterTiles.js +5 -4
- package/src/raster/rasterTileRange.js +32 -23
- package/src/raster/readyRaster.js +8 -3
- package/src/raster/registerTerrainTile.js +9 -3
- package/src/raster/releaseRasterTile.js +6 -3
- package/src/raster/releaseRasterTiles.js +5 -3
- package/src/raster/removeRasterTile.js +6 -3
- package/src/raster/reportRasterError.js +8 -0
- package/src/raster/retainRasterTiles.js +19 -14
- package/src/raster/setPMTileOpacity.js +8 -0
- package/src/raster/setPMTileZIndex.js +8 -0
- package/src/raster/setRasterOpacity.js +6 -3
- package/src/raster/setRasterTerrain.js +6 -3
- package/src/raster/setRasterZIndex.js +6 -3
- package/src/raster/updateAttachedTiles.js +9 -3
- package/src/raster/updateRasterTiles.js +5 -5
- package/src/rendering/README.md +32 -0
- package/src/rendering/collectFrameMeshes.js +7 -3
- package/src/rendering/collectMeshes.js +11 -0
- package/src/rendering/collectVisibleMesh.js +48 -39
- package/src/rendering/compareMeshDepth.js +14 -6
- package/src/rendering/compareMeshes.js +10 -1
- package/src/rendering/createMesh.js +8 -5
- package/src/rendering/disposeMesh.js +6 -0
- package/src/rendering/drawGeometry.js +9 -2
- package/src/rendering/drawPipeline.js +44 -34
- package/src/rendering/drawSceneMeshes.js +9 -3
- package/src/rendering/nativeStrokeExpansion.js +11 -4
- package/src/rendering/prepareFrameBuffer.js +22 -16
- package/src/rendering/prepareFrameMeshes.js +10 -3
- package/src/rendering/prepareFrameUniforms.js +8 -3
- package/src/rendering/prepareMeshUniforms.js +36 -27
- package/src/rendering/render.js +2 -5
- package/src/rendering/resizeRenderer.js +6 -3
- package/src/rendering/revealRoofMesh.js +43 -34
- package/src/scene/README.md +36 -0
- package/src/scene/addRegisteredLayer.js +5 -4
- package/src/scene/addSceneLayer.js +22 -16
- package/src/scene/attachLayer.js +8 -3
- package/src/scene/attachSharedScene.js +6 -1
- package/src/scene/callLayer.js +31 -25
- package/src/scene/cancelUpdate.js +5 -3
- package/src/scene/createLayer.js +12 -6
- package/src/scene/createSceneNode.js +5 -1
- package/src/scene/emptyEvents.js +5 -0
- package/src/scene/failAttachment.js +9 -3
- package/src/scene/get3DEvents.js +7 -3
- package/src/scene/getLocation.js +10 -6
- package/src/scene/init3D.js +6 -3
- package/src/scene/initializeLayer.js +9 -2
- package/src/scene/initializerFor.js +8 -0
- package/src/scene/isNativeLayer.js +17 -11
- package/src/scene/layerInitialize.js +7 -4
- package/src/scene/onAdd3DLayer.js +6 -4
- package/src/scene/onMapChange.js +0 -5
- package/src/scene/onRemove3DLayer.js +6 -5
- package/src/scene/ready3D.js +9 -3
- package/src/scene/releaseSharedScene.js +6 -2
- package/src/scene/removeLayerEvents.js +1 -3
- package/src/scene/removeSceneLayer.js +20 -14
- package/src/scene/renderPendingMapChange.js +1 -4
- package/src/scene/renderPendingUpdates.js +5 -4
- package/src/scene/reportLayerError.js +9 -3
- package/src/scene/resolveNextInitialization.js +5 -2
- package/src/scene/restoreObject.js +6 -3
- package/src/scene/scheduleSceneUpdate.js +7 -6
- package/src/scene/setParent.js +6 -2
- package/src/scene/traverse.js +7 -2
- package/src/shaders/README.md +29 -0
- package/src/shaders/materialBaseShader.js +26 -17
- package/src/shaders/materialShaders.js +9 -1
- package/src/shaders/materialSurfaceShader.js +60 -47
- package/src/shaders/materialVertexShader.js +89 -77
- package/src/shaders/nativeStrokeShader.js +13 -6
- package/src/shaders/roofVertexShader.js +16 -9
- package/src/shadows/README.md +28 -0
- package/src/shadows/bindSunlight.js +5 -3
- package/src/shadows/drawShadowMeshes.js +7 -2
- package/src/shadows/ensureShadowPipeline.js +7 -0
- package/src/shadows/renderSunlight.js +8 -4
- package/src/shadows/resizeSunlight.js +6 -3
- package/src/shadows/shadowCacheMatches.js +11 -1
- package/src/shadows/shadowMatrix.js +8 -1
- package/src/shadows/shadowMeshMatches.js +19 -11
- package/src/sources/README.md +33 -0
- package/src/sources/attachAreaMesh.js +5 -4
- package/src/sources/buildArea.js +13 -2
- package/src/sources/buildAreaFeature.js +7 -1
- package/src/sources/buildAreaFeatures.js +23 -14
- package/src/sources/compareAreaDistance.js +8 -0
- package/src/sources/extrusionStyle.js +21 -10
- package/src/sources/featureAnchor.js +21 -9
- package/src/sources/groundOffset.js +9 -2
- package/src/sources/initVectorTiles.js +21 -15
- package/src/sources/initializeGeoJSON.js +6 -3
- package/src/sources/isVectorTileSource.js +11 -4
- package/src/sources/matchesAreaTile.js +17 -7
- package/src/sources/pendingSourceAreas.js +26 -19
- package/src/sources/prepareAreaGeometryJob.js +34 -24
- package/src/sources/projectAreaPolygons.js +25 -15
- package/src/sources/pumpSourceAreas.js +6 -6
- package/src/sources/readyVectorTiles.js +17 -10
- package/src/sources/releaseArea.js +6 -4
- package/src/sources/setGeoJSONData.js +8 -3
- package/src/sources/setGeoJSONLayerData.js +7 -0
- package/src/sources/sourceAreaContext.js +9 -2
- package/src/sources/updateArea.js +5 -5
- package/src/sources/updateSourceStatus.js +6 -3
- package/src/sunlight/README.md +28 -0
- package/src/sunlight/addTimeControlToMap.js +17 -10
- package/src/sunlight/addTimeLayer.js +10 -5
- package/src/sunlight/atmosphere.js +9 -2
- package/src/sunlight/createSun.js +7 -0
- package/src/sunlight/initSunlight.js +5 -0
- package/src/sunlight/initializeTimeControl.js +15 -13
- package/src/sunlight/onAddSun.js +35 -26
- package/src/sunlight/onAddTimeControl.js +12 -5
- package/src/sunlight/onRemoveSun.js +10 -10
- package/src/sunlight/removeSun.js +22 -20
- package/src/sunlight/removeTimeControl.js +13 -7
- package/src/sunlight/removeTimeLayer.js +8 -5
- package/src/sunlight/requestSunlightRender.js +10 -7
- package/src/sunlight/styleTimeControl.js +13 -7
- package/src/sunlight/tickSun.js +10 -5
- package/src/sunlight/updateCelestialDisc.js +23 -12
- package/src/sunlight/updateSky.js +5 -3
- package/src/sunlight/updateSun.js +42 -40
- package/src/sunlight/useLiveTime.js +11 -6
- package/src/sunlight/useSelectedTime.js +24 -22
- package/src/terrain/README.md +30 -0
- package/src/terrain/applyTerrain.js +26 -20
- package/src/terrain/clearLayerTerrain.js +5 -3
- package/src/terrain/copyTerrainTile.js +20 -12
- package/src/terrain/getElevation.js +8 -5
- package/src/terrain/initTerrain.js +5 -3
- package/src/terrain/loadReadyTerrain.js +6 -5
- package/src/terrain/loadTerrain.js +10 -2
- package/src/terrain/loadTerrainTiles.js +10 -3
- package/src/terrain/mapElevationOf.js +19 -11
- package/src/terrain/onTerrainAdd.js +8 -4
- package/src/terrain/onTerrainChange.js +5 -5
- package/src/terrain/onTerrainRemove.js +6 -3
- package/src/terrain/readBridges.js +13 -4
- package/src/terrain/readyTerrainOf.js +14 -7
- package/src/terrain/sampleTerrainTile.js +16 -7
- package/src/terrain/setLayerTerrain.js +5 -3
- package/src/terrain/setTerrainHeight.js +5 -4
- package/src/terrain/terrainAtlas.js +8 -2
- package/src/terrain/terrainElevation.js +8 -2
- package/src/terrain/terrainTileQueue.js +31 -24
- package/src/textures/README.md +29 -0
- package/src/textures/addImageState.js +12 -7
- package/src/textures/attachRasterImage.js +1 -2
- package/src/textures/bindMeshTextures.js +57 -50
- package/src/textures/collectRoofTiles.js +21 -14
- package/src/textures/compareRoofTiles.js +8 -0
- package/src/textures/composeRoofAtlas.js +11 -3
- package/src/textures/destroyTexture.js +6 -4
- package/src/textures/destroyTextureAfterSubmission.js +9 -0
- package/src/textures/ensureRoofBlit.js +5 -0
- package/src/textures/loadModelImage.js +28 -18
- package/src/textures/modelTextureFor.js +45 -37
- package/src/textures/modelTextureSampler.js +7 -2
- package/src/textures/nativeImageError.js +5 -1
- package/src/textures/nativeImageRefresh.js +5 -2
- package/src/textures/nativeTextureFor.js +11 -3
- package/src/textures/prepareMeshTextures.js +31 -23
- package/src/textures/rebuildRoofAtlas.js +8 -3
- package/src/textures/removeImageState.js +11 -6
- package/src/textures/resizeRoofTexture.js +30 -23
- package/src/textures/restoreMaterialTextures.js +22 -16
- package/src/textures/textureBinding.js +9 -0
- package/src/textures/updateRoofAtlas.js +25 -19
- package/src/textures/updateRoofRaster.js +8 -0
- package/src/textures/uploadCanvasTexture.js +15 -0
- package/src/textures/uploadMeshTexture.js +32 -26
- package/src/textures/uploadNativeImage.js +26 -13
- package/src/textures/uploadRoofTile.js +29 -23
- package/src/traffic/README.md +30 -0
- package/src/traffic/addTraffic.js +5 -2
- package/src/traffic/clockMinutes.js +7 -0
- package/src/traffic/compareDepartures.js +8 -0
- package/src/traffic/createTrafficMesh.js +15 -4
- package/src/traffic/destroyTrafficGpu.js +5 -0
- package/src/traffic/disposeTrafficObject.js +14 -11
- package/src/traffic/drawTrafficRoute.js +5 -1
- package/src/traffic/failTraffic.js +12 -6
- package/src/traffic/failedTrafficLoad.js +9 -2
- package/src/traffic/featuresToTrafficLanes.js +8 -0
- package/src/traffic/fetchTrafficLanes.js +21 -10
- package/src/traffic/groundTraffic.js +5 -1
- package/src/traffic/initTraffic.js +17 -15
- package/src/traffic/loadTraffic.js +5 -0
- package/src/traffic/loadedTrafficLanes.js +19 -12
- package/src/traffic/locateTraffic.js +20 -11
- package/src/traffic/moveTraffic.js +21 -15
- package/src/traffic/placeTraffic.js +5 -0
- package/src/traffic/prepareTraffic.js +5 -3
- package/src/traffic/readyTraffic.js +8 -3
- package/src/traffic/rebaseTraffic.js +5 -3
- package/src/traffic/rebuildTrafficMesh.js +5 -1
- package/src/traffic/refreshTrafficTrips.js +42 -32
- package/src/traffic/removeTraffic.js +5 -2
- package/src/traffic/routeColor.js +13 -6
- package/src/traffic/scheduledTrips.js +5 -2
- package/src/traffic/startTraffic.js +10 -5
- package/src/traffic/tickTraffic.js +5 -3
- package/src/traffic/trafficBounds.js +5 -0
- package/src/traffic/trafficNow.js +14 -9
- package/src/traffic/trafficStatusText.js +13 -5
- package/src/traffic/trafficStorage.js +13 -5
- package/src/traffic/trafficTooltip.js +7 -0
- package/src/traffic/tripsAt.js +9 -2
- package/src/traffic/updateTraffic.js +11 -8
- package/src/traffic/updateTrafficLights.js +23 -18
- package/src/traffic/updateTrafficPose.js +15 -8
- package/src/traffic/updateTrafficTerrain.js +12 -7
- package/src/traffic/uploadTrafficLanes.js +27 -21
- package/src/traffic/vehicleOffsets.js +9 -3
- package/src/transforms/README.md +27 -0
- package/src/transforms/composeLocalTransform.js +23 -16
- package/src/transforms/modelNodeMatrix.js +7 -2
- package/src/transforms/transformNativePoint.js +19 -7
- package/src/transforms/updateWorldMatrix.js +5 -2
- package/src/transforms/worldMatrixChanged.js +26 -18
- package/src/triangulation/README.md +26 -0
- package/src/triangulation/area.js +7 -0
- package/src/triangulation/clean.js +9 -0
- package/src/triangulation/clipEars.js +32 -23
- package/src/triangulation/connectHole.js +30 -18
- package/src/triangulation/containsVertex.js +10 -0
- package/src/triangulation/cross.js +12 -3
- package/src/triangulation/crossesBoundary.js +10 -0
- package/src/triangulation/crossesRing.js +9 -0
- package/src/triangulation/equal.js +11 -3
- package/src/triangulation/inside.js +8 -0
- package/src/triangulation/insideHole.js +8 -0
- package/src/triangulation/intersects.js +21 -11
- package/src/triangulation/isClockWise.js +4 -1
- package/src/triangulation/mergeHoles.js +19 -11
- package/src/triangulation/minimumX.js +7 -0
- package/src/triangulation/on.js +13 -4
- package/src/triangulation/polygonRings.js +22 -14
- package/src/triangulation/sortHoles.js +7 -0
- package/src/triangulation/triangulate.js +3 -2
- package/src/triangulation/validateArea.js +19 -10
- package/src/utils/README.md +16 -0
- package/src/utils/compareDistance.js +11 -3
- package/src/utils/noOperation.js +1 -0
- package/src/utils/wrap.js +7 -0
- package/src/utils/yieldTask.js +12 -5
- package/src/vector-style/README.md +27 -0
- package/src/vector-style/appendQuotedStyleCharacter.js +30 -22
- package/src/vector-style/arrayContainsRange.js +18 -8
- package/src/vector-style/evaluateBoolean.js +31 -18
- package/src/vector-style/evaluateCoalesceOrCase.js +34 -21
- package/src/vector-style/evaluateComparison.js +29 -16
- package/src/vector-style/evaluateIExpression.js +21 -8
- package/src/vector-style/evaluateInput.js +16 -6
- package/src/vector-style/evaluateInterpolate.js +36 -27
- package/src/vector-style/evaluateMatch.js +21 -12
- package/src/vector-style/evaluateMath.js +26 -14
- package/src/vector-style/evaluateMembership.js +29 -18
- package/src/vector-style/evaluateNegation.js +26 -13
- package/src/vector-style/evaluatePrimitive.js +21 -9
- package/src/vector-style/evaluateStep.js +20 -11
- package/src/vector-style/evaluateStyle.js +43 -33
- package/src/vector-style/evaluateToExpression.js +27 -14
- package/src/vector-style/fillVectorPaint.js +26 -17
- package/src/vector-style/lineVectorPaint.js +31 -21
- package/src/vector-style/parseFunctionalColor.js +23 -14
- package/src/vector-style/parseHexColor.js +20 -13
- package/src/vector-style/parseVectorStyle.js +20 -13
- package/src/vector-style/readPaintValue.js +17 -6
- package/src/vector-style/removeTrailingCommas.js +19 -12
- package/src/vector-style/scaleDashArray.js +25 -13
- package/src/vector-style/skipStyleComment.js +20 -9
- package/src/vector-style/stripStyleComments.js +28 -21
- package/src/vector-style/styleColor.js +18 -11
- package/src/vector-style/validateVectorLayers.js +18 -10
- package/src/vector-style/vectorPaint.js +17 -8
- package/src/vector-style/visibleStyle.js +16 -7
- package/src/vector-tiles/README.md +30 -0
- package/src/vector-tiles/appendVectorBatch.js +34 -22
- package/src/vector-tiles/attachVectorTileBatch.js +25 -17
- package/src/vector-tiles/attachVectorTileBatches.js +26 -15
- package/src/vector-tiles/compareVectorLabelPriority.js +11 -3
- package/src/vector-tiles/compareVectorTileDistance.js +11 -3
- package/src/vector-tiles/configureVectorTileLayer.js +8 -0
- package/src/vector-tiles/createVectorLabel.js +37 -22
- package/src/vector-tiles/forwardVectorTileError.js +10 -5
- package/src/vector-tiles/loadVectorSprite.js +14 -5
- package/src/vector-tiles/loadVectorTile.js +45 -36
- package/src/vector-tiles/onVectorTileAdd.js +44 -39
- package/src/vector-tiles/onVectorTileMessage.js +15 -10
- package/src/vector-tiles/onVectorTileRemove.js +25 -20
- package/src/vector-tiles/onVectorTileWorkerError.js +16 -11
- package/src/vector-tiles/paintVectorTileBatch.js +18 -12
- package/src/vector-tiles/prepareVectorLabel.js +34 -25
- package/src/vector-tiles/prepareVectorStyleLayer.js +38 -30
- package/src/vector-tiles/prepareVectorTile.js +29 -16
- package/src/vector-tiles/projectVectorPaths.js +25 -15
- package/src/vector-tiles/projectVectorPoint.js +15 -6
- package/src/vector-tiles/projectVectorTriangles.js +28 -18
- package/src/vector-tiles/pruneVectorTiles.js +14 -11
- package/src/vector-tiles/pumpVectorTiles.js +21 -18
- package/src/vector-tiles/readTileJSON.js +27 -17
- package/src/vector-tiles/readVectorStyle.js +28 -17
- package/src/vector-tiles/refreshVectorTiles.js +8 -5
- package/src/vector-tiles/reserveVectorLabelCells.js +14 -6
- package/src/vector-tiles/retireVectorTileGroup.js +20 -13
- package/src/vector-tiles/revokeVectorWorkerUrl.js +14 -9
- package/src/vector-tiles/rotateVectorLabel.js +19 -12
- package/src/vector-tiles/rotateVectorLabels.js +9 -6
- package/src/vector-tiles/simplifyVectorPath.js +29 -21
- package/src/vector-tiles/updateVectorLabelMarker.js +36 -27
- package/src/vector-tiles/updateVectorLabelStyle.js +14 -8
- package/src/vector-tiles/updateVectorTileLabels.js +33 -28
- package/src/vector-tiles/updateVectorTilePaint.js +25 -20
- package/src/vector-tiles/updateVectorTiles.js +32 -29
- package/src/vector-tiles/validateVectorTileZooms.js +15 -6
- package/src/vector-tiles/vectorFeaturePaint.js +25 -15
- package/src/vector-tiles/vectorFeaturePaths.js +26 -16
- package/src/vector-tiles/vectorFeatureZoom.js +18 -8
- package/src/vector-tiles/vectorLabelAnchors.js +31 -24
- package/src/vector-tiles/vectorLabelCandidates.js +18 -11
- package/src/vector-tiles/vectorLabelCells.js +32 -23
- package/src/vector-tiles/vectorLabelIcon.js +38 -30
- package/src/vector-tiles/vectorLabelProperty.js +12 -3
- package/src/vector-tiles/vectorLabelText.js +19 -10
- package/src/vector-tiles/vectorSpriteIcon.js +19 -11
- package/src/vector-tiles/vectorStraightRun.js +23 -14
- package/src/vector-tiles/vectorStyleDependencies.js +22 -15
- package/src/vector-tiles/vectorStyleValue.js +16 -5
- package/src/vector-tiles/vectorStyleZoom.js +12 -6
- package/src/vector-tiles/vectorTileAwaited.js +17 -9
- package/src/vector-tiles/vectorTileOverlaps.js +12 -4
- package/src/vector-tiles/vectorTilePaint.js +18 -10
- package/src/vector-tiles/vectorTileSettings.js +27 -17
- package/src/vector-tiles/vectorTilesIdle.js +11 -3
- package/src/vector-tiles/vectorTolerance.js +11 -4
- package/src/vector-tiles/wrapVectorLabel.js +17 -11
- package/src/vehicles/README.md +27 -0
- package/src/vehicles/bicycleModel.js +7 -1
- package/src/vehicles/boatBenches.js +5 -0
- package/src/vehicles/boatModel.js +32 -32
- package/src/vehicles/buildCarriage.js +9 -1
- package/src/vehicles/busModel.js +10 -2
- package/src/vehicles/carModel.js +34 -33
- package/src/vehicles/metroModel.js +8 -0
- package/src/vehicles/mirrorVehiclePart.js +11 -0
- package/src/vehicles/pedestrianModel.js +7 -1
- package/src/vehicles/tramModel.js +8 -0
- package/src/walk/README.md +30 -0
- package/src/walk/animateWalker.js +5 -4
- package/src/walk/createWalk.js +6 -3
- package/src/walk/initWalk.js +5 -0
- package/src/walk/initializeWalkControl.js +11 -6
- package/src/walk/isWalkBlocked.js +15 -6
- package/src/walk/landWalker.js +35 -31
- package/src/walk/moveWalker.js +35 -22
- package/src/walk/onAddWalkControl.js +40 -31
- package/src/walk/onRemoveWalkControl.js +17 -12
- package/src/walk/onWalkBlur.js +3 -2
- package/src/walk/onWalkKey.js +5 -2
- package/src/walk/onWalkPointer.js +6 -0
- package/src/walk/onWalkTerrain.js +3 -2
- package/src/walk/placeWalker.js +1 -2
- package/src/walk/resolveWalkerPosition.js +33 -28
- package/src/walk/startWalking.js +1 -1
- package/src/walk/stepWalkerHeight.js +18 -11
- package/src/walk/stopWalking.js +1 -0
- package/src/walk/toggleWalking.js +3 -2
- package/src/walk/updateWalkerFrame.js +29 -19
- package/src/walk/updateWalkerView.js +31 -22
- package/src/weakmaps/README.md +33 -0
- package/src/weakmaps/addedByLayer.js +5 -0
- package/src/weakmaps/archiveHeaderByLayer.js +5 -0
- package/src/weakmaps/areasByLayer.js +5 -0
- package/src/weakmaps/boundsMethods.js +5 -0
- package/src/weakmaps/bridgeMeshByLayer.js +5 -0
- package/src/weakmaps/bridgesByLayer.js +5 -0
- package/src/weakmaps/cameraAnimationByMap.js +5 -0
- package/src/weakmaps/cameraBearingByMap.js +5 -0
- package/src/weakmaps/cameraByLayer.js +5 -0
- package/src/weakmaps/cameraDraggableByMap.js +5 -0
- package/src/weakmaps/cameraFields.js +5 -0
- package/src/weakmaps/cameraFrameByMap.js +5 -0
- package/src/weakmaps/cameraHandlersByMap.js +6 -1
- package/src/weakmaps/cameraMaps.js +5 -0
- package/src/weakmaps/cameraPitchByMap.js +5 -0
- package/src/weakmaps/cameraReadyByMap.js +5 -0
- package/src/weakmaps/cameraTouchStateByMap.js +5 -0
- package/src/weakmaps/cameraViewByMap.js +5 -0
- package/src/weakmaps/cameraZIndexOffsetByLayer.js +5 -0
- package/src/weakmaps/closestMethods.js +5 -0
- package/src/weakmaps/colliders.js +5 -0
- package/src/weakmaps/containerByLayer.js +5 -0
- package/src/weakmaps/controlByLayer.js +5 -0
- package/src/weakmaps/countStatusByLayer.js +5 -0
- package/src/weakmaps/cursorByLayer.js +5 -0
- package/src/weakmaps/demByLayer.js +5 -0
- package/src/weakmaps/directoriesByLayer.js +5 -0
- package/src/weakmaps/dragByHandler.js +5 -0
- package/src/weakmaps/dragStates.js +5 -0
- package/src/weakmaps/etagByLayer.js +5 -0
- package/src/weakmaps/eventMapByLayer.js +5 -0
- package/src/weakmaps/eventsByLayer.js +5 -0
- package/src/weakmaps/fadeFrameByLayer.js +5 -0
- package/src/weakmaps/fadeVersionByLayer.js +5 -0
- package/src/weakmaps/frameByLayer.js +5 -0
- package/src/weakmaps/geojsonByLayer.js +5 -0
- package/src/weakmaps/geometryWorkersByMap.js +6 -1
- package/src/weakmaps/gridInitializers.js +5 -0
- package/src/weakmaps/groupByLayer.js +5 -0
- package/src/weakmaps/headerByLayer.js +5 -0
- package/src/weakmaps/highlightedFeatureByLayer.js +5 -0
- package/src/weakmaps/hoveredFeatureByLayer.js +5 -0
- package/src/weakmaps/imageStates.js +5 -0
- package/src/weakmaps/inflightByLayer.js +5 -0
- package/src/weakmaps/kindByLayer.js +5 -0
- package/src/weakmaps/layersByLayer.js +5 -0
- package/src/weakmaps/loadingTilesByLayer.js +5 -0
- package/src/weakmaps/locationByLayer.js +5 -0
- package/src/weakmaps/modelByLayer.js +5 -0
- package/src/weakmaps/modelUrlByLayer.js +5 -0
- package/src/weakmaps/nativeEventMaps.js +5 -0
- package/src/weakmaps/nativeGPUBackByMap.js +5 -0
- package/src/weakmaps/nativeGPUByLayer.js +5 -0
- package/src/weakmaps/nativeGPUOrderByMap.js +5 -0
- package/src/weakmaps/nativeProgramsByRenderer.js +6 -1
- package/src/weakmaps/nativeRenderByLayer.js +5 -0
- package/src/weakmaps/pathProjectionByMap.js +6 -1
- package/src/weakmaps/pitchSkyByMap.js +5 -0
- package/src/weakmaps/pointerEventsByLayer.js +5 -0
- package/src/weakmaps/pruneAfterByLayer.js +5 -0
- package/src/weakmaps/pruneVersionByLayer.js +5 -0
- package/src/weakmaps/pruneWantedByLayer.js +5 -0
- package/src/weakmaps/queuedByLayer.js +5 -0
- package/src/weakmaps/rasterGeometryByLayer.js +5 -0
- package/src/weakmaps/rasterProgramByLayer.js +5 -0
- package/src/weakmaps/rasterTilesByLayer.js +5 -0
- package/src/weakmaps/rasterVersionByLayer.js +5 -0
- package/src/weakmaps/raycasterByLayer.js +5 -0
- package/src/weakmaps/readyByLayer.js +5 -0
- package/src/weakmaps/rendererByLayer.js +5 -0
- package/src/weakmaps/rendererDevices.js +5 -0
- package/src/weakmaps/rendererReadyByLayer.js +5 -0
- package/src/weakmaps/renderers.js +5 -0
- package/src/weakmaps/roofRasterByLayer.js +5 -0
- package/src/weakmaps/roofRastersByLayer.js +5 -0
- package/src/weakmaps/rootByLayer.js +5 -0
- package/src/weakmaps/rotateControlByMap.js +5 -0
- package/src/weakmaps/sceneByLayer.js +5 -0
- package/src/weakmaps/sceneFields.js +5 -0
- package/src/weakmaps/sceneLayers.js +5 -0
- package/src/weakmaps/sceneOriginByLayer.js +5 -0
- package/src/weakmaps/shadowMeshesByLayer.js +5 -0
- package/src/weakmaps/sharedByLayer.js +5 -0
- package/src/weakmaps/sizeByLayer.js +5 -0
- package/src/weakmaps/state3dByLayer.js +5 -0
- package/src/weakmaps/streamTerrainByLayer.js +6 -1
- package/src/weakmaps/streamTerrainByMap.js +6 -1
- package/src/weakmaps/sunByMap.js +6 -1
- package/src/weakmaps/sunlightByControl.js +5 -0
- package/src/weakmaps/sunlightByMap.js +5 -0
- package/src/weakmaps/terrain3DByLayer.js +5 -0
- package/src/weakmaps/terrain3DByMap.js +5 -0
- package/src/weakmaps/terrainArchiveByLayer.js +5 -0
- package/src/weakmaps/terrainBaseYByLayer.js +5 -0
- package/src/weakmaps/terrainBoundsByLayer.js +5 -0
- package/src/weakmaps/terrainControllerByLayer.js +5 -0
- package/src/weakmaps/terrainGridsByLayer.js +5 -0
- package/src/weakmaps/terrainLoadingByLayer.js +5 -0
- package/src/weakmaps/terrainOriginElevationByLayer.js +5 -0
- package/src/weakmaps/terrainPromiseByLayer.js +5 -0
- package/src/weakmaps/terrainReadyByLayer.js +5 -0
- package/src/weakmaps/terrainRequestByLayer.js +5 -0
- package/src/weakmaps/terrainSourceByLayer.js +5 -0
- package/src/weakmaps/terrainTilesByLayer.js +5 -0
- package/src/weakmaps/terrainZoomByLayer.js +5 -0
- package/src/weakmaps/tileZoomByLayer.js +5 -0
- package/src/weakmaps/timeControlByMap.js +5 -0
- package/src/weakmaps/tooltipByLayer.js +5 -0
- package/src/weakmaps/touchByContainer.js +5 -0
- package/src/weakmaps/touchPitchByMap.js +5 -0
- package/src/weakmaps/touchRotateByMap.js +5 -0
- package/src/weakmaps/trafficByLayer.js +5 -0
- package/src/weakmaps/typeByLayer.js +5 -0
- package/src/weakmaps/urlByLayer.js +5 -0
- package/src/weakmaps/vectorTileOptionsByLayer.js +6 -1
- package/src/weakmaps/vectorWorkerByLayer.js +6 -1
- package/src/weakmaps/visibleMeshesByLayer.js +5 -0
- package/src/weakmaps/walkByMap.js +6 -1
- package/src/weakmaps/walkerByLayer.js +5 -0
- package/src/weakmaps/wantedRasterTilesByLayer.js +5 -0
- package/src/weakmaps/workerMapByLayer.js +6 -1
- package/src/weakmaps/zoomLevelByLayer.js +5 -0
- package/src/weakmaps/zoomTransitionsByLayer.js +5 -0
- package/src/weakmaps/zoomViewByLayer.js +5 -0
- package/src/workers/README.md +33 -0
- package/src/workers/acquireGeometryWorker.js +39 -29
- package/src/workers/buildAreaInWorker.js +24 -16
- package/src/workers/closeGeometryWorkers.js +16 -11
- package/src/workers/cogWorker.js +27 -20
- package/src/workers/createGeometryWorker.js +30 -20
- package/src/workers/geometryWorker.js +34 -29
- package/src/workers/getCogInWorker.js +18 -7
- package/src/workers/modelWorker.js +17 -10
- package/src/workers/openCogInWorker.js +22 -14
- package/src/workers/runSourceWorker.js +44 -32
- package/src/workers/settleGeometryWorker.js +16 -10
- package/src/workers/startGeometryWorker.js +23 -16
- package/src/workers/vectorTileWorker.js +15 -10
- package/src/collision/setTrafficNormal.js +0 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["openlayers-bindings.js"],
|
|
4
|
-
"sourcesContent": ["// Leaflet-compatible classes backed by OpenLayers. Load after ol.js and before the plugin.\r\n(() => {\r\n if (!window.ol) throw new Error('Unable to load OpenLayers');\r\n\r\n const style = document.createElement('style');\r\n style.dataset.openlayersBindings = '';\r\n style.textContent = `\r\n.openlayers-city-mapper {\r\n position: relative;\r\n overflow: hidden;\r\n touch-action: none;\r\n}\r\n.ol-viewport {\r\n position: absolute !important;\r\n inset: 0;\r\n}\r\n.ol-overlaycontainer-stopevent { z-index: 1000 !important; }\r\n.ol-city-corner {\r\n position: absolute;\r\n display: flex;\r\n flex-direction: column;\r\n gap: .5em;\r\n pointer-events: none;\r\n}\r\n.ol-city-topleft { top: 5em; left: .5em; }\r\n.ol-city-topright { top: 10px; right: 10px; }\r\n.ol-city-bottomleft { bottom: .5em; left: .5em; }\r\n.ol-city-bottomright { bottom: 4em; right: .5em; }\r\n.ol-attribution {\r\n text-align: justify;\r\n border-radius: 0 !important;\r\n left: 0;\r\n right: 0 !important;\r\n max-width: unset;\r\n font-family: \"Helvetica Neue\", Arial, Helvetica, sans-serif;\r\n font-size: .75rem;\r\n line-height: 1.5;\r\n}\r\n.ol-attribution a { color: #0078A8; }\r\n.ol-attribution * { text-shadow: none !important; }\r\n.ol-city-control {\r\n position: static;\r\n pointer-events: auto;\r\n font: 13px/1.5 sans-serif;\r\n}\r\n.ol-city-rotate {\r\n padding: 0;\r\n border: 1px solid #0003;\r\n border-radius: 4px;\r\n background: #fff;\r\n background-clip: padding-box;\r\n}\r\n.ol-city-rotate a {\r\n display: block;\r\n width: 30px;\r\n height: 30px;\r\n border-radius: 2px;\r\n color: #000;\r\n text-decoration: none;\r\n}\r\n.ol-city-rotate a:hover { background: #f4f4f4; }\r\n.ol-city-rotate a:focus-visible { outline: 2px solid #2675c9; }\r\n.ol-city-layers {\r\n max-height: calc(100vh - 5em);\r\n overflow: auto;\r\n border-radius: 4px;\r\n}\r\n.ol-city-layers section { padding: .5em; background: var(--ol-background-color); }\r\n.ol-city-layers label { display: block; cursor: pointer; white-space: nowrap; }\r\n.ol-city-layers input { vertical-align: middle; }\r\n.ol-city-layers hr { border: 0; border-top: 1px solid #ccc; }\r\n.ol-city-layers .ol-control { background: transparent; }\r\n.ol-city-layers .sunlight-time button { width: auto; padding: 0 .4em; flex-shrink: 0; }\r\n.openlayers-city-mapper .leaflet-pane {\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n}\r\n.ol-zoom button { width: 30px; height: 30px; }\r\n.openlayers-city-mapper .leaflet-marker-icon,\r\n.openlayers-city-mapper .leaflet-marker-shadow {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n}\r\n.openlayers-city-mapper .leaflet-marker-icon { pointer-events: auto; cursor: pointer; }\r\n.openlayers-city-mapper .leaflet-div-icon { background: #fff; border: 1px solid #666; }\r\n.ol-city-popup {\r\n padding: 10px;\r\n background: white;\r\n border: 1px solid #888;\r\n border-radius: 4px;\r\n font: 14px sans-serif;\r\n}\r\n.ol-city-popup button { float: right; margin-left: 12px; }\r\n.ol-city-tooltip {\r\n position: absolute;\r\n z-index: 1100;\r\n padding: 4px 8px;\r\n background: white;\r\n border: 1px solid #888;\r\n pointer-events: none;\r\n}\r\n`;\r\n document.head.appendChild(style);\r\n\r\n const L = window.L = { version: '1.9.4-openlayers', control: {} };\r\n let lastId = 0;\r\n const stamp = object => object._leaflet_id ||= ++lastId;\r\n const setOptions = (object, options) => object.options = { ...object.options, ...options };\r\n const zoomTiming = new Animation(new KeyframeEffect(null, [], {\r\n duration: 1, fill: 'both', easing: 'cubic-bezier(0,0,0.25,1)',\r\n }));\r\n\r\n function Class(...args) {\r\n this.initialize?.(...args);\r\n this.callInitHooks();\r\n }\r\n Class.extend = function (properties) {\r\n function Child(...args) {\r\n this.initialize?.(...args);\r\n this.callInitHooks();\r\n }\r\n Object.setPrototypeOf(Child, this);\r\n Child.prototype = Object.create(this.prototype);\r\n Object.assign(Child.prototype, properties, { constructor: Child });\r\n Child.prototype.options = { ...this.prototype.options, ...properties.options };\r\n Child.prototype._initHooks = [];\r\n return Child;\r\n };\r\n Class.include = function (properties) { Object.assign(this.prototype, properties); return this; };\r\n Class.mergeOptions = function (options) {\r\n this.prototype.options = { ...this.prototype.options, ...options };\r\n return this;\r\n };\r\n Class.addInitHook = function (hook, ...args) {\r\n if (!Object.hasOwn(this.prototype, '_initHooks')) this.prototype._initHooks = [];\r\n this.prototype._initHooks.push(typeof hook === 'function' ? hook : function () { this[hook](...args); });\r\n return this;\r\n };\r\n Class.prototype.callInitHooks = function () {\r\n if (this._initHooksCalled) return;\r\n this._initHooksCalled = true;\r\n const prototypes = [];\r\n for (let proto = Object.getPrototypeOf(this); proto; proto = Object.getPrototypeOf(proto)) prototypes.unshift(proto);\r\n for (const proto of prototypes) {\r\n if (Object.hasOwn(proto, '_initHooks')) for (const hook of proto._initHooks) hook.call(this);\r\n }\r\n };\r\n L.Evented = Class.extend({\r\n on(types, fn, context) {\r\n if (typeof types === 'object') {\r\n for (const [type, handler] of Object.entries(types)) this.on(type, handler, fn);\r\n } else {\r\n this._events ||= {};\r\n for (const type of types.split(/\\s+/)) {\r\n const events = this._events[type] ||= [];\r\n if (!events.some(event => event.fn === fn && event.context === context)) events.push({ fn, context });\r\n }\r\n }\r\n return this;\r\n },\r\n off(types, fn, context) {\r\n if (!types) this._events = {};\r\n else if (typeof types === 'object') {\r\n for (const [type, handler] of Object.entries(types)) this.off(type, handler, fn);\r\n } else {\r\n for (const type of types.split(/\\s+/)) {\r\n if (this._events?.[type]) this._events[type] = fn\r\n ? this._events[type].filter(event => event.fn !== fn || event.context !== context) : [];\r\n }\r\n }\r\n return this;\r\n },\r\n once(types, fn, context) {\r\n const handler = event => { this.off(types, handler); fn.call(context || this, event); };\r\n return this.on(types, handler);\r\n },\r\n fire(type, data) {\r\n for (const event of [...this._events?.[type] || []]) {\r\n event.fn.call(event.context || this, { ...data, type, target: this, sourceTarget: this });\r\n }\r\n return this;\r\n },\r\n listens(type) { return Boolean(this._events?.[type]?.length); },\r\n });\r\n L.Util = {\r\n stamp, setOptions,\r\n throttle(fn, interval, context) {\r\n let timer, pending;\r\n const run = (...args) => {\r\n if (timer) { pending = args; return; }\r\n fn.apply(context, args);\r\n timer = setTimeout(() => {\r\n timer = null;\r\n if (pending) { const args = pending; pending = null; run(...args); }\r\n }, interval);\r\n };\r\n return run;\r\n },\r\n };\r\n\r\n L.Point = function (x, y, round) {\r\n this.x = round ? Math.round(x) : x;\r\n this.y = round ? Math.round(y) : y;\r\n };\r\n const point = value => value instanceof L.Point ? value\r\n : Array.isArray(value) ? new L.Point(...value) : new L.Point(value.x, value.y);\r\n L.Point.prototype = {\r\n clone() { return new L.Point(this.x, this.y); },\r\n add(value) { return this.clone()._add(point(value)); },\r\n _add(value) { this.x += value.x; this.y += value.y; return this; },\r\n subtract(value) { return this.clone()._subtract(point(value)); },\r\n _subtract(value) { this.x -= value.x; this.y -= value.y; return this; },\r\n multiplyBy(value) { return new L.Point(this.x * value, this.y * value); },\r\n divideBy(value) { return new L.Point(this.x / value, this.y / value); },\r\n scaleBy(value) { return new L.Point(this.x * value.x, this.y * value.y); },\r\n unscaleBy(value) { return new L.Point(this.x / value.x, this.y / value.y); },\r\n round() { return new L.Point(Math.round(this.x), Math.round(this.y)); },\r\n floor() { return new L.Point(Math.floor(this.x), Math.floor(this.y)); },\r\n ceil() { return new L.Point(Math.ceil(this.x), Math.ceil(this.y)); },\r\n distanceTo(value) { value = point(value); return Math.hypot(this.x - value.x, this.y - value.y); },\r\n equals(value) { value = point(value); return this.x === value.x && this.y === value.y; },\r\n contains(value) { value = point(value); return Math.abs(value.x) <= Math.abs(this.x) && Math.abs(value.y) <= Math.abs(this.y); },\r\n };\r\n L.LatLng = function (lat, lng, alt) {\r\n if (!Number.isFinite(Number(lat)) || !Number.isFinite(Number(lng))) throw new Error('Invalid LatLng');\r\n this.lat = Number(lat); this.lng = Number(lng);\r\n if (alt !== undefined) this.alt = alt;\r\n };\r\n const latLng = value => value instanceof L.LatLng ? value\r\n : Array.isArray(value) ? new L.LatLng(...value) : new L.LatLng(value.lat, value.lng);\r\n L.LatLng.prototype = {\r\n equals(value, margin = 1e-9) {\r\n value = latLng(value);\r\n return Math.max(Math.abs(this.lat - value.lat), Math.abs(this.lng - value.lng)) <= margin;\r\n },\r\n distanceTo(value) { value = latLng(value); return ol.sphere.getDistance([this.lng, this.lat], [value.lng, value.lat]); },\r\n wrap() { return new L.LatLng(this.lat, ((this.lng + 180) % 360 + 360) % 360 - 180, this.alt); },\r\n };\r\n L.Bounds = function (a, b) {\r\n if (a) for (const value of b ? [a, b] : Array.isArray(a) ? a : [a]) this.extend(value);\r\n };\r\n L.Bounds.prototype = {\r\n extend(value) {\r\n if (value instanceof L.Bounds) { this.extend(value.min); this.extend(value.max); return this; }\r\n value = point(value);\r\n if (!this.min) { this.min = value.clone(); this.max = value.clone(); }\r\n else {\r\n this.min.x = Math.min(this.min.x, value.x); this.min.y = Math.min(this.min.y, value.y);\r\n this.max.x = Math.max(this.max.x, value.x); this.max.y = Math.max(this.max.y, value.y);\r\n }\r\n return this;\r\n },\r\n getCenter() { return this.min.add(this.max).divideBy(2); },\r\n getSize() { return this.max.subtract(this.min); },\r\n contains(value) {\r\n const min = value.min || point(value), max = value.max || min;\r\n return min.x >= this.min.x && max.x <= this.max.x && min.y >= this.min.y && max.y <= this.max.y;\r\n },\r\n intersects(value) {\r\n return value.max.x >= this.min.x && value.min.x <= this.max.x && value.max.y >= this.min.y && value.min.y <= this.max.y;\r\n },\r\n };\r\n L.LatLngBounds = function (a, b) {\r\n if (a) for (const value of b ? [a, b] : a) this.extend(value);\r\n };\r\n L.LatLngBounds.prototype = {\r\n extend(value) {\r\n if (value instanceof L.LatLngBounds) { this.extend(value._southWest); this.extend(value._northEast); return this; }\r\n value = latLng(value);\r\n if (!this._southWest) {\r\n this._southWest = new L.LatLng(value.lat, value.lng);\r\n this._northEast = new L.LatLng(value.lat, value.lng);\r\n } else {\r\n this._southWest.lat = Math.min(this._southWest.lat, value.lat);\r\n this._southWest.lng = Math.min(this._southWest.lng, value.lng);\r\n this._northEast.lat = Math.max(this._northEast.lat, value.lat);\r\n this._northEast.lng = Math.max(this._northEast.lng, value.lng);\r\n }\r\n return this;\r\n },\r\n getSouthWest() { return this._southWest; },\r\n getNorthEast() { return this._northEast; },\r\n getNorthWest() { return new L.LatLng(this.getNorth(), this.getWest()); },\r\n getSouthEast() { return new L.LatLng(this.getSouth(), this.getEast()); },\r\n getNorth() { return this._northEast.lat; },\r\n getSouth() { return this._southWest.lat; },\r\n getEast() { return this._northEast.lng; },\r\n getWest() { return this._southWest.lng; },\r\n getCenter() { return new L.LatLng((this.getNorth() + this.getSouth()) / 2, (this.getEast() + this.getWest()) / 2); },\r\n contains(value) {\r\n value = latLng(value);\r\n return value.lat >= this.getSouth() && value.lat <= this.getNorth() && value.lng >= this.getWest() && value.lng <= this.getEast();\r\n },\r\n isValid() { return Boolean(this._southWest && this._northEast); },\r\n };\r\n\r\n const radius = 6378137, circumference = 2 * Math.PI * radius;\r\n const crs = {\r\n scale: zoom => 256 * 2 ** zoom,\r\n zoom: scale => Math.log2(scale / 256),\r\n project(value) { value = latLng(value); return point(ol.proj.fromLonLat([value.lng, Math.max(-85.0511287798, Math.min(85.0511287798, value.lat))])); },\r\n unproject(value) { const [lng, lat] = ol.proj.toLonLat([value.x, value.y]); return new L.LatLng(lat, lng); },\r\n transformation: {\r\n transform(value, scale) { return new L.Point((value.x / circumference + 0.5) * scale, (0.5 - value.y / circumference) * scale); },\r\n untransform(value, scale) { return new L.Point((value.x / scale - 0.5) * circumference, (0.5 - value.y / scale) * circumference); },\r\n },\r\n };\r\n\r\n L.DomUtil = {\r\n create(tag, className = '', parent) {\r\n const element = document.createElement(tag);\r\n element.className = className; parent?.append(element); return element;\r\n },\r\n setPosition(element, value) { element._leaflet_pos = point(value); element.style.transform = `translate(${value.x}px,${value.y}px)`; },\r\n getPosition(element) { return element._leaflet_pos || new L.Point(0, 0); },\r\n };\r\n const domListeners = new WeakMap();\r\n function domEvent(add, element, types, fn, context) {\r\n if (typeof types === 'object') {\r\n for (const [type, handler] of Object.entries(types)) domEvent(add, element, type, handler, fn);\r\n return L.DomEvent;\r\n }\r\n let listeners = domListeners.get(element);\r\n if (!listeners) domListeners.set(element, listeners = []);\r\n for (const type of types.split(/\\s+/)) {\r\n const existing = listeners.find(item => item.type === type && item.fn === fn && item.context === context);\r\n if (add && !existing) {\r\n const handler = context ? fn.bind(context) : fn;\r\n listeners.push({ type, fn, context, handler });\r\n element.addEventListener(type, handler, { passive: false });\r\n } else if (!add && existing) {\r\n element.removeEventListener(type, existing.handler);\r\n listeners.splice(listeners.indexOf(existing), 1);\r\n }\r\n }\r\n return L.DomEvent;\r\n }\r\n const stopPropagation = event => event.stopPropagation();\r\n L.DomEvent = {\r\n on: (...args) => domEvent(true, ...args),\r\n off: (...args) => domEvent(false, ...args),\r\n stop(event) { event.preventDefault(); event.stopPropagation(); },\r\n disableClickPropagation(element) {\r\n element.classList.add('leaflet-control');\r\n L.DomEvent.on(element, 'click dblclick pointerdown mousedown touchstart contextmenu', stopPropagation);\r\n return this;\r\n },\r\n disableScrollPropagation(element) { return this.on(element, 'wheel', stopPropagation); },\r\n };\r\n L.Handler = Class.extend({\r\n initialize(map) { this._map = map; },\r\n enable() { if (!this._enabled) { this._enabled = true; this.addHooks?.(); } return this; },\r\n disable() { if (this._enabled) { this._enabled = false; this.removeHooks?.(); } return this; },\r\n enabled() { return Boolean(this._enabled); },\r\n moving() { return Boolean(this._moving); },\r\n });\r\n L.Layer = L.Evented.extend({\r\n initialize(options) { setOptions(this, options); },\r\n addTo(map) { map.addLayer(this); return this; },\r\n remove() { return this.removeFrom(this._map || this._mapToAdd); },\r\n removeFrom(map) { map?.removeLayer(this); return this; },\r\n getAttribution() { return this.options.attribution; },\r\n getPane(name) { return this._map.getPane(name || this.options.pane); },\r\n _layerAdd({ target: map }) {\r\n if (!map.hasLayer(this)) return;\r\n this._map = map;\r\n if (this.getEvents) { this._mapEvents = this.getEvents(); map.on(this._mapEvents, this); }\r\n this.onAdd?.(map);\r\n this.fire('add'); map.fire('layeradd', { layer: this });\r\n },\r\n });\r\n L.LayerGroup = L.Layer.extend({\r\n initialize(layers = [], options) {\r\n setOptions(this, options); this._layers = {};\r\n for (const layer of layers) this.addLayer(layer);\r\n },\r\n addLayer(layer) { this._layers[stamp(layer)] = layer; this._map?.addLayer(layer); return this; },\r\n removeLayer(layer) { delete this._layers[stamp(layer)]; this._map?.removeLayer(layer); return this; },\r\n hasLayer(layer) { return stamp(layer) in this._layers; },\r\n eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },\r\n onAdd(map) { this.eachLayer(map.addLayer, map); },\r\n onRemove(map) { this.eachLayer(map.removeLayer, map); },\r\n });\r\n // Declare the hierarchy before the plugin installs its instanceof checks and hooks.\r\n for (const [name, parent] of [\r\n ['GridLayer', L.Layer], ['Marker', L.Layer], ['Path', L.Layer],\r\n ['Polyline', null], ['Polygon', null], ['CircleMarker', null], ['Circle', null],\r\n ['ImageOverlay', L.Layer], ['VideoOverlay', null], ['SVGOverlay', null],\r\n ['Popup', L.Layer], ['Tooltip', L.Layer], ['DivIcon', Class],\r\n ]) {\r\n const base = parent || ({ Polyline: L.Path, Polygon: L.Polyline, CircleMarker: L.Path,\r\n Circle: L.CircleMarker, VideoOverlay: L.ImageOverlay, SVGOverlay: L.ImageOverlay })[name];\r\n L[name] = base.extend({\r\n initialize() { throw new Error(`L.${name} is not supported by the OpenLayers bindings; use L.Layer with a source`); },\r\n getEvents() { return {}; },\r\n });\r\n }\r\n\r\n L.Map = L.Evented.extend({\r\n options: { crs, minZoom: 0, maxZoom: 24, zoomSnap: 1, touchZoom: true,\r\n scrollWheelZoom: true, keyboard: true, doubleClickZoom: true,\r\n wheelDebounceTime: 40, wheelPxPerZoomLevel: 60 },\r\n initialize(target, options) {\r\n setOptions(this, options);\r\n this._container = typeof target === 'string' ? document.getElementById(target) : target;\r\n if (!this._container) throw new Error('Map container not found');\r\n stamp(this._container);\r\n this._container.classList.add('openlayers-city-mapper');\r\n this._layers = {}; this._panes = {}; this._handlers = []; this._controls = new Set();\r\n const center = crs.project(this.options.center || [0, 0]);\r\n this.ol = new ol.Map({\r\n target: this._container, controls: [new ol.control.Zoom(), new ol.control.Attribution({collapsible: false })],\r\n interactions: [],\r\n view: new ol.View({ center: [center.x, center.y], zoom: this.options.zoom || 0,\r\n minZoom: this.getMinZoom(), maxZoom: this.getMaxZoom() }),\r\n });\r\n for (const control of this.ol.getControls().getArray()) {\r\n control.element.classList.add('leaflet-control');\r\n for (const button of control.element.querySelectorAll('button[title]')) button.setAttribute('aria-label', button.title);\r\n if (control instanceof ol.control.Zoom) {\r\n for (const [selector, delta] of [['.ol-zoom-in', 1], ['.ol-zoom-out', -1]]) {\r\n control.element.querySelector(selector).addEventListener('click', event => {\r\n L.DomEvent.stop(event);\r\n event.stopImmediatePropagation();\r\n this._zoomBy(delta * (event.shiftKey ? 3 : 1));\r\n }, true);\r\n }\r\n }\r\n }\r\n this._loaded = true;\r\n this._zoomAnimated = false;\r\n this.dragging = new L.Handler(this).enable();\r\n this.touchZoom = new L.Handler(this);\r\n if (this.options.touchZoom) this.touchZoom.enable();\r\n this._handlers.push(this.dragging, this.touchZoom);\r\n for (const name of ['scrollWheelZoom', 'keyboard', 'doubleClickZoom']) this.addHandler(name, L.Handler);\r\n if (!this._container.hasAttribute('tabindex')) this._container.tabIndex = 0;\r\n const view = this.ol.getView();\r\n this._viewZoom = view.getZoom();\r\n view.on(['change:center', 'change:resolution'], () => {\r\n if (this._settingView) return;\r\n const zoomChanged = view.getZoom() !== this._viewZoom;\r\n if (!this._viewMoving) { this._viewMoving = true; this.fire('movestart'); }\r\n if (zoomChanged && !this._viewZooming) { this._viewZooming = true; this.fire('zoomstart'); }\r\n this.fire('move');\r\n if (zoomChanged) this.fire('zoom');\r\n this._viewZoom = view.getZoom();\r\n if (!view.getAnimating() && !view.getInteracting()) this._endViewChange();\r\n });\r\n this.ol.on('moveend', () => this._endViewChange());\r\n // OpenLayers interactions need the pitched ground coordinate, not the flat viewport.\r\n this.ol.getCoordinateFromPixel = pixel => {\r\n const coordinate = crs.project(this.containerPointToLatLng(point(pixel)));\r\n return [coordinate.x, coordinate.y];\r\n };\r\n this._wheelDelta = 0;\r\n this.ol.addInteraction(new ol.interaction.Interaction({\r\n handleEvent: event => {\r\n const original = event.originalEvent;\r\n if (original.target.closest('.ol-control')) return true;\r\n if (event.type === 'dblclick' && this.doubleClickZoom.enabled()) {\r\n this._zoomBy(original.shiftKey ? -1 : 1, point(event.pixel));\r\n } else if (event.type === 'wheel' && this.scrollWheelZoom.enabled() && !original.shiftKey) {\r\n const ratio = window.devicePixelRatio || 1;\r\n const factor = /Linux/.test(navigator.platform) && /Chrome/.test(navigator.userAgent) ? ratio\r\n : /Mac/.test(navigator.platform) ? 3 * ratio : 2 * ratio;\r\n this._wheelDelta -= original.deltaY * (original.deltaMode === 1 ? 20\r\n : original.deltaMode === 2 ? 60 : 1 / factor);\r\n this._wheelPixel = point(event.pixel);\r\n this._wheelStart ??= performance.now();\r\n clearTimeout(this._wheelTimer);\r\n this._wheelTimer = setTimeout(() => {\r\n const magnitude = 4 * Math.log2(2 / (1 + Math.exp(-Math.abs(this._wheelDelta /\r\n (this.options.wheelPxPerZoomLevel * 4)))));\r\n const snap = this.options.zoomSnap;\r\n const delta = Math.sign(this._wheelDelta) * (snap ? Math.ceil(magnitude / snap) * snap : magnitude);\r\n this._wheelDelta = 0;\r\n this._wheelStart = null;\r\n if (this._loaded && this.scrollWheelZoom.enabled()) this._zoomBy(delta,\r\n this.options.scrollWheelZoom === 'center' ? undefined : this._wheelPixel);\r\n }, Math.max(0, this.options.wheelDebounceTime - (performance.now() - this._wheelStart)));\r\n } else return true;\r\n original.preventDefault();\r\n return false;\r\n },\r\n }));\r\n this._controlCorners = {};\r\n for (const position of ['topleft', 'topright', 'bottomleft', 'bottomright']) {\r\n this._controlCorners[position] = L.DomUtil.create('div',\r\n `ol-city-corner ol-city-${position}`, this.ol.getOverlayContainerStopEvent());\r\n }\r\n const attributionSource = new ol.source.Vector();\r\n this.ol.addLayer(new ol.layer.Vector({ source: attributionSource }));\r\n const updateAttribution = () => {\r\n const values = new Set(['<a href=\"https://openlayers.org/\">OpenLayers</a>']);\r\n this.eachLayer(layer => { if (layer.getAttribution?.()) values.add(layer.getAttribution()); });\r\n attributionSource.setAttributions([...values]);\r\n };\r\n this.on('layeradd layerremove', updateAttribution);\r\n updateAttribution();\r\n let anchor, pointerId;\r\n const pixel = event => {\r\n const rect = this._container.getBoundingClientRect();\r\n return new L.Point(event.clientX - rect.left, event.clientY - rect.top);\r\n };\r\n this._onPointer = event => {\r\n if (event.type === 'pointerdown') {\r\n if (!this.dragging.enabled() || event.button !== 0 || !event.isPrimary || event.target.closest('.ol-control')) return;\r\n anchor = this.containerPointToLatLng(pixel(event)); pointerId = event.pointerId;\r\n this._moved = this.dragging._moving = false;\r\n this._container.focus({ preventScroll: true });\r\n this._container.setPointerCapture(pointerId);\r\n } else if (event.pointerId === pointerId && event.type === 'pointermove' && this.dragging.enabled()) {\r\n const delta = this.project(anchor).subtract(this.project(this.containerPointToLatLng(pixel(event))));\r\n if (Math.hypot(delta.x, delta.y) > 1) this._moved = this.dragging._moving = true;\r\n this.setView(this.unproject(this.project(this.getCenter()).add(delta)), this.getZoom());\r\n } else if (event.pointerId === pointerId && event.type !== 'pointermove') {\r\n if (this._container.hasPointerCapture(pointerId)) this._container.releasePointerCapture(pointerId);\r\n anchor = null; pointerId = null;\r\n this.dragging._moving = false;\r\n }\r\n };\r\n this._onKey = event => {\r\n if (!this.keyboard.enabled() || event.target !== this._container || event.altKey || event.ctrlKey || event.metaKey) return;\r\n const offsets = { ArrowLeft: [-80, 0], ArrowRight: [80, 0], ArrowUp: [0, -80], ArrowDown: [0, 80] };\r\n if (offsets[event.key]) this.panBy(offsets[event.key]);\r\n else if (['+', '=', '-', '_'].includes(event.key)) this._zoomBy(\r\n (['-', '_'].includes(event.key) ? -1 : 1) * (event.shiftKey ? 3 : 1));\r\n else return;\r\n event.preventDefault();\r\n };\r\n L.DomEvent.on(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);\r\n L.DomEvent.on(this._container, 'keydown', this._onKey);\r\n this.ol.on('change:size', () => this.fire('resize', { newSize: this.getSize() }));\r\n this.ol.updateSize();\r\n },\r\n getContainer() { return this._container; },\r\n getSize() { return point(this.ol.getSize() || [this._container.clientWidth, this._container.clientHeight]); },\r\n getCenter() { return crs.unproject(point(this.ol.getView().getCenter())); },\r\n getZoom() { return this.ol.getView().getZoom(); },\r\n getMinZoom() { return this.options.minZoom; },\r\n getMaxZoom() { return this.options.maxZoom; },\r\n getZoomScale(to, from = this.getZoom()) { return 2 ** (to - from); },\r\n getScaleZoom(scale, from = this.getZoom()) { return from + Math.log2(scale); },\r\n _limitZoom(zoom) { return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), zoom)); },\r\n project(value, zoom = this.getZoom()) { return crs.transformation.transform(crs.project(value), crs.scale(zoom)); },\r\n unproject(value, zoom = this.getZoom()) { return crs.unproject(crs.transformation.untransform(point(value), crs.scale(zoom))); },\r\n getPixelOrigin() { return this.project(this.getCenter()).subtract(this.getSize().divideBy(2)); },\r\n _getMapPanePos() { return new L.Point(0, 0); },\r\n latLngToLayerPoint(value) { return this.project(value).subtract(this.getPixelOrigin()); },\r\n layerPointToLatLng(value) { return this.unproject(point(value).add(this.getPixelOrigin())); },\r\n layerPointToContainerPoint(value) { return point(value).clone(); },\r\n containerPointToLayerPoint(value) { return point(value).clone(); },\r\n latLngToContainerPoint(value) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(value)); },\r\n containerPointToLatLng(value) { return this.layerPointToLatLng(this.containerPointToLayerPoint(value)); },\r\n getBounds() { return new L.LatLngBounds(this.containerPointToLatLng([0, 0]), this.containerPointToLatLng(this.getSize())); },\r\n _endViewChange() {\r\n if (!this._viewMoving) return;\r\n const zooming = this._viewZooming;\r\n this._viewMoving = this._viewZooming = false;\r\n if (zooming) this.fire('zoomend');\r\n this.fire('moveend');\r\n },\r\n _zoomBy(delta, pixel) {\r\n if (!delta || this.ol.getView().getAnimating()) return this;\r\n const zoom = this._limitZoom(this.getZoom() + delta);\r\n return pixel ? this.setZoomAround(pixel, zoom, { animate: true })\r\n : this.setZoom(zoom, { animate: true });\r\n },\r\n setView(center, zoom = this.getZoom(), options = {}) {\r\n center = latLng(center); zoom = this._limitZoom(zoom);\r\n if ((options.animate === true || options.zoom?.animate === true) && zoom !== this.getZoom()) {\r\n const scale = this.getZoomScale(zoom), projected = crs.project(center);\r\n // Leaflet animates CSS scale, not resolution; convert the same native CSS easing.\r\n this.ol.getView().animate({\r\n center: [projected.x, projected.y], zoom, duration: 250,\r\n easing: time => {\r\n zoomTiming.currentTime = time;\r\n const progress = zoomTiming.effect.getComputedTiming().progress;\r\n return (1 - 1 / (1 + (scale - 1) * progress)) / (1 - 1 / scale);\r\n },\r\n });\r\n return this;\r\n }\r\n this.ol.getView().cancelAnimations();\r\n this._endViewChange();\r\n const zoomChanged = zoom !== this.getZoom(), moved = !center.equals(this.getCenter());\r\n if (!zoomChanged && !moved) return this;\r\n this.fire('movestart');\r\n if (zoomChanged) this.fire('zoomstart');\r\n this._settingView = true;\r\n const projected = crs.project(center);\r\n this.ol.getView().setCenter([projected.x, projected.y]);\r\n this.ol.getView().setZoom(zoom);\r\n this._viewZoom = this.getZoom();\r\n this._settingView = false;\r\n if (zoomChanged) this.fire('zoom');\r\n this.fire('move').fire('viewreset');\r\n if (zoomChanged) this.fire('zoomend');\r\n return this.fire('moveend');\r\n },\r\n setZoom(zoom, options) { return this.setView(this.getCenter(), zoom, options); },\r\n panTo(center) { return this.setView(center); },\r\n panBy(offset) { return this.panTo(this.unproject(this.project(this.getCenter()).add(point(offset)))); },\r\n setZoomAround(value, zoom, options) {\r\n const anchor = value instanceof L.Point ? value : this.latLngToContainerPoint(value);\r\n const half = this.getSize().divideBy(2), scale = this.getZoomScale(zoom);\r\n return this.setView(this.unproject(this.project(this.getCenter()).add(anchor.subtract(half).multiplyBy(1 - 1 / scale))), zoom, options);\r\n },\r\n getBoundsZoom(bounds, inside, padding = [0, 0]) {\r\n const size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));\r\n const available = this.getSize().subtract(point(padding));\r\n const scale = Math[inside ? 'max' : 'min'](available.x / size.x, available.y / size.y);\r\n return this._limitZoom(this.getScaleZoom(scale));\r\n },\r\n _getBoundsCenterZoom(bounds, options = {}) { return { center: bounds.getCenter(), zoom: this.getBoundsZoom(bounds, false, options.padding) }; },\r\n fitBounds(bounds, options) { const view = this._getBoundsCenterZoom(bounds, options); return this.setView(view.center, view.zoom); },\r\n _limitCenter(center) { return center; },\r\n _limitOffset(offset) { return offset; },\r\n _tryAnimatedPan() { return false; },\r\n panInside(value) { if (!this.getBounds().contains(value)) this.panTo(value); return this; },\r\n whenReady(fn, context) { if (this._loaded) fn.call(context || this, { target: this }); else this.once('load', fn, context); return this; },\r\n addLayer(layer) {\r\n const id = stamp(layer);\r\n if (this._layers[id]) return this;\r\n this._layers[id] = layer; layer._mapToAdd = this;\r\n layer.beforeAdd?.(this);\r\n this.whenReady(layer._layerAdd, layer);\r\n return this;\r\n },\r\n removeLayer(layer) {\r\n if (!this.hasLayer(layer)) return this;\r\n layer.onRemove?.(this);\r\n if (layer._mapEvents) this.off(layer._mapEvents, layer);\r\n delete this._layers[stamp(layer)];\r\n this.fire('layerremove', { layer }); layer.fire('remove');\r\n layer._map = layer._mapToAdd = null;\r\n return this;\r\n },\r\n hasLayer(layer) { return Boolean(this._layers[stamp(layer)]); },\r\n eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },\r\n createPane(name, parent = this._container) { return this._panes[name] = L.DomUtil.create('div', `leaflet-pane leaflet-${name}`, parent); },\r\n getPane(name = 'overlayPane') { return this._panes[name]; },\r\n addHandler(name, Handler) { this[name] = new Handler(this); this._handlers.push(this[name]); if (this.options[name]) this[name].enable(); return this; },\r\n invalidateSize() { this.ol.updateSize(); return this; },\r\n _draggableMoved() { return Boolean(this._moved); },\r\n remove() {\r\n clearTimeout(this._wheelTimer);\r\n this.ol.getView().cancelAnimations();\r\n this.fire('unload');\r\n for (const control of [...this._controls]) control.remove();\r\n this.eachLayer(this.removeLayer, this);\r\n for (const handler of this._handlers) handler.disable();\r\n L.DomEvent.off(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);\r\n L.DomEvent.off(this._container, 'keydown', this._onKey);\r\n this.ol.setTarget(undefined); this.ol.dispose();\r\n for (const corner of Object.values(this._controlCorners)) corner.remove();\r\n for (const pane of Object.values(this._panes)) pane.remove();\r\n this._loaded = false;\r\n delete this._container._leaflet_id;\r\n return this.off();\r\n },\r\n });\r\n\r\n L.Control = Class.extend({\r\n options: { position: 'topright' },\r\n initialize(options) { setOptions(this, options); },\r\n getPosition() { return this.options.position; },\r\n getContainer() { return this._container; },\r\n addTo(map) {\r\n this.remove(); this._map = map;\r\n this._container = this.onAdd(map);\r\n if (L.Control.Rotate && this instanceof L.Control.Rotate) {\r\n this._container.classList.add('ol-city-rotate');\r\n }\r\n this._container.classList.add('leaflet-control', 'ol-control', 'ol-city-control');\r\n this._olControl = new ol.control.Control({\r\n element: this._container, target: map._controlCorners[this.getPosition()],\r\n });\r\n map.ol.addControl(this._olControl);\r\n map._controls.add(this);\r\n return this;\r\n },\r\n remove() {\r\n if (!this._map) return this;\r\n const map = this._map;\r\n this.onRemove?.(map); this._container?.remove();\r\n map.ol.removeControl(this._olControl);\r\n map._controls.delete(this); this._map = null;\r\n return this;\r\n },\r\n });\r\n L.Control.Layers = L.Control.extend({\r\n options: { collapsed: true },\r\n initialize(base = {}, overlays = {}, options) {\r\n setOptions(this, options); this._layers = [];\r\n for (const [name, layer] of Object.entries(base)) this._layers.push({ name, layer, overlay: false });\r\n for (const [name, layer] of Object.entries(overlays)) this._layers.push({ name, layer, overlay: true });\r\n },\r\n onAdd(map) {\r\n const container = L.DomUtil.create('div', 'ol-city-layers');\r\n L.DomEvent.disableClickPropagation(container); L.DomEvent.disableScrollPropagation(container);\r\n const list = L.DomUtil.create('section', '', container);\r\n list.setAttribute('aria-label', 'Map layers');\r\n const base = L.DomUtil.create('div', '', list);\r\n L.DomUtil.create('hr', '', list);\r\n const overlays = L.DomUtil.create('div', '', list);\r\n this._inputs = [];\r\n for (const entry of this._layers) {\r\n const label = L.DomUtil.create('label', '', entry.overlay ? overlays : base);\r\n const input = L.DomUtil.create('input', 'leaflet-control-layers-selector', label);\r\n input.type = entry.overlay ? 'checkbox' : 'radio';\r\n input.name = `base-${stamp(this)}`; input.layerId = stamp(entry.layer);\r\n input.checked = map.hasLayer(entry.layer);\r\n label.append(document.createTextNode(` ${entry.name}`));\r\n this._inputs.push(input);\r\n input.onchange = () => {\r\n const checked = input.checked;\r\n if (!entry.overlay) for (const other of this._layers) {\r\n if (!other.overlay && other !== entry) map.removeLayer(other.layer);\r\n }\r\n if (checked) map.addLayer(entry.layer); else map.removeLayer(entry.layer);\r\n };\r\n }\r\n map.on('layeradd layerremove', this._update, this);\r\n return container;\r\n },\r\n _update() { for (const input of this._inputs) input.checked = Boolean(this._map._layers[input.layerId]); },\r\n onRemove(map) { map.off('layeradd layerremove', this._update, this); },\r\n });\r\n\r\n // Native layer contracts consumed by the plugin's WebGPU renderer.\r\n const bounds = value => value instanceof L.LatLngBounds ? value : new L.LatLngBounds(value);\r\n const coordinates = values => values.map(value => Array.isArray(value) && typeof value[0] !== 'number'\r\n ? coordinates(value) : latLng(value));\r\n const image = (url, options, className) => {\r\n const element = document.createElement('img');\r\n element.className = className;\r\n if (options.crossOrigin) element.crossOrigin = options.crossOrigin === true ? '' : options.crossOrigin;\r\n element.src = url;\r\n element.draggable = false;\r\n return element;\r\n };\r\n\r\n L.Layer.include({\r\n bindPopup(content) {\r\n this._popupContent = content;\r\n this.off('click', this.openPopup, this).on('click', this.openPopup, this);\r\n this.once('remove', this.closePopup, this);\r\n if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindPopup(content));\r\n return this;\r\n },\r\n openPopup(event) {\r\n if (!this._map) return this;\r\n this.closePopup();\r\n const location = event?.latlng || this.getLatLng?.() || this.getBounds?.().getCenter();\r\n if (!location) throw new Error('Popup requires a location');\r\n const element = L.DomUtil.create('div', 'ol-city-popup leaflet-popup');\r\n element.setAttribute('role', 'dialog');\r\n const close = L.DomUtil.create('button', '', element);\r\n close.type = 'button'; close.textContent = '\\u00d7'; close.setAttribute('aria-label', 'Close popup');\r\n close.onclick = () => this.closePopup();\r\n const content = L.DomUtil.create('div', '', element);\r\n const value = typeof this._popupContent === 'function' ? this._popupContent(this) : this._popupContent;\r\n if (value instanceof Node) content.append(value); else content.innerHTML = value;\r\n L.DomEvent.disableClickPropagation(element);\r\n this._popupOverlay = new ol.Overlay({ element, positioning: 'bottom-center', offset: [0, -12] });\r\n this._map.ol.addOverlay(this._popupOverlay);\r\n this._popupLocation = latLng(location);\r\n this._map.on('move zoom rotate pitch', this._positionPopup, this);\r\n this._positionPopup();\r\n return this;\r\n },\r\n _positionPopup() {\r\n const screen = this._map.latLngToContainerPoint(this._popupLocation);\r\n this._popupOverlay.setPosition(this._map.ol.getCoordinateFromPixelInternal([screen.x, screen.y]));\r\n },\r\n closePopup() {\r\n if (this._popupOverlay) {\r\n this._map?.off('move zoom rotate pitch', this._positionPopup, this);\r\n this._map?.ol.removeOverlay(this._popupOverlay);\r\n this._popupOverlay = null;\r\n }\r\n return this;\r\n },\r\n bindTooltip(content) {\r\n this._tooltipContent = content;\r\n this.on('mouseover', this._showTooltip, this).on('mouseout remove', this._hideTooltip, this);\r\n if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindTooltip(content));\r\n return this;\r\n },\r\n _showTooltip(event) {\r\n this._hideTooltip();\r\n if (!this._map || !event.latlng) return;\r\n const element = this._tooltipElement = L.DomUtil.create('div', 'ol-city-tooltip leaflet-tooltip', this._map.getContainer());\r\n element.setAttribute('role', 'tooltip');\r\n const value = typeof this._tooltipContent === 'function' ? this._tooltipContent(this) : this._tooltipContent;\r\n if (value instanceof Node) element.append(value); else element.innerHTML = value;\r\n const pixel = this._map.latLngToContainerPoint(event.latlng);\r\n element.style.left = `${pixel.x + 12}px`; element.style.top = `${pixel.y + 12}px`;\r\n },\r\n _hideTooltip() { this._tooltipElement?.remove(); this._tooltipElement = null; },\r\n });\r\n L.LayerGroup.include({\r\n getLayers() { return Object.values(this._layers); },\r\n getBounds() {\r\n const result = new L.LatLngBounds();\r\n this.eachLayer(layer => result.extend(layer.getBounds?.() || layer.getLatLng()));\r\n return result;\r\n },\r\n });\r\n L.FeatureGroup = L.LayerGroup.extend({});\r\n\r\n L.Path.include({\r\n options: { pane: 'overlayPane', interactive: true, stroke: true, color: '#3388ff',\r\n weight: 3, opacity: 1, lineCap: 'round', lineJoin: 'round', fill: false, fillOpacity: 0.2 },\r\n initialize(options) { L.Util.setOptions(this, options); },\r\n setStyle(options) { L.Util.setOptions(this, options); return this.redraw(); },\r\n redraw() { return this; },\r\n bringToFront() { return this; },\r\n bringToBack() { return this; },\r\n });\r\n L.Polyline.include({\r\n initialize(values, options) { L.Util.setOptions(this, options); this.setLatLngs(values); },\r\n getLatLngs() { return this._latlngs; },\r\n setLatLngs(values) { this._latlngs = coordinates(values); return this.redraw(); },\r\n addLatLng(value) { this._latlngs.push(latLng(value)); return this.redraw(); },\r\n getBounds() {\r\n const result = new L.LatLngBounds();\r\n const visit = values => { for (const value of values) Array.isArray(value) ? visit(value) : result.extend(value); };\r\n visit(this._latlngs);\r\n return result;\r\n },\r\n _project() {\r\n this._rings = [];\r\n const visit = values => {\r\n if (!values.length) return;\r\n if (Array.isArray(values[0])) values.forEach(visit);\r\n else this._rings.push(values.map(value => this._map.latLngToLayerPoint(value)));\r\n };\r\n visit(this._latlngs);\r\n },\r\n closestLayerPoint(value) {\r\n this._project();\r\n const paths = this._rings.map(ring => ring.map(value => [value.x, value.y]));\r\n const closest = new ol.geom.MultiLineString(paths).getClosestPoint([value.x, value.y]);\r\n return point(closest);\r\n },\r\n });\r\n L.Polyline.mergeOptions(L.Path.prototype.options);\r\n L.Polygon.include({ initialize: L.Polyline.prototype.initialize });\r\n L.Polygon.mergeOptions(L.Path.prototype.options);\r\n L.Polygon.mergeOptions({ fill: true });\r\n L.Rectangle = L.Polygon.extend({\r\n initialize(value, options) { L.Util.setOptions(this, options); this.setBounds(value); },\r\n setBounds(value) {\r\n value = bounds(value);\r\n return this.setLatLngs([value.getSouthWest(), value.getNorthWest(), value.getNorthEast(), value.getSouthEast()]);\r\n },\r\n });\r\n L.CircleMarker.include({\r\n options: { ...L.Path.prototype.options, fill: true, radius: 10 },\r\n initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },\r\n getLatLng() { return this._latlng; },\r\n setLatLng(value) { this._latlng = latLng(value); this.fire('move', { latlng: this._latlng }); return this.redraw(); },\r\n getRadius() { return this.options.radius; },\r\n setRadius(radius) { this.options.radius = radius; return this.redraw(); },\r\n });\r\n L.Circle.include({\r\n initialize: L.CircleMarker.prototype.initialize,\r\n _project() {\r\n this._point = this._map.latLngToLayerPoint(this._latlng);\r\n this._radius = this._radiusY = this.getRadius() * this._map.options.crs.scale(this._map.getZoom()) /\r\n (2 * Math.PI * 6378137 * Math.cos(this._latlng.lat * Math.PI / 180));\r\n },\r\n getBounds() {\r\n const north = this.getRadius() / 6378137 * 180 / Math.PI;\r\n const east = north / Math.cos(this._latlng.lat * Math.PI / 180);\r\n return new L.LatLngBounds([this._latlng.lat - north, this._latlng.lng - east],\r\n [this._latlng.lat + north, this._latlng.lng + east]);\r\n },\r\n });\r\n L.Circle.mergeOptions(L.CircleMarker.prototype.options);\r\n L.GeoJSON = L.FeatureGroup.extend({\r\n initialize(data, options) {\r\n L.LayerGroup.prototype.initialize.call(this, [], options);\r\n if (data) this.addData(data);\r\n },\r\n addData(data) {\r\n const features = new ol.format.GeoJSON().readFeatures(data);\r\n const convert = (geometry, feature) => {\r\n const values = geometry.getCoordinates();\r\n const locations = value => typeof value[0] === 'number' ? [value[1], value[0]] : value.map(locations);\r\n switch (geometry.getType()) {\r\n case 'Point': return this.options.pointToLayer\r\n ? this.options.pointToLayer(feature, latLng(locations(values))) : new L.Marker(locations(values));\r\n case 'MultiPoint': return new L.FeatureGroup(values.map(value => convert(new ol.geom.Point(value), feature)));\r\n case 'LineString': case 'MultiLineString': return new L.Polyline(locations(values), this.options);\r\n case 'Polygon': case 'MultiPolygon': return new L.Polygon(locations(values), this.options);\r\n default: throw new Error(`Unsupported GeoJSON geometry: ${geometry.getType()}`);\r\n }\r\n };\r\n for (const feature of features) {\r\n const layer = convert(feature.getGeometry(), new ol.format.GeoJSON().writeFeatureObject(feature));\r\n this.addLayer(layer);\r\n }\r\n return this;\r\n },\r\n });\r\n\r\n L.GridLayer.include({\r\n options: { pane: 'tilePane', tileSize: 256, opacity: 1, minZoom: 0, maxZoom: 24, updateInterval: 200 },\r\n initialize(options) { L.Util.setOptions(this, options); this._tiles = {}; },\r\n getTileSize() { return typeof this.options.tileSize === 'number'\r\n ? new L.Point(this.options.tileSize, this.options.tileSize) : point(this.options.tileSize); },\r\n getEvents() { return { moveend: this._onMoveEnd, zoomend: this._onMoveEnd, resize: this._onMoveEnd }; },\r\n _initContainer() { this._container = L.DomUtil.create('div', '', this.getPane()); },\r\n onAdd() { this._initContainer(); this._onMoveEnd(); },\r\n onRemove() {\r\n for (const tile of Object.values(this._tiles)) this.fire('tileunload', { tile: tile.el, coords: tile.coords });\r\n this._tiles = {}; this._container?.remove();\r\n },\r\n _getTiledPixelBounds() {\r\n return new L.Bounds(this._map.project(this._map.getBounds().getNorthWest(), this._tileZoom),\r\n this._map.project(this._map.getBounds().getSouthEast(), this._tileZoom));\r\n },\r\n _onMoveEnd() {\r\n if (!this._map) return;\r\n this._tileZoom = Math.max(this.options.minZoom, Math.min(this.options.maxZoom, Math.round(this._map.getZoom())));\r\n const size = this.getTileSize(), extent = this._getTiledPixelBounds(this._map.getCenter());\r\n const min = extent.min.unscaleBy(size).floor(), max = extent.max.unscaleBy(size).floor();\r\n const retained = new Set(), limit = 2 ** this._tileZoom;\r\n for (let x = min.x; x <= max.x; x++) for (let y = min.y; y <= max.y; y++) {\r\n if (y < 0 || y >= limit) continue;\r\n const key = `${this._tileZoom}:${x}:${y}`;\r\n retained.add(key);\r\n if (this._tiles[key]) continue;\r\n const coords = new L.Point(x, y); coords.z = this._tileZoom;\r\n const tile = this._tiles[key] = { coords, current: true, loaded: 0 };\r\n const done = (error, element) => {\r\n if (this._tiles[key] !== tile) return;\r\n tile.el = element;\r\n if (error) { this.fire('tileerror', { error, tile: element, coords }); return; }\r\n tile.loaded = Date.now();\r\n this.fire('tileload', { tile: element, coords });\r\n this.fire('load');\r\n };\r\n tile.el = this.createTile(coords, done);\r\n if (this.createTile.length < 2) done(null, tile.el);\r\n }\r\n for (const [key, tile] of Object.entries(this._tiles)) {\r\n if (retained.has(key)) continue;\r\n delete this._tiles[key];\r\n this.fire('tileunload', { tile: tile.el, coords: tile.coords });\r\n }\r\n },\r\n _tileCoordsToNwSe(coords) {\r\n const size = this.getTileSize(), nw = new L.Point(coords.x * size.x, coords.y * size.y);\r\n return [this._map.unproject(nw, coords.z), this._map.unproject(nw.add(size), coords.z)];\r\n },\r\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\r\n setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },\r\n redraw() { if (this._map) { this.onRemove(); this._onMoveEnd(); } return this; },\r\n });\r\n L.TileLayer = L.GridLayer.extend({\r\n initialize(url, options) {\r\n L.GridLayer.prototype.initialize.call(this, options); this.setUrl(url);\r\n },\r\n setUrl(url) { this._url = url; this._source = new ol.source.XYZ({ url, crossOrigin: 'anonymous' }); return this.redraw(); },\r\n createTile(coords, done) {\r\n const url = this._source.getTileUrlFunction()([coords.z, coords.x, coords.y], 1, ol.proj.get('EPSG:3857'));\r\n const tile = image(url, this.options, '');\r\n tile.onload = () => done(null, tile);\r\n tile.onerror = () => done(new Error(`Unable to load tile: ${url}`), tile);\r\n return tile;\r\n },\r\n });\r\n L.TileLayer.WMS = L.TileLayer.extend({\r\n setUrl(url) {\r\n this._url = url;\r\n this._source = new ol.source.TileWMS({ url, crossOrigin: 'anonymous', params: {\r\n LAYERS: this.options.layers, FORMAT: this.options.format || 'image/png',\r\n TRANSPARENT: this.options.transparent || false,\r\n } });\r\n return this.redraw();\r\n },\r\n });\r\n L.ImageOverlay.include({\r\n options: { pane: 'overlayPane', opacity: 1, interactive: false },\r\n initialize(url, value, options) { L.Util.setOptions(this, options); this._url = url; this._bounds = bounds(value); },\r\n _initImage() {\r\n this._image = image(this._url, this.options, '');\r\n this._image.onload = () => this.fire('load');\r\n this._image.onerror = () => this.fire('error', { error: new Error(`Unable to load image: ${this._url}`) });\r\n },\r\n getBounds() { return this._bounds; },\r\n setBounds(value) { this._bounds = bounds(value); return this; },\r\n setUrl(url) { this._url = url; if (this._image) this._image.src = url; return this; },\r\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\r\n setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },\r\n });\r\n\r\n L.Icon = L.Evented.extend({\r\n initialize(options) { L.Util.setOptions(this, options); },\r\n createIcon() { return this._create('icon'); },\r\n createShadow() { return this.options.shadowUrl ? this._create('shadow') : null; },\r\n _create(kind) {\r\n const element = image(this.options[`${kind}Url`], this.options, `leaflet-marker-${kind}`);\r\n const size = this.options[`${kind}Size`], anchor = this.options[`${kind}Anchor`] || this.options.iconAnchor;\r\n if (size) { element.style.width = `${size[0]}px`; element.style.height = `${size[1]}px`; }\r\n if (anchor) { element.style.marginLeft = `${-anchor[0]}px`; element.style.marginTop = `${-anchor[1]}px`; }\r\n return element;\r\n },\r\n });\r\n L.Icon.Default = L.Icon.extend({\r\n options: {\r\n iconUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-icon.png',\r\n shadowUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-shadow.png',\r\n iconSize: [25, 41], iconAnchor: [12, 41], shadowSize: [41, 41], shadowAnchor: [12, 41],\r\n },\r\n });\r\n L.DivIcon = L.Icon.extend({\r\n createIcon() {\r\n const element = L.DomUtil.create('div', `leaflet-marker-icon ${this.options.className || ''}`);\r\n if (this.options.html instanceof Node) element.append(this.options.html); else element.innerHTML = this.options.html || '';\r\n const size = this.options.iconSize || [12, 12], anchor = this.options.iconAnchor || size.map(value => value / 2);\r\n element.style.cssText = `width:${size[0]}px;height:${size[1]}px;margin-left:${-anchor[0]}px;margin-top:${-anchor[1]}px`;\r\n return element;\r\n },\r\n createShadow() { return null; },\r\n });\r\n L.Marker.include({\r\n options: { pane: 'markerPane', icon: new L.Icon.Default(), opacity: 1, interactive: true, zIndexOffset: 0 },\r\n initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },\r\n getLatLng() { return this._latlng; },\r\n setLatLng(value) { this._latlng = latLng(value); this.update(); return this.fire('move', { latlng: this._latlng }); },\r\n setIcon(icon) { this.options.icon = icon; if (this._map) { this.onRemove(); this.onAdd(); } return this; },\r\n getEvents() { return { zoom: this.update, viewreset: this.update }; },\r\n onAdd() {\r\n this._icon = this.options.icon.createIcon(); this._shadow = this.options.icon.createShadow();\r\n this._icon.tabIndex = 0; this._icon.setAttribute('role', 'button');\r\n this._icon.setAttribute('aria-label', this.options.title || 'Marker');\r\n this._icon.title = this.options.title || '';\r\n for (const element of [this._shadow, this._icon]) if (element) this.getPane().append(element);\r\n this._initInteraction(); this.update();\r\n },\r\n onRemove() { this.dragging?.disable(); this._icon?.remove(); this._shadow?.remove(); },\r\n update() { if (this._map && this._icon) this._setPos(this._map.latLngToLayerPoint(this._latlng)); return this; },\r\n _setPos(value) {\r\n for (const element of [this._icon, this._shadow]) if (element) L.DomUtil.setPosition(element, value);\r\n this._zIndex = value.y + this.options.zIndexOffset; this._updateZIndex(0);\r\n },\r\n _updateZIndex(offset) { if (this._icon) this._icon.style.zIndex = this._zIndex + offset; },\r\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\r\n setZIndexOffset(value) { this.options.zIndexOffset = value; return this.update(); },\r\n _initInteraction() {\r\n this._icon._cityLayer = this;\r\n const drag = this.dragging = new L.Handler(this._map);\r\n const icon = this._icon;\r\n L.DomEvent.on(icon, 'pointerdown', event => {\r\n this._map._moved = false;\r\n event.stopPropagation();\r\n });\r\n L.DomEvent.on(icon, 'keydown', event => {\r\n if (event.key !== 'Enter' && event.key !== ' ') return;\r\n L.DomEvent.stop(event);\r\n this.fire('click', { latlng: this._latlng, originalEvent: event });\r\n });\r\n drag._marker = this;\r\n drag._draggable = new L.Evented();\r\n drag._onDrag = function () {\r\n const marker = this._marker;\r\n marker._latlng = marker._map.layerPointToLatLng(L.DomUtil.getPosition(marker._icon));\r\n marker.fire('move', { latlng: marker._latlng }).fire('drag', { latlng: marker._latlng });\r\n };\r\n drag._adjustPan = function () {};\r\n drag._draggable.on('drag', drag._onDrag, drag);\r\n let pointer, anchor, origin, moved;\r\n const handle = event => {\r\n if (!drag.enabled()) return;\r\n if (event.type === 'pointerdown') {\r\n if (event.button !== 0) return;\r\n event.preventDefault(); event.stopPropagation();\r\n pointer = event.pointerId; anchor = [event.clientX, event.clientY];\r\n origin = this._map.latLngToContainerPoint(this._latlng); moved = false;\r\n icon.setPointerCapture(pointer);\r\n this.fire('dragstart');\r\n } else if (event.pointerId === pointer && event.type === 'pointermove') {\r\n const value = new L.Point(origin.x + event.clientX - anchor[0], origin.y + event.clientY - anchor[1]);\r\n L.DomUtil.setPosition(icon, value);\r\n drag._draggable._newPos = value;\r\n drag._draggable.fire('drag', { originalEvent: event });\r\n moved = true;\r\n } else if (event.pointerId === pointer) {\r\n if (icon.hasPointerCapture(pointer)) icon.releasePointerCapture(pointer);\r\n pointer = null; this.fire('dragend'); this._map._moved = moved;\r\n }\r\n };\r\n drag.addHooks = () => L.DomEvent.on(icon, 'pointerdown pointermove pointerup pointercancel', handle);\r\n drag.removeHooks = () => L.DomEvent.off(icon, 'pointerdown pointermove pointerup pointercancel', handle);\r\n if (this.options.draggable) drag.enable();\r\n },\r\n });\r\n\r\n L.Map.include({\r\n _fireDOMEvent(event, type = event.type, targets) {\r\n const rect = this.getContainer().getBoundingClientRect();\r\n const pixel = new L.Point(event.clientX - rect.left, event.clientY - rect.top);\r\n const location = this.containerPointToLatLng(pixel);\r\n const layer = event.target.closest?.('.leaflet-marker-icon')?._cityLayer;\r\n if (type === 'click' && this._draggableMoved(layer)) return;\r\n for (const target of targets || (layer ? [layer] : [this])) {\r\n target.fire(type, { originalEvent: event, latlng: location, containerPoint: pixel,\r\n layerPoint: this.containerPointToLayerPoint(pixel) });\r\n }\r\n },\r\n });\r\n L.Map.addInitHook(function () {\r\n const mapPane = this.createPane('mapPane');\r\n for (const [name, order] of [['tilePane', 200], ['overlayPane', 400], ['markerPane', 600]]) {\r\n this.createPane(name, mapPane).style.zIndex = order;\r\n }\r\n const handler = event => this._fireDOMEvent(event);\r\n L.DomEvent.on(this.getContainer(), 'click mousemove mouseout mouseover', handler);\r\n this.once('unload', () => L.DomEvent.off(this.getContainer(), 'click mousemove mouseout mouseover', handler));\r\n });\r\n})();\r\n"],
|
|
4
|
+
"sourcesContent": ["// Leaflet-compatible classes backed by OpenLayers. Load after ol.js and before the plugin.\n(() => {\n if (!window.ol) throw new Error('Unable to load OpenLayers');\n\n const style = document.createElement('style');\n style.dataset.openlayersBindings = '';\n style.textContent = `\n.openlayers-city-mapper {\n position: relative;\n overflow: hidden;\n touch-action: none;\n}\n.ol-viewport {\n position: absolute !important;\n inset: 0;\n}\n.ol-overlaycontainer-stopevent { z-index: 1000 !important; }\n.ol-city-corner {\n position: absolute;\n display: flex;\n flex-direction: column;\n gap: .5em;\n pointer-events: none;\n}\n.ol-city-topleft { top: 5em; left: .5em; }\n.ol-city-topright { top: 10px; right: 10px; }\n.ol-city-bottomleft { bottom: .5em; left: .5em; }\n.ol-city-bottomright { bottom: 4em; right: .5em; }\n.ol-attribution {\n text-align: justify;\n border-radius: 0 !important;\n left: 0;\n right: 0 !important;\n max-width: unset;\n font-family: \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n font-size: .75rem;\n line-height: 1.5;\n}\n.ol-attribution a { color: #0078A8; }\n.ol-attribution * { text-shadow: none !important; }\n.ol-city-control {\n position: static;\n pointer-events: auto;\n font: 13px/1.5 sans-serif;\n}\n.ol-city-rotate {\n padding: 0;\n border: 1px solid #0003;\n border-radius: 4px;\n background: #fff;\n background-clip: padding-box;\n}\n.ol-city-rotate a {\n display: block;\n width: 30px;\n height: 30px;\n border-radius: 2px;\n color: #000;\n text-decoration: none;\n}\n.ol-city-rotate a:hover { background: #f4f4f4; }\n.ol-city-rotate a:focus-visible { outline: 2px solid #2675c9; }\n.ol-city-layers {\n max-height: calc(100vh - 5em);\n overflow: auto;\n border-radius: 4px;\n}\n.ol-city-layers section { padding: .5em; background: var(--ol-background-color); }\n.ol-city-layers label { display: block; cursor: pointer; white-space: nowrap; }\n.ol-city-layers input { vertical-align: middle; }\n.ol-city-layers hr { border: 0; border-top: 1px solid #ccc; }\n.ol-city-layers .ol-control { background: transparent; }\n.ol-city-layers .sunlight-time button { width: auto; padding: 0 .4em; flex-shrink: 0; }\n.openlayers-city-mapper .leaflet-pane {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n.ol-zoom button { width: 30px; height: 30px; }\n.openlayers-city-mapper .leaflet-marker-icon,\n.openlayers-city-mapper .leaflet-marker-shadow {\n position: absolute;\n top: 0;\n left: 0;\n}\n.openlayers-city-mapper .leaflet-marker-icon { pointer-events: auto; cursor: pointer; }\n.openlayers-city-mapper .leaflet-div-icon { background: #fff; border: 1px solid #666; }\n.ol-city-popup {\n padding: 10px;\n background: white;\n border: 1px solid #888;\n border-radius: 4px;\n font: 14px sans-serif;\n}\n.ol-city-popup button { float: right; margin-left: 12px; }\n.ol-city-tooltip {\n position: absolute;\n z-index: 1100;\n padding: 4px 8px;\n background: white;\n border: 1px solid #888;\n pointer-events: none;\n}\n`;\n document.head.appendChild(style);\n\n const L = window.L = { version: '1.9.4-openlayers', control: {} };\n let lastId = 0;\n const stamp = object => object._leaflet_id ||= ++lastId;\n const setOptions = (object, options) => object.options = { ...object.options, ...options };\n const zoomTiming = new Animation(new KeyframeEffect(null, [], {\n duration: 1, fill: 'both', easing: 'cubic-bezier(0,0,0.25,1)',\n }));\n\n function Class(...args) {\n this.initialize?.(...args);\n this.callInitHooks();\n }\n Class.extend = function (properties) {\n function Child(...args) {\n this.initialize?.(...args);\n this.callInitHooks();\n }\n Object.setPrototypeOf(Child, this);\n Child.prototype = Object.create(this.prototype);\n Object.assign(Child.prototype, properties, { constructor: Child });\n Child.prototype.options = { ...this.prototype.options, ...properties.options };\n Child.prototype._initHooks = [];\n return Child;\n };\n Class.include = function (properties) { Object.assign(this.prototype, properties); return this; };\n Class.mergeOptions = function (options) {\n this.prototype.options = { ...this.prototype.options, ...options };\n return this;\n };\n Class.addInitHook = function (hook, ...args) {\n if (!Object.hasOwn(this.prototype, '_initHooks')) this.prototype._initHooks = [];\n this.prototype._initHooks.push(typeof hook === 'function' ? hook : function () { this[hook](...args); });\n return this;\n };\n Class.prototype.callInitHooks = function () {\n if (this._initHooksCalled) return;\n this._initHooksCalled = true;\n const prototypes = [];\n for (let proto = Object.getPrototypeOf(this); proto; proto = Object.getPrototypeOf(proto)) prototypes.unshift(proto);\n for (const proto of prototypes) {\n if (Object.hasOwn(proto, '_initHooks')) for (const hook of proto._initHooks) hook.call(this);\n }\n };\n L.Evented = Class.extend({\n on(types, fn, context) {\n if (typeof types === 'object') {\n for (const [type, handler] of Object.entries(types)) this.on(type, handler, fn);\n } else {\n this._events ||= {};\n for (const type of types.split(/\\s+/)) {\n const events = this._events[type] ||= [];\n if (!events.some(event => event.fn === fn && event.context === context)) events.push({ fn, context });\n }\n }\n return this;\n },\n off(types, fn, context) {\n if (!types) this._events = {};\n else if (typeof types === 'object') {\n for (const [type, handler] of Object.entries(types)) this.off(type, handler, fn);\n } else {\n for (const type of types.split(/\\s+/)) {\n if (this._events?.[type]) this._events[type] = fn\n ? this._events[type].filter(event => event.fn !== fn || event.context !== context) : [];\n }\n }\n return this;\n },\n once(types, fn, context) {\n const handler = event => { this.off(types, handler); fn.call(context || this, event); };\n return this.on(types, handler);\n },\n fire(type, data) {\n for (const event of [...this._events?.[type] || []]) {\n event.fn.call(event.context || this, { ...data, type, target: this, sourceTarget: this });\n }\n return this;\n },\n listens(type) { return Boolean(this._events?.[type]?.length); },\n });\n L.Util = {\n stamp, setOptions,\n throttle(fn, interval, context) {\n let timer, pending;\n const run = (...args) => {\n if (timer) { pending = args; return; }\n fn.apply(context, args);\n timer = setTimeout(() => {\n timer = null;\n if (pending) { const args = pending; pending = null; run(...args); }\n }, interval);\n };\n return run;\n },\n };\n\n L.Point = function (x, y, round) {\n this.x = round ? Math.round(x) : x;\n this.y = round ? Math.round(y) : y;\n };\n const point = value => value instanceof L.Point ? value\n : Array.isArray(value) ? new L.Point(...value) : new L.Point(value.x, value.y);\n L.Point.prototype = {\n clone() { return new L.Point(this.x, this.y); },\n add(value) { return this.clone()._add(point(value)); },\n _add(value) { this.x += value.x; this.y += value.y; return this; },\n subtract(value) { return this.clone()._subtract(point(value)); },\n _subtract(value) { this.x -= value.x; this.y -= value.y; return this; },\n multiplyBy(value) { return new L.Point(this.x * value, this.y * value); },\n divideBy(value) { return new L.Point(this.x / value, this.y / value); },\n scaleBy(value) { return new L.Point(this.x * value.x, this.y * value.y); },\n unscaleBy(value) { return new L.Point(this.x / value.x, this.y / value.y); },\n round() { return new L.Point(Math.round(this.x), Math.round(this.y)); },\n floor() { return new L.Point(Math.floor(this.x), Math.floor(this.y)); },\n ceil() { return new L.Point(Math.ceil(this.x), Math.ceil(this.y)); },\n distanceTo(value) { value = point(value); return Math.hypot(this.x - value.x, this.y - value.y); },\n equals(value) { value = point(value); return this.x === value.x && this.y === value.y; },\n contains(value) { value = point(value); return Math.abs(value.x) <= Math.abs(this.x) && Math.abs(value.y) <= Math.abs(this.y); },\n };\n L.LatLng = function (lat, lng, alt) {\n if (!Number.isFinite(Number(lat)) || !Number.isFinite(Number(lng))) throw new Error('Invalid LatLng');\n this.lat = Number(lat); this.lng = Number(lng);\n if (alt !== undefined) this.alt = alt;\n };\n const latLng = value => value instanceof L.LatLng ? value\n : Array.isArray(value) ? new L.LatLng(...value) : new L.LatLng(value.lat, value.lng);\n L.LatLng.prototype = {\n equals(value, margin = 1e-9) {\n value = latLng(value);\n return Math.max(Math.abs(this.lat - value.lat), Math.abs(this.lng - value.lng)) <= margin;\n },\n distanceTo(value) { value = latLng(value); return ol.sphere.getDistance([this.lng, this.lat], [value.lng, value.lat]); },\n wrap() { return new L.LatLng(this.lat, ((this.lng + 180) % 360 + 360) % 360 - 180, this.alt); },\n };\n L.Bounds = function (a, b) {\n if (a) for (const value of b ? [a, b] : Array.isArray(a) ? a : [a]) this.extend(value);\n };\n L.Bounds.prototype = {\n extend(value) {\n if (value instanceof L.Bounds) { this.extend(value.min); this.extend(value.max); return this; }\n value = point(value);\n if (!this.min) { this.min = value.clone(); this.max = value.clone(); }\n else {\n this.min.x = Math.min(this.min.x, value.x); this.min.y = Math.min(this.min.y, value.y);\n this.max.x = Math.max(this.max.x, value.x); this.max.y = Math.max(this.max.y, value.y);\n }\n return this;\n },\n getCenter() { return this.min.add(this.max).divideBy(2); },\n getSize() { return this.max.subtract(this.min); },\n contains(value) {\n const min = value.min || point(value), max = value.max || min;\n return min.x >= this.min.x && max.x <= this.max.x && min.y >= this.min.y && max.y <= this.max.y;\n },\n intersects(value) {\n return value.max.x >= this.min.x && value.min.x <= this.max.x && value.max.y >= this.min.y && value.min.y <= this.max.y;\n },\n };\n L.LatLngBounds = function (a, b) {\n if (a) for (const value of b ? [a, b] : a) this.extend(value);\n };\n L.LatLngBounds.prototype = {\n extend(value) {\n if (value instanceof L.LatLngBounds) { this.extend(value._southWest); this.extend(value._northEast); return this; }\n value = latLng(value);\n if (!this._southWest) {\n this._southWest = new L.LatLng(value.lat, value.lng);\n this._northEast = new L.LatLng(value.lat, value.lng);\n } else {\n this._southWest.lat = Math.min(this._southWest.lat, value.lat);\n this._southWest.lng = Math.min(this._southWest.lng, value.lng);\n this._northEast.lat = Math.max(this._northEast.lat, value.lat);\n this._northEast.lng = Math.max(this._northEast.lng, value.lng);\n }\n return this;\n },\n getSouthWest() { return this._southWest; },\n getNorthEast() { return this._northEast; },\n getNorthWest() { return new L.LatLng(this.getNorth(), this.getWest()); },\n getSouthEast() { return new L.LatLng(this.getSouth(), this.getEast()); },\n getNorth() { return this._northEast.lat; },\n getSouth() { return this._southWest.lat; },\n getEast() { return this._northEast.lng; },\n getWest() { return this._southWest.lng; },\n getCenter() { return new L.LatLng((this.getNorth() + this.getSouth()) / 2, (this.getEast() + this.getWest()) / 2); },\n contains(value) {\n value = latLng(value);\n return value.lat >= this.getSouth() && value.lat <= this.getNorth() && value.lng >= this.getWest() && value.lng <= this.getEast();\n },\n isValid() { return Boolean(this._southWest && this._northEast); },\n };\n\n const radius = 6378137, circumference = 2 * Math.PI * radius;\n const crs = {\n scale: zoom => 256 * 2 ** zoom,\n zoom: scale => Math.log2(scale / 256),\n project(value) { value = latLng(value); return point(ol.proj.fromLonLat([value.lng, Math.max(-85.0511287798, Math.min(85.0511287798, value.lat))])); },\n unproject(value) { const [lng, lat] = ol.proj.toLonLat([value.x, value.y]); return new L.LatLng(lat, lng); },\n transformation: {\n transform(value, scale) { return new L.Point((value.x / circumference + 0.5) * scale, (0.5 - value.y / circumference) * scale); },\n untransform(value, scale) { return new L.Point((value.x / scale - 0.5) * circumference, (0.5 - value.y / scale) * circumference); },\n },\n };\n\n L.DomUtil = {\n create(tag, className = '', parent) {\n const element = document.createElement(tag);\n element.className = className; parent?.append(element); return element;\n },\n setPosition(element, value) { element._leaflet_pos = point(value); element.style.transform = `translate(${value.x}px,${value.y}px)`; },\n getPosition(element) { return element._leaflet_pos || new L.Point(0, 0); },\n };\n const domListeners = new WeakMap();\n function domEvent(add, element, types, fn, context) {\n if (typeof types === 'object') {\n for (const [type, handler] of Object.entries(types)) domEvent(add, element, type, handler, fn);\n return L.DomEvent;\n }\n let listeners = domListeners.get(element);\n if (!listeners) domListeners.set(element, listeners = []);\n for (const type of types.split(/\\s+/)) {\n const existing = listeners.find(item => item.type === type && item.fn === fn && item.context === context);\n if (add && !existing) {\n const handler = context ? fn.bind(context) : fn;\n listeners.push({ type, fn, context, handler });\n element.addEventListener(type, handler, { passive: false });\n } else if (!add && existing) {\n element.removeEventListener(type, existing.handler);\n listeners.splice(listeners.indexOf(existing), 1);\n }\n }\n return L.DomEvent;\n }\n const stopPropagation = event => event.stopPropagation();\n L.DomEvent = {\n on: (...args) => domEvent(true, ...args),\n off: (...args) => domEvent(false, ...args),\n stop(event) { event.preventDefault(); event.stopPropagation(); },\n disableClickPropagation(element) {\n element.classList.add('leaflet-control');\n L.DomEvent.on(element, 'click dblclick pointerdown mousedown touchstart contextmenu', stopPropagation);\n return this;\n },\n disableScrollPropagation(element) { return this.on(element, 'wheel', stopPropagation); },\n };\n L.Handler = Class.extend({\n initialize(map) { this._map = map; },\n enable() { if (!this._enabled) { this._enabled = true; this.addHooks?.(); } return this; },\n disable() { if (this._enabled) { this._enabled = false; this.removeHooks?.(); } return this; },\n enabled() { return Boolean(this._enabled); },\n moving() { return Boolean(this._moving); },\n });\n L.Layer = L.Evented.extend({\n initialize(options) { setOptions(this, options); },\n addTo(map) { map.addLayer(this); return this; },\n remove() { return this.removeFrom(this._map || this._mapToAdd); },\n removeFrom(map) { map?.removeLayer(this); return this; },\n getAttribution() { return this.options.attribution; },\n getPane(name) { return this._map.getPane(name || this.options.pane); },\n _layerAdd({ target: map }) {\n if (!map.hasLayer(this)) return;\n this._map = map;\n if (this.getEvents) { this._mapEvents = this.getEvents(); map.on(this._mapEvents, this); }\n this.onAdd?.(map);\n this.fire('add'); map.fire('layeradd', { layer: this });\n },\n });\n L.LayerGroup = L.Layer.extend({\n initialize(layers = [], options) {\n setOptions(this, options); this._layers = {};\n for (const layer of layers) this.addLayer(layer);\n },\n addLayer(layer) { this._layers[stamp(layer)] = layer; this._map?.addLayer(layer); return this; },\n removeLayer(layer) { delete this._layers[stamp(layer)]; this._map?.removeLayer(layer); return this; },\n hasLayer(layer) { return stamp(layer) in this._layers; },\n eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },\n onAdd(map) { this.eachLayer(map.addLayer, map); },\n onRemove(map) { this.eachLayer(map.removeLayer, map); },\n });\n // Declare the hierarchy before the plugin installs its instanceof checks and hooks.\n for (const [name, parent] of [\n ['GridLayer', L.Layer], ['Marker', L.Layer], ['Path', L.Layer],\n ['Polyline', null], ['Polygon', null], ['CircleMarker', null], ['Circle', null],\n ['ImageOverlay', L.Layer], ['VideoOverlay', null], ['SVGOverlay', null],\n ['Popup', L.Layer], ['Tooltip', L.Layer], ['DivIcon', Class],\n ]) {\n const base = parent || ({ Polyline: L.Path, Polygon: L.Polyline, CircleMarker: L.Path,\n Circle: L.CircleMarker, VideoOverlay: L.ImageOverlay, SVGOverlay: L.ImageOverlay })[name];\n L[name] = base.extend({\n initialize() { throw new Error(`L.${name} is not supported by the OpenLayers bindings; use L.Layer with a source`); },\n getEvents() { return {}; },\n });\n }\n\n L.Map = L.Evented.extend({\n options: { crs, minZoom: 0, maxZoom: 24, zoomSnap: 1, touchZoom: true,\n scrollWheelZoom: true, keyboard: true, doubleClickZoom: true,\n wheelDebounceTime: 40, wheelPxPerZoomLevel: 60 },\n initialize(target, options) {\n setOptions(this, options);\n this._container = typeof target === 'string' ? document.getElementById(target) : target;\n if (!this._container) throw new Error('Map container not found');\n stamp(this._container);\n this._container.classList.add('openlayers-city-mapper');\n this._layers = {}; this._panes = {}; this._handlers = []; this._controls = new Set();\n const center = crs.project(this.options.center || [0, 0]);\n this.ol = new ol.Map({\n target: this._container, controls: [new ol.control.Zoom(), new ol.control.Attribution({collapsible: false })],\n interactions: [],\n view: new ol.View({ center: [center.x, center.y], zoom: this.options.zoom || 0,\n minZoom: this.getMinZoom(), maxZoom: this.getMaxZoom() }),\n });\n for (const control of this.ol.getControls().getArray()) {\n control.element.classList.add('leaflet-control');\n for (const button of control.element.querySelectorAll('button[title]')) button.setAttribute('aria-label', button.title);\n if (control instanceof ol.control.Zoom) {\n for (const [selector, delta] of [['.ol-zoom-in', 1], ['.ol-zoom-out', -1]]) {\n control.element.querySelector(selector).addEventListener('click', event => {\n L.DomEvent.stop(event);\n event.stopImmediatePropagation();\n this._zoomBy(delta * (event.shiftKey ? 3 : 1));\n }, true);\n }\n }\n }\n this._loaded = true;\n this._zoomAnimated = false;\n this.dragging = new L.Handler(this).enable();\n this.touchZoom = new L.Handler(this);\n if (this.options.touchZoom) this.touchZoom.enable();\n this._handlers.push(this.dragging, this.touchZoom);\n for (const name of ['scrollWheelZoom', 'keyboard', 'doubleClickZoom']) this.addHandler(name, L.Handler);\n if (!this._container.hasAttribute('tabindex')) this._container.tabIndex = 0;\n const view = this.ol.getView();\n this._viewZoom = view.getZoom();\n view.on(['change:center', 'change:resolution'], () => {\n if (this._settingView) return;\n const zoomChanged = view.getZoom() !== this._viewZoom;\n if (!this._viewMoving) { this._viewMoving = true; this.fire('movestart'); }\n if (zoomChanged && !this._viewZooming) { this._viewZooming = true; this.fire('zoomstart'); }\n this.fire('move');\n if (zoomChanged) this.fire('zoom');\n this._viewZoom = view.getZoom();\n if (!view.getAnimating() && !view.getInteracting()) this._endViewChange();\n });\n this.ol.on('moveend', () => this._endViewChange());\n // OpenLayers interactions need the pitched ground coordinate, not the flat viewport.\n this.ol.getCoordinateFromPixel = pixel => {\n const coordinate = crs.project(this.containerPointToLatLng(point(pixel)));\n return [coordinate.x, coordinate.y];\n };\n this._wheelDelta = 0;\n this.ol.addInteraction(new ol.interaction.Interaction({\n handleEvent: event => {\n const original = event.originalEvent;\n if (original.target.closest('.ol-control')) return true;\n if (event.type === 'dblclick' && this.doubleClickZoom.enabled()) {\n this._zoomBy(original.shiftKey ? -1 : 1, point(event.pixel));\n } else if (event.type === 'wheel' && this.scrollWheelZoom.enabled() && !original.shiftKey) {\n const ratio = window.devicePixelRatio || 1;\n const factor = /Linux/.test(navigator.platform) && /Chrome/.test(navigator.userAgent) ? ratio\n : /Mac/.test(navigator.platform) ? 3 * ratio : 2 * ratio;\n this._wheelDelta -= original.deltaY * (original.deltaMode === 1 ? 20\n : original.deltaMode === 2 ? 60 : 1 / factor);\n this._wheelPixel = point(event.pixel);\n this._wheelStart ??= performance.now();\n clearTimeout(this._wheelTimer);\n this._wheelTimer = setTimeout(() => {\n const magnitude = 4 * Math.log2(2 / (1 + Math.exp(-Math.abs(this._wheelDelta /\n (this.options.wheelPxPerZoomLevel * 4)))));\n const snap = this.options.zoomSnap;\n const delta = Math.sign(this._wheelDelta) * (snap ? Math.ceil(magnitude / snap) * snap : magnitude);\n this._wheelDelta = 0;\n this._wheelStart = null;\n if (this._loaded && this.scrollWheelZoom.enabled()) this._zoomBy(delta,\n this.options.scrollWheelZoom === 'center' ? undefined : this._wheelPixel);\n }, Math.max(0, this.options.wheelDebounceTime - (performance.now() - this._wheelStart)));\n } else return true;\n original.preventDefault();\n return false;\n },\n }));\n this._controlCorners = {};\n for (const position of ['topleft', 'topright', 'bottomleft', 'bottomright']) {\n this._controlCorners[position] = L.DomUtil.create('div',\n `ol-city-corner ol-city-${position}`, this.ol.getOverlayContainerStopEvent());\n }\n const attributionSource = new ol.source.Vector();\n this.ol.addLayer(new ol.layer.Vector({ source: attributionSource }));\n const updateAttribution = () => {\n const values = new Set(['<a href=\"https://openlayers.org/\">OpenLayers</a>']);\n this.eachLayer(layer => { if (layer.getAttribution?.()) values.add(layer.getAttribution()); });\n attributionSource.setAttributions([...values]);\n };\n this.on('layeradd layerremove', updateAttribution);\n updateAttribution();\n let anchor, pointerId;\n const pixel = event => {\n const rect = this._container.getBoundingClientRect();\n return new L.Point(event.clientX - rect.left, event.clientY - rect.top);\n };\n this._onPointer = event => {\n if (event.type === 'pointerdown') {\n if (!this.dragging.enabled() || event.button !== 0 || !event.isPrimary || event.target.closest('.ol-control')) return;\n anchor = this.containerPointToLatLng(pixel(event)); pointerId = event.pointerId;\n this._moved = this.dragging._moving = false;\n this._container.focus({ preventScroll: true });\n this._container.setPointerCapture(pointerId);\n } else if (event.pointerId === pointerId && event.type === 'pointermove' && this.dragging.enabled()) {\n const delta = this.project(anchor).subtract(this.project(this.containerPointToLatLng(pixel(event))));\n if (Math.hypot(delta.x, delta.y) > 1) this._moved = this.dragging._moving = true;\n this.setView(this.unproject(this.project(this.getCenter()).add(delta)), this.getZoom());\n } else if (event.pointerId === pointerId && event.type !== 'pointermove') {\n if (this._container.hasPointerCapture(pointerId)) this._container.releasePointerCapture(pointerId);\n anchor = null; pointerId = null;\n this.dragging._moving = false;\n }\n };\n this._onKey = event => {\n if (!this.keyboard.enabled() || event.target !== this._container || event.altKey || event.ctrlKey || event.metaKey) return;\n const offsets = { ArrowLeft: [-80, 0], ArrowRight: [80, 0], ArrowUp: [0, -80], ArrowDown: [0, 80] };\n if (offsets[event.key]) this.panBy(offsets[event.key]);\n else if (['+', '=', '-', '_'].includes(event.key)) this._zoomBy(\n (['-', '_'].includes(event.key) ? -1 : 1) * (event.shiftKey ? 3 : 1));\n else return;\n event.preventDefault();\n };\n L.DomEvent.on(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);\n L.DomEvent.on(this._container, 'keydown', this._onKey);\n this.ol.on('change:size', () => this.fire('resize', { newSize: this.getSize() }));\n this.ol.updateSize();\n },\n getContainer() { return this._container; },\n getSize() { return point(this.ol.getSize() || [this._container.clientWidth, this._container.clientHeight]); },\n getCenter() { return crs.unproject(point(this.ol.getView().getCenter())); },\n getZoom() { return this.ol.getView().getZoom(); },\n getMinZoom() { return this.options.minZoom; },\n getMaxZoom() { return this.options.maxZoom; },\n getZoomScale(to, from = this.getZoom()) { return 2 ** (to - from); },\n getScaleZoom(scale, from = this.getZoom()) { return from + Math.log2(scale); },\n _limitZoom(zoom) { return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), zoom)); },\n project(value, zoom = this.getZoom()) { return crs.transformation.transform(crs.project(value), crs.scale(zoom)); },\n unproject(value, zoom = this.getZoom()) { return crs.unproject(crs.transformation.untransform(point(value), crs.scale(zoom))); },\n getPixelOrigin() { return this.project(this.getCenter()).subtract(this.getSize().divideBy(2)); },\n _getMapPanePos() { return new L.Point(0, 0); },\n latLngToLayerPoint(value) { return this.project(value).subtract(this.getPixelOrigin()); },\n layerPointToLatLng(value) { return this.unproject(point(value).add(this.getPixelOrigin())); },\n layerPointToContainerPoint(value) { return point(value).clone(); },\n containerPointToLayerPoint(value) { return point(value).clone(); },\n latLngToContainerPoint(value) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(value)); },\n containerPointToLatLng(value) { return this.layerPointToLatLng(this.containerPointToLayerPoint(value)); },\n getBounds() { return new L.LatLngBounds(this.containerPointToLatLng([0, 0]), this.containerPointToLatLng(this.getSize())); },\n _endViewChange() {\n if (!this._viewMoving) return;\n const zooming = this._viewZooming;\n this._viewMoving = this._viewZooming = false;\n if (zooming) this.fire('zoomend');\n this.fire('moveend');\n },\n _zoomBy(delta, pixel) {\n if (!delta || this.ol.getView().getAnimating()) return this;\n const zoom = this._limitZoom(this.getZoom() + delta);\n return pixel ? this.setZoomAround(pixel, zoom, { animate: true })\n : this.setZoom(zoom, { animate: true });\n },\n setView(center, zoom = this.getZoom(), options = {}) {\n center = latLng(center); zoom = this._limitZoom(zoom);\n if ((options.animate === true || options.zoom?.animate === true) && zoom !== this.getZoom()) {\n const scale = this.getZoomScale(zoom), projected = crs.project(center);\n // Leaflet animates CSS scale, not resolution; convert the same native CSS easing.\n this.ol.getView().animate({\n center: [projected.x, projected.y], zoom, duration: 250,\n easing: time => {\n zoomTiming.currentTime = time;\n const progress = zoomTiming.effect.getComputedTiming().progress;\n return (1 - 1 / (1 + (scale - 1) * progress)) / (1 - 1 / scale);\n },\n });\n return this;\n }\n this.ol.getView().cancelAnimations();\n this._endViewChange();\n const zoomChanged = zoom !== this.getZoom(), moved = !center.equals(this.getCenter());\n if (!zoomChanged && !moved) return this;\n this.fire('movestart');\n if (zoomChanged) this.fire('zoomstart');\n this._settingView = true;\n const projected = crs.project(center);\n this.ol.getView().setCenter([projected.x, projected.y]);\n this.ol.getView().setZoom(zoom);\n this._viewZoom = this.getZoom();\n this._settingView = false;\n if (zoomChanged) this.fire('zoom');\n this.fire('move').fire('viewreset');\n if (zoomChanged) this.fire('zoomend');\n return this.fire('moveend');\n },\n setZoom(zoom, options) { return this.setView(this.getCenter(), zoom, options); },\n panTo(center) { return this.setView(center); },\n panBy(offset) { return this.panTo(this.unproject(this.project(this.getCenter()).add(point(offset)))); },\n setZoomAround(value, zoom, options) {\n const anchor = value instanceof L.Point ? value : this.latLngToContainerPoint(value);\n const half = this.getSize().divideBy(2), scale = this.getZoomScale(zoom);\n return this.setView(this.unproject(this.project(this.getCenter()).add(anchor.subtract(half).multiplyBy(1 - 1 / scale))), zoom, options);\n },\n getBoundsZoom(bounds, inside, padding = [0, 0]) {\n const size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));\n const available = this.getSize().subtract(point(padding));\n const scale = Math[inside ? 'max' : 'min'](available.x / size.x, available.y / size.y);\n return this._limitZoom(this.getScaleZoom(scale));\n },\n _getBoundsCenterZoom(bounds, options = {}) { return { center: bounds.getCenter(), zoom: this.getBoundsZoom(bounds, false, options.padding) }; },\n fitBounds(bounds, options) { const view = this._getBoundsCenterZoom(bounds, options); return this.setView(view.center, view.zoom); },\n _limitCenter(center) { return center; },\n _limitOffset(offset) { return offset; },\n _tryAnimatedPan() { return false; },\n panInside(value) { if (!this.getBounds().contains(value)) this.panTo(value); return this; },\n whenReady(fn, context) { if (this._loaded) fn.call(context || this, { target: this }); else this.once('load', fn, context); return this; },\n addLayer(layer) {\n const id = stamp(layer);\n if (this._layers[id]) return this;\n this._layers[id] = layer; layer._mapToAdd = this;\n layer.beforeAdd?.(this);\n this.whenReady(layer._layerAdd, layer);\n return this;\n },\n removeLayer(layer) {\n if (!this.hasLayer(layer)) return this;\n layer.onRemove?.(this);\n if (layer._mapEvents) this.off(layer._mapEvents, layer);\n delete this._layers[stamp(layer)];\n this.fire('layerremove', { layer }); layer.fire('remove');\n layer._map = layer._mapToAdd = null;\n return this;\n },\n hasLayer(layer) { return Boolean(this._layers[stamp(layer)]); },\n eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },\n createPane(name, parent = this._container) { return this._panes[name] = L.DomUtil.create('div', `leaflet-pane leaflet-${name}`, parent); },\n getPane(name = 'overlayPane') { return this._panes[name]; },\n addHandler(name, Handler) { this[name] = new Handler(this); this._handlers.push(this[name]); if (this.options[name]) this[name].enable(); return this; },\n invalidateSize() { this.ol.updateSize(); return this; },\n _draggableMoved() { return Boolean(this._moved); },\n remove() {\n clearTimeout(this._wheelTimer);\n this.ol.getView().cancelAnimations();\n this.fire('unload');\n for (const control of [...this._controls]) control.remove();\n this.eachLayer(this.removeLayer, this);\n for (const handler of this._handlers) handler.disable();\n L.DomEvent.off(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);\n L.DomEvent.off(this._container, 'keydown', this._onKey);\n this.ol.setTarget(undefined); this.ol.dispose();\n for (const corner of Object.values(this._controlCorners)) corner.remove();\n for (const pane of Object.values(this._panes)) pane.remove();\n this._loaded = false;\n delete this._container._leaflet_id;\n return this.off();\n },\n });\n\n L.Control = Class.extend({\n options: { position: 'topright' },\n initialize(options) { setOptions(this, options); },\n getPosition() { return this.options.position; },\n getContainer() { return this._container; },\n addTo(map) {\n this.remove(); this._map = map;\n this._container = this.onAdd(map);\n if (L.Control.Rotate && this instanceof L.Control.Rotate) {\n this._container.classList.add('ol-city-rotate');\n }\n this._container.classList.add('leaflet-control', 'ol-control', 'ol-city-control');\n this._olControl = new ol.control.Control({\n element: this._container, target: map._controlCorners[this.getPosition()],\n });\n map.ol.addControl(this._olControl);\n map._controls.add(this);\n return this;\n },\n remove() {\n if (!this._map) return this;\n const map = this._map;\n this.onRemove?.(map); this._container?.remove();\n map.ol.removeControl(this._olControl);\n map._controls.delete(this); this._map = null;\n return this;\n },\n });\n L.Control.Layers = L.Control.extend({\n options: { collapsed: true },\n initialize(base = {}, overlays = {}, options) {\n setOptions(this, options); this._layers = [];\n for (const [name, layer] of Object.entries(base)) this._layers.push({ name, layer, overlay: false });\n for (const [name, layer] of Object.entries(overlays)) this._layers.push({ name, layer, overlay: true });\n },\n onAdd(map) {\n const container = L.DomUtil.create('div', 'ol-city-layers');\n L.DomEvent.disableClickPropagation(container); L.DomEvent.disableScrollPropagation(container);\n const list = L.DomUtil.create('section', '', container);\n list.setAttribute('aria-label', 'Map layers');\n const base = L.DomUtil.create('div', '', list);\n L.DomUtil.create('hr', '', list);\n const overlays = L.DomUtil.create('div', '', list);\n this._inputs = [];\n for (const entry of this._layers) {\n const label = L.DomUtil.create('label', '', entry.overlay ? overlays : base);\n const input = L.DomUtil.create('input', 'leaflet-control-layers-selector', label);\n input.type = entry.overlay ? 'checkbox' : 'radio';\n input.name = `base-${stamp(this)}`; input.layerId = stamp(entry.layer);\n input.checked = map.hasLayer(entry.layer);\n label.append(document.createTextNode(` ${entry.name}`));\n this._inputs.push(input);\n input.onchange = () => {\n const checked = input.checked;\n if (!entry.overlay) for (const other of this._layers) {\n if (!other.overlay && other !== entry) map.removeLayer(other.layer);\n }\n if (checked) map.addLayer(entry.layer); else map.removeLayer(entry.layer);\n };\n }\n map.on('layeradd layerremove', this._update, this);\n return container;\n },\n _update() { for (const input of this._inputs) input.checked = Boolean(this._map._layers[input.layerId]); },\n onRemove(map) { map.off('layeradd layerremove', this._update, this); },\n });\n\n // Native layer contracts consumed by the plugin's WebGPU renderer.\n const bounds = value => value instanceof L.LatLngBounds ? value : new L.LatLngBounds(value);\n const coordinates = values => values.map(value => Array.isArray(value) && typeof value[0] !== 'number'\n ? coordinates(value) : latLng(value));\n const image = (url, options, className) => {\n const element = document.createElement('img');\n element.className = className;\n if (options.crossOrigin) element.crossOrigin = options.crossOrigin === true ? '' : options.crossOrigin;\n element.src = url;\n element.draggable = false;\n return element;\n };\n\n L.Layer.include({\n bindPopup(content) {\n this._popupContent = content;\n this.off('click', this.openPopup, this).on('click', this.openPopup, this);\n this.once('remove', this.closePopup, this);\n if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindPopup(content));\n return this;\n },\n openPopup(event) {\n if (!this._map) return this;\n this.closePopup();\n const location = event?.latlng || this.getLatLng?.() || this.getBounds?.().getCenter();\n if (!location) throw new Error('Popup requires a location');\n const element = L.DomUtil.create('div', 'ol-city-popup leaflet-popup');\n element.setAttribute('role', 'dialog');\n const close = L.DomUtil.create('button', '', element);\n close.type = 'button'; close.textContent = '\\u00d7'; close.setAttribute('aria-label', 'Close popup');\n close.onclick = () => this.closePopup();\n const content = L.DomUtil.create('div', '', element);\n const value = typeof this._popupContent === 'function' ? this._popupContent(this) : this._popupContent;\n if (value instanceof Node) content.append(value); else content.innerHTML = value;\n L.DomEvent.disableClickPropagation(element);\n this._popupOverlay = new ol.Overlay({ element, positioning: 'bottom-center', offset: [0, -12] });\n this._map.ol.addOverlay(this._popupOverlay);\n this._popupLocation = latLng(location);\n this._map.on('move zoom rotate pitch', this._positionPopup, this);\n this._positionPopup();\n return this;\n },\n _positionPopup() {\n const screen = this._map.latLngToContainerPoint(this._popupLocation);\n this._popupOverlay.setPosition(this._map.ol.getCoordinateFromPixelInternal([screen.x, screen.y]));\n },\n closePopup() {\n if (this._popupOverlay) {\n this._map?.off('move zoom rotate pitch', this._positionPopup, this);\n this._map?.ol.removeOverlay(this._popupOverlay);\n this._popupOverlay = null;\n }\n return this;\n },\n bindTooltip(content) {\n this._tooltipContent = content;\n this.on('mouseover', this._showTooltip, this).on('mouseout remove', this._hideTooltip, this);\n if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindTooltip(content));\n return this;\n },\n _showTooltip(event) {\n this._hideTooltip();\n if (!this._map || !event.latlng) return;\n const element = this._tooltipElement = L.DomUtil.create('div', 'ol-city-tooltip leaflet-tooltip', this._map.getContainer());\n element.setAttribute('role', 'tooltip');\n const value = typeof this._tooltipContent === 'function' ? this._tooltipContent(this) : this._tooltipContent;\n if (value instanceof Node) element.append(value); else element.innerHTML = value;\n const pixel = this._map.latLngToContainerPoint(event.latlng);\n element.style.left = `${pixel.x + 12}px`; element.style.top = `${pixel.y + 12}px`;\n },\n _hideTooltip() { this._tooltipElement?.remove(); this._tooltipElement = null; },\n });\n L.LayerGroup.include({\n getLayers() { return Object.values(this._layers); },\n getBounds() {\n const result = new L.LatLngBounds();\n this.eachLayer(layer => result.extend(layer.getBounds?.() || layer.getLatLng()));\n return result;\n },\n });\n L.FeatureGroup = L.LayerGroup.extend({});\n\n L.Path.include({\n options: { pane: 'overlayPane', interactive: true, stroke: true, color: '#3388ff',\n weight: 3, opacity: 1, lineCap: 'round', lineJoin: 'round', fill: false, fillOpacity: 0.2 },\n initialize(options) { L.Util.setOptions(this, options); },\n setStyle(options) { L.Util.setOptions(this, options); return this.redraw(); },\n redraw() { return this; },\n bringToFront() { return this; },\n bringToBack() { return this; },\n });\n L.Polyline.include({\n initialize(values, options) { L.Util.setOptions(this, options); this.setLatLngs(values); },\n getLatLngs() { return this._latlngs; },\n setLatLngs(values) { this._latlngs = coordinates(values); return this.redraw(); },\n addLatLng(value) { this._latlngs.push(latLng(value)); return this.redraw(); },\n getBounds() {\n const result = new L.LatLngBounds();\n const visit = values => { for (const value of values) Array.isArray(value) ? visit(value) : result.extend(value); };\n visit(this._latlngs);\n return result;\n },\n _project() {\n this._rings = [];\n const visit = values => {\n if (!values.length) return;\n if (Array.isArray(values[0])) values.forEach(visit);\n else this._rings.push(values.map(value => this._map.latLngToLayerPoint(value)));\n };\n visit(this._latlngs);\n },\n closestLayerPoint(value) {\n this._project();\n const paths = this._rings.map(ring => ring.map(value => [value.x, value.y]));\n const closest = new ol.geom.MultiLineString(paths).getClosestPoint([value.x, value.y]);\n return point(closest);\n },\n });\n L.Polyline.mergeOptions(L.Path.prototype.options);\n L.Polygon.include({ initialize: L.Polyline.prototype.initialize });\n L.Polygon.mergeOptions(L.Path.prototype.options);\n L.Polygon.mergeOptions({ fill: true });\n L.Rectangle = L.Polygon.extend({\n initialize(value, options) { L.Util.setOptions(this, options); this.setBounds(value); },\n setBounds(value) {\n value = bounds(value);\n return this.setLatLngs([value.getSouthWest(), value.getNorthWest(), value.getNorthEast(), value.getSouthEast()]);\n },\n });\n L.CircleMarker.include({\n options: { ...L.Path.prototype.options, fill: true, radius: 10 },\n initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },\n getLatLng() { return this._latlng; },\n setLatLng(value) { this._latlng = latLng(value); this.fire('move', { latlng: this._latlng }); return this.redraw(); },\n getRadius() { return this.options.radius; },\n setRadius(radius) { this.options.radius = radius; return this.redraw(); },\n });\n L.Circle.include({\n initialize: L.CircleMarker.prototype.initialize,\n _project() {\n this._point = this._map.latLngToLayerPoint(this._latlng);\n this._radius = this._radiusY = this.getRadius() * this._map.options.crs.scale(this._map.getZoom()) /\n (2 * Math.PI * 6378137 * Math.cos(this._latlng.lat * Math.PI / 180));\n },\n getBounds() {\n const north = this.getRadius() / 6378137 * 180 / Math.PI;\n const east = north / Math.cos(this._latlng.lat * Math.PI / 180);\n return new L.LatLngBounds([this._latlng.lat - north, this._latlng.lng - east],\n [this._latlng.lat + north, this._latlng.lng + east]);\n },\n });\n L.Circle.mergeOptions(L.CircleMarker.prototype.options);\n L.GeoJSON = L.FeatureGroup.extend({\n initialize(data, options) {\n L.LayerGroup.prototype.initialize.call(this, [], options);\n if (data) this.addData(data);\n },\n addData(data) {\n const features = new ol.format.GeoJSON().readFeatures(data);\n const convert = (geometry, feature) => {\n const values = geometry.getCoordinates();\n const locations = value => typeof value[0] === 'number' ? [value[1], value[0]] : value.map(locations);\n switch (geometry.getType()) {\n case 'Point': return this.options.pointToLayer\n ? this.options.pointToLayer(feature, latLng(locations(values))) : new L.Marker(locations(values));\n case 'MultiPoint': return new L.FeatureGroup(values.map(value => convert(new ol.geom.Point(value), feature)));\n case 'LineString': case 'MultiLineString': return new L.Polyline(locations(values), this.options);\n case 'Polygon': case 'MultiPolygon': return new L.Polygon(locations(values), this.options);\n default: throw new Error(`Unsupported GeoJSON geometry: ${geometry.getType()}`);\n }\n };\n for (const feature of features) {\n const layer = convert(feature.getGeometry(), new ol.format.GeoJSON().writeFeatureObject(feature));\n this.addLayer(layer);\n }\n return this;\n },\n });\n\n L.GridLayer.include({\n options: { pane: 'tilePane', tileSize: 256, opacity: 1, minZoom: 0, maxZoom: 24, updateInterval: 200 },\n initialize(options) { L.Util.setOptions(this, options); this._tiles = {}; },\n getTileSize() { return typeof this.options.tileSize === 'number'\n ? new L.Point(this.options.tileSize, this.options.tileSize) : point(this.options.tileSize); },\n getEvents() { return { moveend: this._onMoveEnd, zoomend: this._onMoveEnd, resize: this._onMoveEnd }; },\n _initContainer() { this._container = L.DomUtil.create('div', '', this.getPane()); },\n onAdd() { this._initContainer(); this._onMoveEnd(); },\n onRemove() {\n for (const tile of Object.values(this._tiles)) this.fire('tileunload', { tile: tile.el, coords: tile.coords });\n this._tiles = {}; this._container?.remove();\n },\n _getTiledPixelBounds() {\n return new L.Bounds(this._map.project(this._map.getBounds().getNorthWest(), this._tileZoom),\n this._map.project(this._map.getBounds().getSouthEast(), this._tileZoom));\n },\n _onMoveEnd() {\n if (!this._map) return;\n this._tileZoom = Math.max(this.options.minZoom, Math.min(this.options.maxZoom, Math.round(this._map.getZoom())));\n const size = this.getTileSize(), extent = this._getTiledPixelBounds(this._map.getCenter());\n const min = extent.min.unscaleBy(size).floor(), max = extent.max.unscaleBy(size).floor();\n const retained = new Set(), limit = 2 ** this._tileZoom;\n for (let x = min.x; x <= max.x; x++) for (let y = min.y; y <= max.y; y++) {\n if (y < 0 || y >= limit) continue;\n const key = `${this._tileZoom}:${x}:${y}`;\n retained.add(key);\n if (this._tiles[key]) continue;\n const coords = new L.Point(x, y); coords.z = this._tileZoom;\n const tile = this._tiles[key] = { coords, current: true, loaded: 0 };\n const done = (error, element) => {\n if (this._tiles[key] !== tile) return;\n tile.el = element;\n if (error) { this.fire('tileerror', { error, tile: element, coords }); return; }\n tile.loaded = Date.now();\n this.fire('tileload', { tile: element, coords });\n this.fire('load');\n };\n tile.el = this.createTile(coords, done);\n if (this.createTile.length < 2) done(null, tile.el);\n }\n for (const [key, tile] of Object.entries(this._tiles)) {\n if (retained.has(key)) continue;\n delete this._tiles[key];\n this.fire('tileunload', { tile: tile.el, coords: tile.coords });\n }\n },\n _tileCoordsToNwSe(coords) {\n const size = this.getTileSize(), nw = new L.Point(coords.x * size.x, coords.y * size.y);\n return [this._map.unproject(nw, coords.z), this._map.unproject(nw.add(size), coords.z)];\n },\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\n setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },\n redraw() { if (this._map) { this.onRemove(); this._onMoveEnd(); } return this; },\n });\n L.TileLayer = L.GridLayer.extend({\n initialize(url, options) {\n L.GridLayer.prototype.initialize.call(this, options); this.setUrl(url);\n },\n setUrl(url) { this._url = url; this._source = new ol.source.XYZ({ url, crossOrigin: 'anonymous' }); return this.redraw(); },\n createTile(coords, done) {\n const url = this._source.getTileUrlFunction()([coords.z, coords.x, coords.y], 1, ol.proj.get('EPSG:3857'));\n const tile = image(url, this.options, '');\n tile.onload = () => done(null, tile);\n tile.onerror = () => done(new Error(`Unable to load tile: ${url}`), tile);\n return tile;\n },\n });\n L.TileLayer.WMS = L.TileLayer.extend({\n setUrl(url) {\n this._url = url;\n this._source = new ol.source.TileWMS({ url, crossOrigin: 'anonymous', params: {\n LAYERS: this.options.layers, FORMAT: this.options.format || 'image/png',\n TRANSPARENT: this.options.transparent || false,\n } });\n return this.redraw();\n },\n });\n L.ImageOverlay.include({\n options: { pane: 'overlayPane', opacity: 1, interactive: false },\n initialize(url, value, options) { L.Util.setOptions(this, options); this._url = url; this._bounds = bounds(value); },\n _initImage() {\n this._image = image(this._url, this.options, '');\n this._image.onload = () => this.fire('load');\n this._image.onerror = () => this.fire('error', { error: new Error(`Unable to load image: ${this._url}`) });\n },\n getBounds() { return this._bounds; },\n setBounds(value) { this._bounds = bounds(value); return this; },\n setUrl(url) { this._url = url; if (this._image) this._image.src = url; return this; },\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\n setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },\n });\n\n L.Icon = L.Evented.extend({\n initialize(options) { L.Util.setOptions(this, options); },\n createIcon() { return this._create('icon'); },\n createShadow() { return this.options.shadowUrl ? this._create('shadow') : null; },\n _create(kind) {\n const element = image(this.options[`${kind}Url`], this.options, `leaflet-marker-${kind}`);\n const size = this.options[`${kind}Size`], anchor = this.options[`${kind}Anchor`] || this.options.iconAnchor;\n if (size) { element.style.width = `${size[0]}px`; element.style.height = `${size[1]}px`; }\n if (anchor) { element.style.marginLeft = `${-anchor[0]}px`; element.style.marginTop = `${-anchor[1]}px`; }\n return element;\n },\n });\n L.Icon.Default = L.Icon.extend({\n options: {\n iconUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-icon.png',\n shadowUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-shadow.png',\n iconSize: [25, 41], iconAnchor: [12, 41], shadowSize: [41, 41], shadowAnchor: [12, 41],\n },\n });\n L.DivIcon = L.Icon.extend({\n createIcon() {\n const element = L.DomUtil.create('div', `leaflet-marker-icon ${this.options.className || ''}`);\n if (this.options.html instanceof Node) element.append(this.options.html); else element.innerHTML = this.options.html || '';\n const size = this.options.iconSize || [12, 12], anchor = this.options.iconAnchor || size.map(value => value / 2);\n element.style.cssText = `width:${size[0]}px;height:${size[1]}px;margin-left:${-anchor[0]}px;margin-top:${-anchor[1]}px`;\n return element;\n },\n createShadow() { return null; },\n });\n L.Marker.include({\n options: { pane: 'markerPane', icon: new L.Icon.Default(), opacity: 1, interactive: true, zIndexOffset: 0 },\n initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },\n getLatLng() { return this._latlng; },\n setLatLng(value) { this._latlng = latLng(value); this.update(); return this.fire('move', { latlng: this._latlng }); },\n setIcon(icon) { this.options.icon = icon; if (this._map) { this.onRemove(); this.onAdd(); } return this; },\n getEvents() { return { zoom: this.update, viewreset: this.update }; },\n onAdd() {\n this._icon = this.options.icon.createIcon(); this._shadow = this.options.icon.createShadow();\n this._icon.tabIndex = 0; this._icon.setAttribute('role', 'button');\n this._icon.setAttribute('aria-label', this.options.title || 'Marker');\n this._icon.title = this.options.title || '';\n for (const element of [this._shadow, this._icon]) if (element) this.getPane().append(element);\n this._initInteraction(); this.update();\n },\n onRemove() { this.dragging?.disable(); this._icon?.remove(); this._shadow?.remove(); },\n update() { if (this._map && this._icon) this._setPos(this._map.latLngToLayerPoint(this._latlng)); return this; },\n _setPos(value) {\n for (const element of [this._icon, this._shadow]) if (element) L.DomUtil.setPosition(element, value);\n this._zIndex = value.y + this.options.zIndexOffset; this._updateZIndex(0);\n },\n _updateZIndex(offset) { if (this._icon) this._icon.style.zIndex = this._zIndex + offset; },\n setOpacity(opacity) { this.options.opacity = opacity; return this; },\n setZIndexOffset(value) { this.options.zIndexOffset = value; return this.update(); },\n _initInteraction() {\n this._icon._cityLayer = this;\n const drag = this.dragging = new L.Handler(this._map);\n const icon = this._icon;\n L.DomEvent.on(icon, 'pointerdown', event => {\n this._map._moved = false;\n event.stopPropagation();\n });\n L.DomEvent.on(icon, 'keydown', event => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n L.DomEvent.stop(event);\n this.fire('click', { latlng: this._latlng, originalEvent: event });\n });\n drag._marker = this;\n drag._draggable = new L.Evented();\n drag._onDrag = function () {\n const marker = this._marker;\n marker._latlng = marker._map.layerPointToLatLng(L.DomUtil.getPosition(marker._icon));\n marker.fire('move', { latlng: marker._latlng }).fire('drag', { latlng: marker._latlng });\n };\n drag._adjustPan = function () {};\n drag._draggable.on('drag', drag._onDrag, drag);\n let pointer, anchor, origin, moved;\n const handle = event => {\n if (!drag.enabled()) return;\n if (event.type === 'pointerdown') {\n if (event.button !== 0) return;\n event.preventDefault(); event.stopPropagation();\n pointer = event.pointerId; anchor = [event.clientX, event.clientY];\n origin = this._map.latLngToContainerPoint(this._latlng); moved = false;\n icon.setPointerCapture(pointer);\n this.fire('dragstart');\n } else if (event.pointerId === pointer && event.type === 'pointermove') {\n const value = new L.Point(origin.x + event.clientX - anchor[0], origin.y + event.clientY - anchor[1]);\n L.DomUtil.setPosition(icon, value);\n drag._draggable._newPos = value;\n drag._draggable.fire('drag', { originalEvent: event });\n moved = true;\n } else if (event.pointerId === pointer) {\n if (icon.hasPointerCapture(pointer)) icon.releasePointerCapture(pointer);\n pointer = null; this.fire('dragend'); this._map._moved = moved;\n }\n };\n drag.addHooks = () => L.DomEvent.on(icon, 'pointerdown pointermove pointerup pointercancel', handle);\n drag.removeHooks = () => L.DomEvent.off(icon, 'pointerdown pointermove pointerup pointercancel', handle);\n if (this.options.draggable) drag.enable();\n },\n });\n\n L.Map.include({\n _fireDOMEvent(event, type = event.type, targets) {\n const rect = this.getContainer().getBoundingClientRect();\n const pixel = new L.Point(event.clientX - rect.left, event.clientY - rect.top);\n const location = this.containerPointToLatLng(pixel);\n const layer = event.target.closest?.('.leaflet-marker-icon')?._cityLayer;\n if (type === 'click' && this._draggableMoved(layer)) return;\n for (const target of targets || (layer ? [layer] : [this])) {\n target.fire(type, { originalEvent: event, latlng: location, containerPoint: pixel,\n layerPoint: this.containerPointToLayerPoint(pixel) });\n }\n },\n });\n L.Map.addInitHook(function () {\n const mapPane = this.createPane('mapPane');\n for (const [name, order] of [['tilePane', 200], ['overlayPane', 400], ['markerPane', 600]]) {\n this.createPane(name, mapPane).style.zIndex = order;\n }\n const handler = event => this._fireDOMEvent(event);\n L.DomEvent.on(this.getContainer(), 'click mousemove mouseout mouseover', handler);\n this.once('unload', () => L.DomEvent.off(this.getContainer(), 'click mousemove mouseout mouseover', handler));\n });\n})();\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["style", "L", "lastId", "stamp", "object", "setOptions", "options", "zoomTiming", "Class", "args", "properties", "Child", "hook", "prototypes", "proto", "types", "fn", "context", "type", "handler", "events", "event", "data", "interval", "timer", "pending", "run", "x", "y", "round", "point", "value", "lat", "lng", "alt", "latLng", "margin", "a", "b", "min", "max", "radius", "circumference", "crs", "zoom", "scale", "tag", "className", "parent", "element", "domListeners", "domEvent", "add", "listeners", "existing", "item", "stopPropagation", "map", "name", "layers", "layer", "base", "target", "center", "control", "button", "selector", "delta", "view", "zoomChanged", "pixel", "coordinate", "original", "ratio", "factor", "magnitude", "snap", "position", "attributionSource", "updateAttribution", "values", "anchor", "pointerId", "rect", "offsets", "to", "from", "zooming", "projected", "time", "progress", "moved", "offset", "half", "bounds", "inside", "padding", "size", "available", "id", "Handler", "corner", "pane", "overlays", "container", "list", "entry", "label", "input", "checked", "other", "coordinates", "image", "url", "content", "location", "close", "screen", "result", "visit", "paths", "ring", "closest", "north", "east", "features", "convert", "geometry", "feature", "locations", "tile", "extent", "retained", "limit", "key", "coords", "done", "error", "nw", "opacity", "zIndex", "kind", "icon", "drag", "marker", "pointer", "origin", "handle", "targets", "mapPane", "order"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leaflet-city-mapper",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "A small 3D rendering engine for leaflet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/leaflet-city-mapper.js",
|
|
@@ -11,9 +11,7 @@
|
|
|
11
11
|
"build": "node build/build.js",
|
|
12
12
|
"test": "node build/test.js",
|
|
13
13
|
"pmtiles": "node build/pmtiles.js",
|
|
14
|
-
"preversion": "node
|
|
15
|
-
"version": "npm run build && git add -A",
|
|
16
|
-
"postversion": "npm publish --access public && git push --follow-tags"
|
|
14
|
+
"preversion": "node -e \"console.error('Versioning is handled by GitHub Actions; do not run npm version locally.'); process.exit(1)\""
|
|
17
15
|
},
|
|
18
16
|
"repository": {
|
|
19
17
|
"type": "git",
|
package/src/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Source guide
|
|
2
|
+
|
|
3
|
+
[Project README](../README.md) | [Entry point](./index.js)
|
|
4
|
+
|
|
5
|
+
Internal architecture and contributor navigation. For the public API, see the
|
|
6
|
+
[project README](../README.md).
|
|
7
|
+
|
|
8
|
+
## From a layer to a frame
|
|
9
|
+
|
|
10
|
+
```mermaid
|
|
11
|
+
sequenceDiagram
|
|
12
|
+
participant App
|
|
13
|
+
participant Layer as L.Layer / scene
|
|
14
|
+
participant Source as Source loader
|
|
15
|
+
participant Worker
|
|
16
|
+
participant Frame as Shared renderer
|
|
17
|
+
App->>Layer: new L.Layer({source})
|
|
18
|
+
App->>Layer: addTo(map)
|
|
19
|
+
Layer->>Frame: attach root / create renderer
|
|
20
|
+
Layer->>Source: request visible data
|
|
21
|
+
Source->>Worker: decode or assemble (where applicable)
|
|
22
|
+
Worker-->>Source: prepared data
|
|
23
|
+
Source->>Layer: attach result and schedule update
|
|
24
|
+
Layer->>Frame: render next frame
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Not every source uses this exact worker path: vector tiles have their own
|
|
28
|
+
loading and presentation lifecycle, and a native Leaflet layer is synchronized
|
|
29
|
+
through [native](./native/README.md). See [scene](./scene/README.md) for source
|
|
30
|
+
routing, shared ownership and removal.
|
|
31
|
+
|
|
32
|
+
## Ownership and debugging
|
|
33
|
+
|
|
34
|
+
[weakmaps](./weakmaps/README.md) holds per-object state;
|
|
35
|
+
[globals](./globals/README.md) also contains shared scratch buffers and queues.
|
|
36
|
+
On source failures, inspect the layer's `error` and `progress` events.
|
|
37
|
+
|
|
38
|
+
## Where to start a change
|
|
39
|
+
|
|
40
|
+
| Change | Follow the code | Existing scenarios |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| Source routing or scene ownership | [scene](./scene/README.md) → relevant source guide → [workers](./workers/README.md) | [scene](../test/features/scene.feature), [workers](../test/features/workers.feature) |
|
|
43
|
+
| GeoJSON extrusions or feature hits | [sources](./sources/README.md) → [geometry](./geometry/README.md) → [picking](./picking/README.md) | [geojson](../test/features/geojson.feature), [picking](../test/features/picking.feature) |
|
|
44
|
+
| Tile formats or terrain | [archives](./archives/README.md) / [cog](./cog/README.md) → [raster](./raster/README.md) / [terrain](./terrain/README.md) | [pmtiles](../test/features/pmtiles.feature), [cog](../test/features/cog.feature), [terrain](../test/features/terrain.feature) |
|
|
45
|
+
| Vector tile styles and labels | [mvt](./mvt/README.md) → [vector-style](./vector-style/README.md) → [vector-tiles](./vector-tiles/README.md) | [vector tiles](../test/features/vector-tiles.feature), [unit cases](../test/features/vector-tile-unit.feature) |
|
|
46
|
+
| Camera or walking | [camera](./camera/README.md) / [controls](./controls/README.md) → [walk](./walk/README.md) / [collision](./collision/README.md) | [camera](../test/features/camera.feature), [walk](../test/features/walk.feature) |
|
|
47
|
+
| GPU drawing or lighting | [rendering](./rendering/README.md) → [materials](./materials/README.md) / [shaders](./shaders/README.md) → [lighting](./lighting/README.md) / [shadows](./shadows/README.md) | [webgpu](../test/features/webgpu.feature), [night lights](../test/features/night-lights.feature), [sunlight](../test/features/sunlight.feature) |
|
|
48
|
+
|
|
49
|
+
The [build guide](../README.md#build-guide) explains the normal build and test
|
|
50
|
+
commands. The test runner builds and runs Cucumber with both Leaflet versions;
|
|
51
|
+
the feature files above are useful starting points for finding behavior and
|
|
52
|
+
regressions specific to a change.
|
|
53
|
+
|
|
54
|
+
## Subsystem map
|
|
55
|
+
|
|
56
|
+
This diagram is an overview, not an exhaustive dependency graph.
|
|
57
|
+
|
|
58
|
+
```mermaid
|
|
59
|
+
flowchart LR
|
|
60
|
+
Leaflet["Leaflet layer"] --> Scene["scene: source routing"]
|
|
61
|
+
Scene --> Sources["sources / vector-tiles"]
|
|
62
|
+
Scene --> Raster["raster / terrain"]
|
|
63
|
+
Sources --> Workers["workers: decoding and geometry"]
|
|
64
|
+
Raster --> Archives["archives / cog"]
|
|
65
|
+
Workers --> Geometry["geometry / models"]
|
|
66
|
+
Geometry --> Render["rendering / GPU"]
|
|
67
|
+
Raster --> Render
|
|
68
|
+
Native["native Leaflet layers"] --> Render
|
|
69
|
+
Camera["camera / controls"] --> Render
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Source layout
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
src/
|
|
76
|
+
index.js Public entry point and source registration
|
|
77
|
+
globals/ One shared constant or mutable cell per module
|
|
78
|
+
weakmaps/ One private WeakMap per map/layer state field
|
|
79
|
+
mvt/ PBF vector tile decoding and tessellation
|
|
80
|
+
vector-style/ Safe vector style parsing and expressions
|
|
81
|
+
vector-tiles/ Native vector tile lifecycle and worker preparation
|
|
82
|
+
camera/ Leaflet camera API and scene camera state
|
|
83
|
+
controls/ Compass, dragging, touch and resizing
|
|
84
|
+
core/ Leaflet hooks, camera-aware overlays and readiness
|
|
85
|
+
native/ Native Leaflet layers rendered through WebGPU
|
|
86
|
+
layer-controls/ Layer entry placement and progress indicators
|
|
87
|
+
scene/ Source routing, lifecycle and graph nodes
|
|
88
|
+
sources/ GeoJSON and streamed source loading and assembly
|
|
89
|
+
workers/ Geometry, MVT, COG and model tasks sharing one CDN-compatible worker
|
|
90
|
+
picking/ Raycasting, highlighting and feature interaction
|
|
91
|
+
rendering/ Frame stages, draw pipelines and mesh lifecycle
|
|
92
|
+
gpu/ Device initialization, renderer resources and diagnostics
|
|
93
|
+
materials/ Material programs, uniforms, glTF materials and cutouts
|
|
94
|
+
textures/ Image loading, texture upload/binding and roof atlases
|
|
95
|
+
animations/ Camera transitions, zoom synchronization and tile fading
|
|
96
|
+
shadows/ Directional shadow maps and cache
|
|
97
|
+
lighting/ Point lights and spatial light grids
|
|
98
|
+
shaders/ Material shader generation
|
|
99
|
+
geometry/ Mesh construction, bounds, grids, vectors and route geometry
|
|
100
|
+
projections/ Map, screen and local coordinate conversion
|
|
101
|
+
transforms/ Local/world matrices and glTF node transforms
|
|
102
|
+
triangulation/ Polygon triangulation and ring operations
|
|
103
|
+
collision/ Mesh intersection and collision queries
|
|
104
|
+
models/ glTF loading, decoding and scene assembly
|
|
105
|
+
archives/ PMTiles archive reading and decompression
|
|
106
|
+
cog/ Supported GeoTIFF directories, byte ranges and tile decoding
|
|
107
|
+
raster/ Raster tile loading, attachment and lifecycle
|
|
108
|
+
traffic/ Routes, scheduling, simulation, loading and rendering
|
|
109
|
+
vehicles/ Vehicle model geometry
|
|
110
|
+
terrain/ Terrain loading and sampling
|
|
111
|
+
astronomy/ Sun/moon position and observer/date validation
|
|
112
|
+
sunlight/ Sky, celestial display and time controls
|
|
113
|
+
walk/ First-person walking
|
|
114
|
+
colors/ Colour parsing, conversion, interpolation and formatting
|
|
115
|
+
utils/ Shared numeric and no-op helpers
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Layer lifecycle and data
|
|
119
|
+
|
|
120
|
+
- [scene](./scene/README.md): routing, attachment and shared scene lifecycle.
|
|
121
|
+
- [sources](./sources/README.md): GeoJSON and source area loading.
|
|
122
|
+
- [archives](./archives/README.md), [cog](./cog/README.md), [raster](./raster/README.md), [terrain](./terrain/README.md): archived data, raster imagery and elevation.
|
|
123
|
+
- [mvt](./mvt/README.md), [vector-style](./vector-style/README.md), [vector-tiles](./vector-tiles/README.md): vector tile decoding, styling and display.
|
|
124
|
+
- [models](./models/README.md), [workers](./workers/README.md): glTF loading and background jobs.
|
|
125
|
+
- [native](./native/README.md): GPU representation of native Leaflet layers.
|
|
126
|
+
|
|
127
|
+
## Rendering and geometry
|
|
128
|
+
|
|
129
|
+
- [gpu](./gpu/README.md), [rendering](./rendering/README.md), [materials](./materials/README.md), [shaders](./shaders/README.md), [textures](./textures/README.md): GPU resources and frame rendering.
|
|
130
|
+
- [geometry](./geometry/README.md), [triangulation](./triangulation/README.md), [transforms](./transforms/README.md), [projections](./projections/README.md): mesh construction and coordinate transformations.
|
|
131
|
+
- [lighting](./lighting/README.md), [shadows](./shadows/README.md), [colors](./colors/README.md): lighting, shadow maps and color conversion.
|
|
132
|
+
- [picking](./picking/README.md), [collision](./collision/README.md): interaction and collision queries.
|
|
133
|
+
|
|
134
|
+
## Map behavior
|
|
135
|
+
|
|
136
|
+
- [core](./core/README.md), [camera](./camera/README.md), [controls](./controls/README.md), [animations](./animations/README.md): Leaflet integration and camera interactions.
|
|
137
|
+
- [layer-controls](./layer-controls/README.md): layer control placement and status.
|
|
138
|
+
- [astronomy](./astronomy/README.md), [sunlight](./sunlight/README.md): celestial positions and time controls.
|
|
139
|
+
- [walk](./walk/README.md), [traffic](./traffic/README.md), [vehicles](./vehicles/README.md): walking, traffic simulation and model geometry.
|
|
140
|
+
|
|
141
|
+
## Shared state and helpers
|
|
142
|
+
|
|
143
|
+
- [globals](./globals/README.md): shared constants, descriptors and mutable cells.
|
|
144
|
+
- [weakmaps](./weakmaps/README.md): private state associated with maps, layers and other objects.
|
|
145
|
+
- [utils](./utils/README.md): small shared helpers.
|
|
146
|
+
|
|
147
|
+
Each source directory has a README; the source documentation test checks this
|
|
148
|
+
invariant for new directories as well.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Animations
|
|
2
|
+
|
|
3
|
+
[Source guide](../README.md) | [Project README](../../README.md)
|
|
4
|
+
|
|
5
|
+
Schedules camera transitions, zoom synchronization, marker panning and grid tile fades.
|
|
6
|
+
Shared queues allow multiple layers or maps to use the same animation frame.
|
|
7
|
+
|
|
8
|
+
## Timing and cancellation
|
|
9
|
+
|
|
10
|
+
```mermaid
|
|
11
|
+
flowchart LR
|
|
12
|
+
Camera["Camera target"] --> Cancel["Cancel previous animation"]
|
|
13
|
+
Cancel --> Motion{"Animate?"}
|
|
14
|
+
Motion -->|yes| Arc["Shortest bearing arc + frames"]
|
|
15
|
+
Motion -->|no / reduced motion| Direct["Apply target"]
|
|
16
|
+
Fade["Grid fade request"] --> Revision["Record layer revision"]
|
|
17
|
+
Revision --> Frame["Shared animation frame"]
|
|
18
|
+
Frame --> Current{"Revision current?"}
|
|
19
|
+
Current -->|yes| Opacity["Update tile opacity"]
|
|
20
|
+
Current -->|no| Ignore["Ignore stale entry"]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Zoom synchronization has its own intermediate view:
|
|
24
|
+
[synchronizeZoomView.js](./synchronizeZoomView.js).
|
|
25
|
+
|
|
26
|
+
- [mapAnimateCamera.js](./mapAnimateCamera.js): start a camera transition.
|
|
27
|
+
- [runGridFades.js](./runGridFades.js): advance queued tile fades only for current revisions.
|
|
28
|
+
- [synchronizeZoomView.js](./synchronizeZoomView.js): coordinate map zoom animations with the scene.
|
|
29
|
+
|
|
30
|
+
Related: [camera](../camera/README.md), [core](../core/README.md), [rendering](../rendering/README.md).
|