leaflet-city-mapper 0.0.3 → 0.0.4
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 +22 -26
- package/cucumber.mjs +1 -1
- package/dist/leaflet-city-mapper-src.js +15326 -0
- package/dist/leaflet-city-mapper-src.js.map +7 -0
- package/dist/leaflet-city-mapper.js +4 -3
- package/dist/leaflet-city-mapper.js.map +4 -4
- package/libs/leaflet-lens.js +122 -0
- package/libs/leaflet.js +76 -0
- package/libs/openlayers-bindings.js +1128 -0
- package/libs/openlayers-bindings.min.js +99 -0
- package/libs/openlayers-bindings.min.js.map +7 -0
- package/package.json +4 -3
- package/src/archives/decodeDirectory.js +43 -25
- package/src/archives/decodeHeader.js +15 -11
- package/src/archives/decompress.js +7 -2
- package/src/archives/findDirectoryEntry.js +9 -0
- package/src/archives/findTile.js +31 -0
- package/src/archives/getDirectoryEntries.js +18 -0
- package/src/archives/getHeader.js +7 -3
- package/src/archives/getTileData.js +13 -0
- package/src/archives/getZxy.js +7 -63
- package/src/archives/loadSource.js +24 -10
- package/src/archives/read.js +12 -9
- package/src/archives/tileId.js +7 -3
- package/src/archives/varint.js +7 -3
- package/src/camera/angles.js +12 -4
- package/src/camera/animationPoint.js +4 -1
- package/src/camera/cameraMapReady.js +4 -1
- package/src/camera/cancelCameraAnimation.js +11 -7
- package/src/camera/cleanupCameraMap.js +7 -4
- package/src/camera/fitCameraBounds.js +33 -23
- package/src/camera/getBearing.js +5 -0
- package/src/camera/getPitch.js +5 -0
- package/src/camera/groundBounds.js +13 -6
- package/src/camera/initializeCameraMap.js +8 -3
- package/src/camera/mapAnimateCamera.js +20 -13
- package/src/camera/mapCamera.js +22 -42
- package/src/camera/mapContainerPointToLayerPoint.js +4 -2
- package/src/camera/mapGetBearing.js +4 -1
- package/src/camera/mapGetBounds.js +12 -6
- package/src/camera/mapGetBoundsCenterZoom.js +6 -3
- package/src/camera/mapGetBoundsZoom.js +17 -7
- package/src/camera/mapGetCenterLayerPoint.js +3 -2
- package/src/camera/mapGetPitch.js +4 -1
- package/src/camera/mapLayerPointToContainerPoint.js +3 -2
- package/src/camera/mapLimitCenter.js +12 -7
- package/src/camera/mapLimitOffset.js +6 -2
- package/src/camera/mapPanBy.js +3 -2
- package/src/camera/mapPanInside.js +16 -10
- package/src/camera/mapResetNorth.js +4 -1
- package/src/camera/mapResetNorthPitch.js +4 -1
- package/src/camera/mapSetBearing.js +3 -1
- package/src/camera/mapSetPitch.js +3 -1
- package/src/camera/mapSetPitchAndBearing.js +19 -11
- package/src/camera/mapSetZoomAround.js +12 -8
- package/src/camera/mapStopPitchBearingAnimation.js +3 -3
- package/src/camera/mapTryAnimatedPan.js +3 -2
- package/src/camera/mapUpdateCameraOverlays.js +3 -2
- package/src/camera/pointOf.js +4 -2
- package/src/camera/project.js +23 -16
- package/src/camera/runCameraAnimations.js +15 -12
- package/src/camera/scheduleCameraAnimation.js +9 -4
- package/src/camera/updateSky.js +20 -14
- package/src/cog/decodeCogTile.js +24 -0
- package/src/cog/finiteCogValues.js +5 -0
- package/src/cog/getCogAssetEntry.js +15 -0
- package/src/cog/getCogBase.js +10 -0
- package/src/cog/getCogHeader.js +3 -0
- package/src/cog/getCogProfile.js +16 -0
- package/src/cog/getCogTile.js +12 -0
- package/src/cog/getColorTile.js +25 -0
- package/src/cog/getElevationTile.js +16 -0
- package/src/cog/hasCogProjection.js +9 -0
- package/src/cog/initCog.js +7 -0
- package/src/cog/invalidCogFullResponse.js +3 -0
- package/src/cog/openCog.js +30 -0
- package/src/cog/openCogAsset.js +14 -0
- package/src/cog/readCog.js +25 -0
- package/src/cog/readCogBlock.js +8 -0
- package/src/cog/readCogBody.js +20 -0
- package/src/cog/readCogDirectories.js +20 -0
- package/src/cog/readCogDirectory.js +21 -0
- package/src/cog/readCogLevel.js +27 -0
- package/src/cog/readCogTag.js +15 -0
- package/src/cog/validCogDimensions.js +6 -0
- package/src/cog/validCogEncoding.js +5 -0
- package/src/cog/validCogGeoArrays.js +8 -0
- package/src/cog/validCogGrid.js +9 -0
- package/src/cog/validCogTileCoordinates.js +4 -0
- package/src/cog/validateCogContainer.js +9 -0
- package/src/cog/validateCogContentRange.js +8 -0
- package/src/cog/validateCogOffsets.js +10 -0
- package/src/cog/validateCogRange.js +7 -0
- package/src/cog/validateCogResponse.js +15 -0
- package/src/collision/collider.js +13 -20
- package/src/collision/hiddenLightHit.js +8 -0
- package/src/collision/indexTriangle.js +11 -0
- package/src/collision/intersectMeshes.js +32 -133
- package/src/collision/localRay.js +21 -0
- package/src/collision/mergeHits.js +11 -0
- package/src/collision/rayBounds.js +19 -0
- package/src/collision/readTriangle.js +20 -0
- package/src/collision/sortHits.js +5 -11
- package/src/collision/transformTriangle.js +9 -0
- package/src/collision/triangleDistance.js +21 -0
- package/src/collision/worldHit.js +18 -0
- package/src/controls/addCameraHandler.js +9 -0
- package/src/controls/adjustCameraDrag.js +7 -2
- package/src/controls/cameraControls.js +53 -22
- package/src/controls/cameraDragClick.js +3 -2
- package/src/controls/cameraDragContextMenu.js +3 -2
- package/src/controls/cameraDragDown.js +20 -17
- package/src/controls/cameraDragEnd.js +3 -2
- package/src/controls/cameraDragMove.js +11 -6
- package/src/controls/changeCameraTouch.js +5 -2
- package/src/controls/cleanupCameraTouch.js +21 -16
- package/src/controls/compassAddHooks.js +13 -10
- package/src/controls/compassOrientation.js +2 -1
- package/src/controls/containerResizeAddHooks.js +3 -3
- package/src/controls/dragCamera.js +18 -14
- package/src/controls/endAllCameraDrags.js +4 -2
- package/src/controls/endAllCameraTouches.js +4 -2
- package/src/controls/endCameraTouch.js +3 -2
- package/src/controls/endCameraTouchEvent.js +5 -2
- package/src/controls/failCompassPermission.js +4 -0
- package/src/controls/finishCompassPermission.js +10 -9
- package/src/controls/loadCameraControls.js +2 -2
- package/src/controls/moveCameraTouch.js +16 -9
- package/src/controls/pitchDragAddHooks.js +3 -1
- package/src/controls/refreshRotateControl.js +9 -6
- package/src/controls/removeCameraDrag.js +7 -4
- package/src/controls/rotateButtonClick.js +8 -4
- package/src/controls/rotateButtonKeydown.js +8 -4
- package/src/controls/rotateControl.js +3 -2
- package/src/controls/rotateOnAdd.js +32 -28
- package/src/controls/shiftRotateAddHooks.js +6 -4
- package/src/controls/shiftRotateWheel.js +3 -1
- package/src/controls/startCameraTouch.js +32 -22
- package/src/core/addImageState.js +6 -5
- package/src/core/addRasterImage.js +4 -2
- package/src/core/adjustCameraMarkerPan.js +24 -18
- package/src/core/beforeNativeRender.js +1 -1
- package/src/core/boundsQuad.js +7 -6
- package/src/core/bringNativeLayerToBack.js +6 -1
- package/src/core/bringNativeLayerToFront.js +6 -1
- package/src/core/bypassNativeEvent.js +11 -0
- package/src/core/cameraCircleBounds.js +3 -2
- package/src/core/cameraMarkerDrag.js +16 -13
- package/src/core/cameraMarkerOnDrag.js +7 -2
- package/src/core/cancelGridFade.js +10 -6
- package/src/core/closestCameraLayerPoint.js +3 -2
- package/src/core/current.js +4 -1
- package/src/core/disposeNativeLayer.js +6 -2
- package/src/core/fireRasterLoad.js +3 -2
- package/src/core/forwardNativeError.js +2 -2
- package/src/core/gridlayerGetEvents.js +7 -4
- package/src/core/gridlayerGetTiledPixelBounds.js +8 -4
- package/src/core/handleNativeMapEvent.js +16 -36
- package/src/core/hideTargets.js +6 -4
- package/src/core/initNativeGPU.js +10 -6
- package/src/core/initializeGridContainer.js +3 -2
- package/src/core/initializeNativeLayer.js +16 -18
- package/src/core/layerCallInitHooks.js +14 -0
- package/src/core/localPixelForGeometry.js +3 -2
- package/src/core/localPosition.js +8 -4
- package/src/core/markerCameraIconPoint.js +9 -6
- package/src/core/markerGetEvents.js +6 -2
- package/src/core/markerImageBounds.js +11 -0
- package/src/core/markerInitInteraction.js +4 -2
- package/src/core/markerQuadCorners.js +41 -24
- package/src/core/markerSetIcon.js +5 -2
- package/src/core/markerSetPos.js +10 -5
- package/src/core/markerSetRotation.js +9 -7
- package/src/core/markerUpdateZIndex.js +9 -5
- package/src/core/nativeEventSource.js +18 -0
- package/src/core/nativeEvents.js +8 -3
- package/src/core/nativeImageError.js +8 -3
- package/src/core/nativeImageRefresh.js +6 -2
- package/src/core/nativeLayer.js +24 -21
- package/src/core/nativeLayerMethod.js +8 -3
- package/src/core/popupAdjustPan.js +24 -18
- package/src/core/popupGetEvents.js +5 -2
- package/src/core/popupUpdatePosition.js +5 -2
- package/src/core/pruneNativeResources.js +20 -0
- package/src/core/putNativeMesh.js +11 -8
- package/src/core/quadNativeMesh.js +9 -4
- package/src/core/readyNativeGPU.js +4 -1
- package/src/core/redrawPath.js +6 -0
- package/src/core/refreshNativeLayer.js +11 -6
- package/src/core/refreshNativeLayerContract.js +6 -1
- package/src/core/rejectNativeReady.js +1 -0
- package/src/core/removeImageState.js +4 -3
- package/src/core/removeLayer.js +22 -0
- package/src/core/removeNativeEvents.js +2 -1
- package/src/core/removeTargets.js +6 -2
- package/src/core/reorderNativeLayer.js +4 -1
- package/src/core/resolveNativeReady.js +1 -0
- package/src/core/runGridFades.js +11 -6
- package/src/core/runMarkerPanFrame.js +6 -4
- package/src/core/scheduleGridFade.js +10 -5
- package/src/core/scheduleMarkerPan.js +7 -4
- package/src/core/setRotation.js +5 -0
- package/src/core/styleNativeMesh.js +5 -1
- package/src/core/syncGridLayer.js +10 -3
- package/src/core/syncMarker.js +4 -2
- package/src/core/syncVectorLayer.js +12 -9
- package/src/core/synchronizeNativeLayer.js +8 -17
- package/src/core/textureFor.js +41 -43
- package/src/core/tooltipGetEvents.js +5 -2
- package/src/core/tooltipSetPosition.js +5 -2
- package/src/core/transformNativePoint.js +7 -0
- package/src/core/updateGridOpacity.js +7 -3
- package/src/core/updateNativeHover.js +7 -0
- package/src/core/updateNativeLayerView.js +4 -1
- package/src/core/uploadCanvasTexture.js +18 -15
- package/src/core/uploadNativeImage.js +13 -0
- package/src/geometry/addBridges.js +29 -88
- package/src/geometry/below.js +1 -1
- package/src/geometry/box.js +6 -1
- package/src/geometry/bridgeEdge.js +11 -0
- package/src/geometry/bridgeElevation.js +3 -1
- package/src/geometry/bridgeFaces.js +15 -0
- package/src/geometry/bridgeLocal.js +3 -2
- package/src/geometry/bridgePaths.js +11 -0
- package/src/geometry/bridgePolygon.js +31 -0
- package/src/geometry/bridgeSides.js +11 -0
- package/src/geometry/build.js +10 -6
- package/src/geometry/circleAt.js +4 -2
- package/src/geometry/circleGeometry.js +34 -0
- package/src/geometry/clipLine.js +1 -1
- package/src/geometry/clipSegment.js +11 -7
- package/src/geometry/computeBounds.js +9 -4
- package/src/geometry/conformModelToTerrain.js +17 -12
- package/src/geometry/cross.js +5 -1
- package/src/geometry/dashValues.js +14 -0
- package/src/geometry/dashedSegment.js +16 -0
- package/src/geometry/diskAt.js +4 -2
- package/src/geometry/emitter.js +2 -2
- package/src/geometry/indexBridge.js +29 -0
- package/src/geometry/lampPostGeometry.js +12 -6
- package/src/geometry/lampRing.js +9 -6
- package/src/geometry/lightGeometry.js +2 -2
- package/src/geometry/line.js +21 -54
- package/src/geometry/lineJoin.js +26 -0
- package/src/geometry/nativeGeometry.js +10 -44
- package/src/geometry/polygon.js +4 -3
- package/src/geometry/quad.js +8 -3
- package/src/geometry/roofCoverage.js +23 -52
- package/src/geometry/roofFootprint.js +29 -0
- package/src/geometry/segment.js +2 -1
- package/src/geometry/setVertexColor.js +3 -1
- package/src/geometry/sub.js +2 -2
- package/src/geometry/subtractRoofTile.js +19 -0
- package/src/geometry/surface.js +2 -1
- package/src/geometry/treeGeometry.js +5 -6
- package/src/geometry/treeRing.js +9 -8
- package/src/geometry/triangle.js +8 -7
- package/src/geometry/validateTree.js +7 -0
- package/src/geometry/vertexNormals.js +10 -16
- package/src/geometry/visit.js +2 -1
- package/src/{constants → globals}/CELL.js +0 -1
- package/src/globals/Compass.js +1 -0
- package/src/globals/ContainerResize.js +1 -0
- package/src/{constants → globals}/HEIGHT.js +1 -1
- package/src/globals/L.js +1 -0
- package/src/globals/PitchDrag.js +1 -0
- package/src/globals/ShiftRotate.js +1 -0
- package/src/globals/TouchMode.js +1 -0
- package/src/globals/alphaBlend.js +12 -0
- package/src/globals/archiveDecoder.js +1 -0
- package/src/globals/archiveNorthWest.js +1 -0
- package/src/globals/archiveSouthEast.js +1 -0
- package/src/globals/atmosphereColor.js +1 -0
- package/src/globals/atmosphereStops.js +22 -0
- package/src/globals/blobParts.js +1 -0
- package/src/globals/boundsMethods.js +1 -0
- package/src/globals/cameraAngles.js +1 -0
- package/src/globals/cameraAnimatedOptions.js +3 -0
- package/src/globals/cameraAnimationFrame.js +1 -0
- package/src/globals/cameraAnimations.js +1 -0
- package/src/globals/cameraBearingSensitivity.js +1 -0
- package/src/globals/cameraByMap.js +1 -0
- package/src/globals/cameraDragSensitivity.js +1 -0
- package/src/globals/cameraDrags.js +1 -0
- package/src/globals/cameraEmptyOptions.js +1 -0
- package/src/globals/cameraFocusOptions.js +3 -0
- package/src/globals/cameraFov.js +3 -0
- package/src/globals/cameraListenerOptions.js +4 -0
- package/src/globals/cameraTouchStates.js +1 -0
- package/src/globals/cameraZeroPadding.js +1 -0
- package/src/globals/closestMethods.js +1 -0
- package/src/globals/cogTags.js +1 -0
- package/src/{constants → globals}/colliders.js +0 -1
- package/src/globals/colorLayout.js +8 -0
- package/src/globals/coreEventTypes.js +4 -0
- package/src/globals/coreMatrixKeys.js +4 -0
- package/src/globals/coreQuadIndices.js +1 -0
- package/src/globals/coreQuadUV.js +1 -0
- package/src/globals/coreSampler.js +4 -0
- package/src/globals/coreWhite.js +1 -0
- package/src/globals/cosObliquity.js +3 -0
- package/src/globals/coverageTiles.js +1 -0
- package/src/globals/defaultMaterial.js +1 -0
- package/src/globals/degrees.js +1 -0
- package/src/globals/demBuffer.js +4 -0
- package/src/globals/demLayout.js +3 -0
- package/src/globals/demSize.js +1 -0
- package/src/globals/demTarget.js +3 -0
- package/src/globals/demTexture.js +5 -0
- package/src/globals/depthBindGroup.js +9 -0
- package/src/globals/depthTexture.js +5 -0
- package/src/globals/directoryReader.js +4 -0
- package/src/globals/disabledShadow.js +1 -0
- package/src/globals/dragByHandler.js +1 -0
- package/src/globals/dragStates.js +1 -0
- package/src/globals/drawEntries.js +1 -0
- package/src/globals/drawFrameEntry.js +7 -0
- package/src/globals/drawMeshEntry.js +7 -0
- package/src/globals/drawSamplerEntries.js +18 -0
- package/src/globals/drawTerrainEntry.js +4 -0
- package/src/globals/drawTextureEntries.js +18 -0
- package/src/globals/earthCirc.js +1 -0
- package/src/{constants → globals}/elevationWGSL.js +1 -1
- package/src/globals/fragmentShader.js +3 -0
- package/src/globals/frameBuffer.js +4 -0
- package/src/globals/frameCommands.js +1 -0
- package/src/globals/frameLayoutEntry.js +7 -0
- package/src/globals/geometryDecoder.js +1 -0
- package/src/globals/geometryEmpty.js +1 -0
- package/src/globals/geometryImageOptions.js +4 -0
- package/src/globals/geometryPixelStates.js +1 -0
- package/src/globals/geometryQuaternion.js +1 -0
- package/src/globals/geometryScale.js +1 -0
- package/src/globals/geometrySemantics.js +5 -0
- package/src/globals/geometryTranslation.js +1 -0
- package/src/globals/gridEvents.js +1 -0
- package/src/globals/gridFadeFrame.js +1 -0
- package/src/globals/gridInitializers.js +1 -0
- package/src/globals/halfRadians.js +1 -0
- package/src/globals/headerBounds.js +1 -0
- package/src/globals/headerFlags.js +1 -0
- package/src/globals/headerOffsets.js +5 -0
- package/src/globals/hull.js +10 -0
- package/src/globals/imageStates.js +1 -0
- package/src/globals/instanceLayout.js +9 -0
- package/src/globals/lampDirections.js +8 -0
- package/src/globals/layerCallInitHooks.js +1 -0
- package/src/globals/layerProto.js +1 -0
- package/src/globals/lightScale.js +1 -0
- package/src/{constants → globals}/limbs.js +0 -1
- package/src/globals/loading.js +1 -0
- package/src/globals/mapMethods.js +1 -0
- package/src/globals/markerMethods.js +1 -0
- package/src/globals/markerPanFrame.js +1 -0
- package/src/globals/meshBindGroup.js +4 -0
- package/src/globals/meshBuffer.js +4 -0
- package/src/globals/meshCopySize.js +1 -0
- package/src/globals/meshImage.js +4 -0
- package/src/globals/meshLayoutEntry.js +8 -0
- package/src/globals/meshOffsets.js +1 -0
- package/src/globals/meshPipeline.js +27 -0
- package/src/globals/meshStack.js +3 -0
- package/src/globals/meshTarget.js +3 -0
- package/src/globals/nativeRenderByLayer.js +1 -0
- package/src/globals/nextId.js +1 -0
- package/src/globals/normalLayout.js +8 -0
- package/src/globals/parts.js +24 -0
- package/src/globals/pendingGridFades.js +1 -0
- package/src/globals/pendingInitializations.js +1 -0
- package/src/globals/pendingMapChanges.js +1 -0
- package/src/globals/pendingMarkerPan.js +1 -0
- package/src/globals/pendingPlacements.js +1 -0
- package/src/globals/pendingRasterLoads.js +1 -0
- package/src/globals/pendingZoomAnimations.js +1 -0
- package/src/globals/pipelineLayout.js +3 -0
- package/src/globals/popupEvents.js +1 -0
- package/src/globals/popupPan.js +1 -0
- package/src/globals/popupPosition.js +1 -0
- package/src/globals/positionLayout.js +8 -0
- package/src/globals/programEntries.js +1 -0
- package/src/globals/programLayout.js +3 -0
- package/src/globals/radians.js +1 -0
- package/src/globals/rasterBuffer.js +4 -0
- package/src/globals/rasterIndices.js +1 -0
- package/src/globals/rasterNormals.js +1 -0
- package/src/globals/rasterPoint.js +4 -0
- package/src/globals/rasterPositions.js +1 -0
- package/src/globals/rasterSampler.js +6 -0
- package/src/globals/rasterTexture.js +5 -0
- package/src/globals/rasterUVs.js +1 -0
- package/src/globals/removeLayer.js +1 -0
- package/src/globals/renderEmpty.js +1 -0
- package/src/globals/rendererDevices.js +1 -0
- package/src/globals/ringDirections.js +49 -0
- package/src/globals/roofBindGroup.js +17 -0
- package/src/globals/roofBlitSampler.js +4 -0
- package/src/globals/roofBuffer.js +4 -0
- package/src/globals/roofCommands.js +1 -0
- package/src/globals/roofCopySize.js +1 -0
- package/src/globals/roofImage.js +3 -0
- package/src/globals/roofMin.js +4 -0
- package/src/globals/roofOpacities.js +1 -0
- package/src/globals/roofPass.js +13 -0
- package/src/globals/roofPipeline.js +29 -0
- package/src/globals/roofSampler.js +4 -0
- package/src/globals/roofShader.js +16 -0
- package/src/globals/roofSignatures.js +1 -0
- package/src/globals/roofSize.js +4 -0
- package/src/globals/roofTarget.js +3 -0
- package/src/globals/roofTexture.js +5 -0
- package/src/globals/roofTiles.js +1 -0
- package/src/globals/roundProfile.js +7 -0
- package/src/globals/samplerLayoutEntries.js +36 -0
- package/src/globals/sceneByLayer.js +1 -0
- package/src/globals/sceneCleanupFields.js +1 -0
- package/src/globals/sceneEmptyOptions.js +1 -0
- package/src/globals/scenePass.js +19 -0
- package/src/globals/sceneSunlightUniforms.js +3 -0
- package/src/globals/sceneTransferFields.js +1 -0
- package/src/globals/sceneWalkHandlers.js +1 -0
- package/src/globals/shadowBindGroup.js +10 -0
- package/src/globals/shadowBounds.js +4 -0
- package/src/globals/shadowCamera.js +15 -0
- package/src/globals/shadowDepthLayout.js +9 -0
- package/src/globals/shadowHigh.js +1 -0
- package/src/globals/shadowInstanceLayouts.js +4 -0
- package/src/globals/shadowLayouts.js +3 -0
- package/src/globals/shadowLow.js +1 -0
- package/src/globals/shadowMeshLayout.js +10 -0
- package/src/globals/shadowOffsets.js +1 -0
- package/src/globals/shadowPass.js +9 -0
- package/src/globals/shadowPipeline.js +24 -0
- package/src/globals/shadowPipelineLayout.js +3 -0
- package/src/globals/shadowShader.js +3 -0
- package/src/globals/shadowTexture.js +5 -0
- package/src/globals/shadowValues.js +1 -0
- package/src/globals/sinObliquity.js +3 -0
- package/src/globals/sizes.js +6 -0
- package/src/globals/sunBindGroup.js +20 -0
- package/src/globals/sunByMap.js +1 -0
- package/src/globals/sunlightByControl.js +1 -0
- package/src/globals/tau.js +1 -0
- package/src/globals/terrainLayoutEntry.js +8 -0
- package/src/globals/textureLayoutEntries.js +41 -0
- package/src/globals/tiledBounds.js +1 -0
- package/src/globals/tooltipEvents.js +1 -0
- package/src/globals/tooltipPosition.js +1 -0
- package/src/globals/touchByContainer.js +1 -0
- package/src/globals/trafficByLayer.js +1 -0
- package/src/globals/trafficClocks.js +1 -0
- package/src/globals/trafficEmptyList.js +1 -0
- package/src/globals/trafficEmptyOptions.js +1 -0
- package/src/globals/trafficRouteMaterial.js +1 -0
- package/src/{constants → globals}/trafficShader.js +49 -49
- package/src/globals/triangleContexts.js +1 -0
- package/src/globals/uVLayout.js +8 -0
- package/src/{constants → globals}/vehicles.js +24 -9
- package/src/globals/vertexShader.js +3 -0
- package/src/globals/walkByMap.js +1 -0
- package/src/globals/wantedTiles.js +1 -0
- package/src/index.js +27 -25
- package/src/lighting/cacheLightGrid.js +14 -5
- package/src/lighting/collectLightMeshes.js +4 -1
- package/src/lighting/lightGrid.js +9 -8
- package/src/lighting/updatePointLights.js +11 -7
- package/src/lighting/visitCells.js +4 -11
- package/src/lighting/visitLightCells.js +13 -0
- package/src/lighting/worldLights.js +10 -12
- package/src/lighting/writeLightCell.js +5 -0
- package/src/models/applyModelTransform.js +13 -0
- package/src/models/buildModelNodes.js +14 -0
- package/src/models/createModelContext.js +15 -0
- package/src/models/createModelGeometry.js +40 -0
- package/src/models/decodeModel.js +9 -6
- package/src/models/loadBuffer.js +2 -2
- package/src/models/loadImage.js +9 -5
- package/src/models/loadModel.js +24 -49
- package/src/models/loadModelResources.js +19 -0
- package/src/models/materialFor.js +9 -9
- package/src/models/modelNode.js +25 -69
- package/src/models/nodeMatrix.js +8 -3
- package/src/models/normalizeAccessor.js +11 -0
- package/src/models/readAccessor.js +11 -31
- package/src/models/readAccessorValue.js +7 -0
- package/src/models/readAccessorValues.js +10 -6
- package/src/models/readModelAttributes.js +20 -0
- package/src/models/readModelIndices.js +16 -0
- package/src/models/readSparseAccessor.js +19 -0
- package/src/models/releaseModelResources.js +10 -0
- package/src/models/textureFor.js +9 -6
- package/src/models/textureSampler.js +5 -5
- package/src/picking/findFeature.js +12 -9
- package/src/picking/hit.js +11 -10
- package/src/picking/hitColliderCell.js +19 -0
- package/src/picking/hitMesh.js +12 -16
- package/src/picking/onClick.js +5 -2
- package/src/picking/onPointerLeave.js +5 -2
- package/src/picking/onPointerMove.js +8 -5
- package/src/picking/raycast.js +42 -35
- package/src/picking/setHighlight.js +12 -5
- package/src/picking/shouldSkipOther.js +4 -1
- package/src/picking/showFeature.js +13 -10
- package/src/picking/validateCameraInverse.js +8 -0
- package/src/raster/addRasterTile.js +39 -84
- package/src/raster/comparePendingTiles.js +2 -2
- package/src/raster/createGeometry.js +17 -10
- package/src/raster/createRasterMesh.js +71 -42
- package/src/raster/finishAttachment.js +7 -3
- package/src/raster/finishRasterTile.js +54 -40
- package/src/raster/getRasterEvents.js +3 -3
- package/src/raster/getRasterTileSize.js +5 -3
- package/src/raster/initRaster.js +14 -19
- package/src/raster/isLoading.js +4 -2
- package/src/raster/loadRasterTile.js +10 -7
- package/src/raster/onPMTileAdd.js +4 -1
- package/src/raster/onPMTileRemove.js +4 -1
- package/src/raster/pruneRasterTiles.js +15 -12
- package/src/raster/pumpRasterTiles.js +9 -5
- package/src/raster/rasterTileRange.js +23 -0
- package/src/raster/readyRaster.js +13 -10
- package/src/raster/registerTerrainTile.js +12 -9
- package/src/raster/releaseRasterTile.js +15 -12
- package/src/raster/releaseRasterTiles.js +9 -6
- package/src/raster/removeRasterTile.js +6 -3
- package/src/raster/reportError.js +3 -3
- package/src/raster/retainRasterTiles.js +15 -0
- package/src/raster/setRasterOpacity.js +5 -2
- package/src/raster/setRasterTerrain.js +10 -6
- package/src/raster/setRasterZIndex.js +5 -2
- package/src/raster/terrainTileGeometry.js +16 -0
- package/src/raster/updateAttachedTiles.js +5 -2
- package/src/raster/updateRasterTiles.js +29 -37
- package/src/rendering/bindMeshTextures.js +50 -0
- package/src/rendering/collectFrameMeshes.js +17 -10
- package/src/rendering/collectMeshes.js +2 -24
- package/src/rendering/collectRoofTiles.js +15 -0
- package/src/rendering/collectVisibleMesh.js +27 -0
- package/src/rendering/compareMeshDepth.js +6 -0
- package/src/rendering/compareMeshes.js +8 -10
- package/src/rendering/compareRoofTiles.js +4 -4
- package/src/rendering/composeRoofAtlas.js +53 -36
- package/src/rendering/createMesh.js +22 -11
- package/src/rendering/createProgram.js +47 -64
- package/src/rendering/createProgramLayout.js +36 -0
- package/src/rendering/createProgramUniforms.js +17 -0
- package/src/rendering/destroyAfterSubmission.js +8 -8
- package/src/rendering/destroyTexture.js +4 -1
- package/src/rendering/drawGeometry.js +18 -106
- package/src/rendering/drawPipeline.js +34 -0
- package/src/rendering/drawSceneMeshes.js +14 -17
- package/src/rendering/ensureRoofBlit.js +14 -34
- package/src/rendering/prepareFrameBuffer.js +17 -0
- package/src/rendering/prepareFrameMeshes.js +6 -11
- package/src/rendering/prepareFrameUniforms.js +7 -12
- package/src/rendering/prepareMeshCutout.js +12 -0
- package/src/rendering/prepareMeshTextures.js +23 -0
- package/src/rendering/prepareMeshUniforms.js +25 -0
- package/src/rendering/rebuildRoofAtlas.js +41 -56
- package/src/rendering/render.js +25 -13
- package/src/rendering/reportCompilation.js +6 -6
- package/src/rendering/resizeRenderer.js +19 -14
- package/src/rendering/resizeRoofTexture.js +24 -0
- package/src/rendering/revealRoofMesh.js +15 -0
- package/src/rendering/synchronizeZoomView.js +10 -18
- package/src/rendering/textureBinding.js +7 -7
- package/src/rendering/updateMapCamera.js +30 -16
- package/src/rendering/updateRoofAtlas.js +20 -0
- package/src/rendering/updateRoofRaster.js +12 -19
- package/src/rendering/updateZoomCamera.js +18 -0
- package/src/rendering/uploadMeshTexture.js +26 -0
- package/src/rendering/uploadRoofTile.js +23 -0
- package/src/scene/addSceneLayer.js +17 -0
- package/src/scene/attach.js +54 -161
- package/src/scene/attachLayer.js +5 -2
- package/src/scene/callLayer.js +26 -0
- package/src/scene/cancelUpdate.js +6 -3
- package/src/scene/composeLocalTransform.js +16 -0
- package/src/scene/createLayer.js +7 -0
- package/src/scene/createSceneCamera.js +21 -0
- package/src/scene/emptyEvents.js +1 -1
- package/src/scene/emptyNode.js +8 -7
- package/src/scene/endZoom.js +13 -6
- package/src/scene/failAttachment.js +6 -3
- package/src/scene/get3DEvents.js +12 -9
- package/src/scene/getLocation.js +7 -0
- package/src/scene/init3D.js +28 -15
- package/src/scene/initializeLayer.js +11 -5
- package/src/scene/initializeRendererResources.js +35 -0
- package/src/scene/initializeSharedRenderer.js +45 -0
- package/src/scene/initializerFor.js +3 -1
- package/src/scene/isNativeLayer.js +12 -0
- package/src/scene/layerCountTitle.js +4 -0
- package/src/scene/layerInitialize.js +24 -14
- package/src/scene/layerLayerAdd.js +31 -9
- package/src/scene/mountRenderer.js +25 -0
- package/src/scene/onAdd3DLayer.js +16 -12
- package/src/scene/onMapChange.js +8 -6
- package/src/scene/onRemove3DLayer.js +30 -36
- package/src/scene/onZoomAnim.js +8 -6
- package/src/scene/placeEntry.js +3 -1
- package/src/scene/placeEntryElement.js +22 -0
- package/src/scene/ready.js +9 -0
- package/src/scene/ready3D.js +28 -18
- package/src/scene/releaseRenderer.js +1 -1
- package/src/scene/releaseSharedScene.js +25 -0
- package/src/scene/removeEntry.js +2 -0
- package/src/scene/removeLayerEvents.js +9 -0
- package/src/scene/removeSceneLayer.js +15 -0
- package/src/scene/renderLayerCount.js +13 -0
- package/src/scene/renderPendingMapChange.js +8 -4
- package/src/scene/renderPendingUpdates.js +8 -4
- package/src/scene/renderPendingZoomAnimation.js +7 -3
- package/src/scene/rendererDeviceError.js +10 -6
- package/src/scene/rendererDeviceLost.js +10 -7
- package/src/scene/replaceEntry.js +4 -2
- package/src/scene/reportError.js +2 -2
- package/src/scene/requestAdapter.js +1 -1
- package/src/scene/resolveNextInitialization.js +7 -6
- package/src/scene/restoreGeometry.js +23 -0
- package/src/scene/restoreMaterialTextures.js +16 -0
- package/src/scene/restoreObject.js +22 -58
- package/src/scene/runPlacements.js +4 -2
- package/src/scene/startZoom.js +4 -1
- package/src/scene/underEntry.js +2 -3
- package/src/scene/update.js +8 -4
- package/src/scene/updateCamera.js +51 -28
- package/src/scene/updateLayerCount.js +22 -0
- package/src/scene/updateWorldMatrix.js +23 -28
- package/src/scene/worldMatrixChanged.js +18 -0
- package/src/shaders/materialBaseShader.js +17 -0
- package/src/shaders/materialShaders.js +14 -130
- package/src/shaders/materialSurfaceShader.js +47 -0
- package/src/shaders/materialVertexShader.js +72 -0
- package/src/shaders/roofVertexShader.js +9 -0
- package/src/shaders/validateRoofMaterial.js +10 -0
- package/src/shadows/bindSunlight.js +18 -9
- package/src/shadows/drawShadowMeshes.js +24 -14
- package/src/shadows/ensureShadowPipeline.js +46 -35
- package/src/shadows/meshShadowBounds.js +24 -0
- package/src/shadows/renderSunlight.js +10 -8
- package/src/shadows/resizeSunlight.js +12 -6
- package/src/shadows/shadowBounds.js +10 -19
- package/src/shadows/shadowCacheMatches.js +3 -9
- package/src/shadows/shadowMatrix.js +36 -26
- package/src/shadows/shadowMeshMatches.js +11 -0
- package/src/sources/addGeneratedTriangle.js +3 -2
- package/src/sources/attachAreaMesh.js +32 -26
- package/src/sources/buildArea.js +12 -8
- package/src/sources/buildAreaFeature.js +12 -17
- package/src/sources/buildAreaPoint.js +4 -4
- package/src/sources/buildAreaPolygon.js +3 -3
- package/src/sources/compareAreaDistance.js +1 -2
- package/src/sources/extrusionStyle.js +10 -0
- package/src/sources/featureAnchor.js +9 -0
- package/src/sources/generateTreeGeometry.js +5 -3
- package/src/sources/initializeGeoJSON.js +4 -2
- package/src/sources/instanceAreaGeometry.js +9 -7
- package/src/sources/pendingSourceAreas.js +20 -0
- package/src/sources/projectRing.js +17 -10
- package/src/sources/projectedTree.js +16 -10
- package/src/sources/pump.js +16 -26
- package/src/sources/releaseArea.js +5 -2
- package/src/sources/setGeoJSONData.js +5 -2
- package/src/sources/sourceAreaContext.js +16 -6
- package/src/sources/updateArea.js +23 -16
- package/src/sources/updateStatus.js +5 -2
- package/src/sunlight/addTimeLayer.js +4 -1
- package/src/sunlight/addTo.js +1 -0
- package/src/sunlight/atmosphere.js +7 -10
- package/src/sunlight/createSun.js +54 -0
- package/src/sunlight/horizontalPosition.js +8 -8
- package/src/sunlight/initSunlight.js +3 -0
- package/src/sunlight/initialize.js +7 -4
- package/src/sunlight/mix.js +4 -3
- package/src/sunlight/moonPosition.js +10 -9
- package/src/sunlight/onAddSun.js +27 -66
- package/src/sunlight/onRemoveSun.js +10 -0
- package/src/sunlight/projectCelestialBody.js +5 -5
- package/src/sunlight/remove.js +1 -0
- package/src/sunlight/removeSun.js +9 -3
- package/src/sunlight/removeTimeLayer.js +5 -1
- package/src/sunlight/render.js +4 -2
- package/src/sunlight/rgb.js +6 -4
- package/src/sunlight/solarPosition.js +10 -9
- package/src/sunlight/solarTime.js +11 -0
- package/src/sunlight/styleTimeControl.js +3 -3
- package/src/sunlight/updateCelestialDisc.js +12 -0
- package/src/sunlight/updateSky.js +12 -15
- package/src/sunlight/updateSun.js +10 -4
- package/src/sunlight/useSelectedTime.js +7 -4
- package/src/terrain/applyTerrain.js +21 -0
- package/src/terrain/clearLayerTerrain.js +8 -5
- package/src/terrain/copyTerrainTile.js +12 -0
- package/src/terrain/getElevation.js +7 -3
- package/src/terrain/initTerrain.js +12 -9
- package/src/terrain/loadTerrain.js +25 -45
- package/src/terrain/loadTerrainTiles.js +7 -3
- package/src/terrain/onTerrainAdd.js +10 -6
- package/src/terrain/onTerrainChange.js +5 -2
- package/src/terrain/onTerrainRemove.js +22 -18
- package/src/terrain/rasterProgram.js +51 -0
- package/src/terrain/readBridges.js +1 -1
- package/src/terrain/setLayerTerrain.js +8 -5
- package/src/terrain/setTerrainHeight.js +9 -5
- package/src/terrain/terrainAtlas.js +7 -13
- package/src/terrain/terrainBuffers.js +27 -0
- package/src/terrain/terrainElevation.js +5 -10
- package/src/terrain/terrainGrid.js +19 -11
- package/src/terrain/terrainTileQueue.js +25 -0
- package/src/traffic/addTraffic.js +6 -3
- package/src/traffic/along.js +8 -2
- package/src/traffic/appendRouteDash.js +15 -0
- package/src/traffic/appendRouteSegment.js +15 -0
- package/src/traffic/destroyTrafficGpu.js +4 -2
- package/src/traffic/disposeTrafficObject.js +5 -2
- package/src/traffic/drawTrafficRoute.js +5 -2
- package/src/traffic/failTraffic.js +2 -2
- package/src/traffic/fetchTrafficLanes.js +4 -4
- package/src/traffic/groundTraffic.js +5 -1
- package/src/traffic/initTraffic.js +60 -48
- package/src/traffic/loadTraffic.js +9 -9
- package/src/traffic/locateTraffic.js +7 -5
- package/src/traffic/moveTraffic.js +2 -2
- package/src/traffic/prepareTraffic.js +11 -6
- package/src/traffic/rebaseTraffic.js +32 -30
- package/src/traffic/rebuildTrafficMesh.js +9 -5
- package/src/traffic/refreshTrafficTrips.js +32 -0
- package/src/traffic/removeTraffic.js +16 -13
- package/src/traffic/routeColor.js +3 -3
- package/src/traffic/routeGeometry.js +11 -21
- package/src/traffic/scheduledTrips.js +22 -11
- package/src/traffic/tickTraffic.js +9 -40
- package/src/traffic/toLanes.js +16 -8
- package/src/traffic/tooltip.js +4 -6
- package/src/traffic/trafficBounds.js +6 -2
- package/src/traffic/trafficNow.js +9 -3
- package/src/traffic/trafficStatusText.js +5 -0
- package/src/traffic/trafficStorage.js +2 -2
- package/src/traffic/tripsAt.js +4 -4
- package/src/traffic/updateTraffic.js +4 -1
- package/src/traffic/updateTrafficLights.js +16 -0
- package/src/traffic/updateTrafficPose.js +8 -0
- package/src/traffic/uploadTrafficLanes.js +21 -0
- package/src/traffic/vehicleOffsets.js +3 -2
- package/src/triangulation/clean.js +1 -1
- package/src/triangulation/clipEars.js +23 -0
- package/src/triangulation/connectHole.js +18 -0
- package/src/triangulation/mergeHoles.js +11 -0
- package/src/triangulation/minimumX.js +3 -3
- package/src/triangulation/polygonRings.js +14 -0
- package/src/triangulation/sortHoles.js +7 -12
- package/src/triangulation/triangulate.js +18 -56
- package/src/triangulation/validateArea.js +10 -0
- package/src/utils/parseColor.js +4 -4
- package/src/vehicles/bicycleModel.js +21 -20
- package/src/vehicles/boatBenches.js +3 -2
- package/src/vehicles/boatModel.js +25 -17
- package/src/vehicles/carModel.js +26 -10
- package/src/vehicles/carriage.js +17 -16
- package/src/vehicles/metroModel.js +1 -1
- package/src/vehicles/mirror.js +3 -3
- package/src/vehicles/pedestrianModel.js +15 -14
- package/src/vehicles/tramModel.js +1 -1
- package/src/walk/blocked.js +4 -4
- package/src/walk/createWalk.js +66 -60
- package/src/walk/initWalk.js +1 -0
- package/src/walk/initialize.js +1 -0
- package/src/walk/land.js +32 -0
- package/src/walk/local.js +15 -7
- package/src/walk/moveWalker.js +23 -0
- package/src/walk/onAdd.js +25 -0
- package/src/walk/onKey.js +12 -9
- package/src/walk/onPointer.js +17 -12
- package/src/walk/onRemove.js +9 -1
- package/src/walk/place.js +4 -2
- package/src/walk/start.js +19 -10
- package/src/walk/step.js +21 -29
- package/src/walk/stepWalkerHeight.js +11 -0
- package/src/walk/stop.js +7 -4
- package/src/walk/updateWalkerView.js +22 -0
- package/src/constants/Compass.js +0 -7
- package/src/constants/ContainerResize.js +0 -7
- package/src/constants/PitchDrag.js +0 -7
- package/src/constants/ShiftRotate.js +0 -7
- package/src/constants/TouchMode.js +0 -6
- package/src/constants/accessorSizes.js +0 -1
- package/src/constants/attachState.js +0 -1
- package/src/constants/cameraControlsState.js +0 -1
- package/src/constants/cityMapper.js +0 -6
- package/src/constants/hull.js +0 -1
- package/src/constants/indexState.js +0 -1
- package/src/constants/mapCameraState.js +0 -1
- package/src/constants/nativeLayerState.js +0 -1
- package/src/constants/onMapChangeState.js +0 -1
- package/src/constants/onZoomAnimState.js +0 -1
- package/src/constants/parts.js +0 -19
- package/src/constants/pumpState.js +0 -1
- package/src/constants/ringDirections.js +0 -10
- package/src/constants/roundProfile.js +0 -1
- package/src/constants/underEntryState.js +0 -1
- /package/src/{constants → globals}/TILE_RADIUS.js +0 -0
- /package/src/{constants → globals}/TILE_SIZE.js +0 -0
- /package/src/{constants → globals}/dark.js +0 -0
- /package/src/{constants → globals}/glass.js +0 -0
- /package/src/{constants → globals}/headlight.js +0 -0
- /package/src/{constants → globals}/moves.js +0 -0
- /package/src/{constants → globals}/nativeEventMaps.js +0 -0
- /package/src/{constants → globals}/nativeMethodHandlers.js +0 -0
- /package/src/{constants → globals}/paints.js +0 -0
- /package/src/{constants → globals}/pendingUpdates.js +0 -0
- /package/src/{constants → globals}/renderers.js +0 -0
- /package/src/{constants → globals}/shirt.js +0 -0
- /package/src/{constants → globals}/skin.js +0 -0
- /package/src/{constants → globals}/speed.js +0 -0
- /package/src/{constants → globals}/taillight.js +0 -0
- /package/src/{constants → globals}/trousers.js +0 -0
- /package/src/{constants/accessorTypes.js → globals/types.js} +0 -0
- /package/src/{constants → globals}/tyre.js +0 -0
- /package/src/{constants → globals}/white.js +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
(()=>{if(!window.ol)throw new Error("Unable to load OpenLayers");const b=document.createElement("style");b.dataset.openlayersBindings="",b.textContent=`
|
|
2
|
+
.openlayers-city-mapper {
|
|
3
|
+
position: relative;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
touch-action: none;
|
|
6
|
+
}
|
|
7
|
+
.ol-viewport {
|
|
8
|
+
position: absolute !important;
|
|
9
|
+
inset: 0;
|
|
10
|
+
}
|
|
11
|
+
.ol-overlaycontainer-stopevent { z-index: 1000 !important; }
|
|
12
|
+
.ol-city-corner {
|
|
13
|
+
position: absolute;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: .5em;
|
|
17
|
+
pointer-events: none;
|
|
18
|
+
}
|
|
19
|
+
.ol-city-topleft { top: 5em; left: .5em; }
|
|
20
|
+
.ol-city-topright { top: 10px; right: 10px; }
|
|
21
|
+
.ol-city-bottomleft { bottom: .5em; left: .5em; }
|
|
22
|
+
.ol-city-bottomright { bottom: 4em; right: .5em; }
|
|
23
|
+
.ol-attribution {
|
|
24
|
+
text-align: justify;
|
|
25
|
+
border-radius: 0 !important;
|
|
26
|
+
left: 0;
|
|
27
|
+
right: 0 !important;
|
|
28
|
+
max-width: unset;
|
|
29
|
+
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
|
|
30
|
+
font-size: .75rem;
|
|
31
|
+
line-height: 1.5;
|
|
32
|
+
}
|
|
33
|
+
.ol-attribution a { color: #0078A8; }
|
|
34
|
+
.ol-attribution * { text-shadow: none !important; }
|
|
35
|
+
.ol-city-control {
|
|
36
|
+
position: static;
|
|
37
|
+
pointer-events: auto;
|
|
38
|
+
font: 13px/1.5 sans-serif;
|
|
39
|
+
}
|
|
40
|
+
.ol-city-rotate {
|
|
41
|
+
padding: 0;
|
|
42
|
+
border: 1px solid #0003;
|
|
43
|
+
border-radius: 4px;
|
|
44
|
+
background: #fff;
|
|
45
|
+
background-clip: padding-box;
|
|
46
|
+
}
|
|
47
|
+
.ol-city-rotate a {
|
|
48
|
+
display: block;
|
|
49
|
+
width: 30px;
|
|
50
|
+
height: 30px;
|
|
51
|
+
border-radius: 2px;
|
|
52
|
+
color: #000;
|
|
53
|
+
text-decoration: none;
|
|
54
|
+
}
|
|
55
|
+
.ol-city-rotate a:hover { background: #f4f4f4; }
|
|
56
|
+
.ol-city-rotate a:focus-visible { outline: 2px solid #2675c9; }
|
|
57
|
+
.ol-city-layers {
|
|
58
|
+
max-height: calc(100vh - 5em);
|
|
59
|
+
overflow: auto;
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
}
|
|
62
|
+
.ol-city-layers section { padding: .5em; background: var(--ol-background-color); }
|
|
63
|
+
.ol-city-layers label { display: block; cursor: pointer; white-space: nowrap; }
|
|
64
|
+
.ol-city-layers input { vertical-align: middle; }
|
|
65
|
+
.ol-city-layers hr { border: 0; border-top: 1px solid #ccc; }
|
|
66
|
+
.ol-city-layers .ol-control { background: transparent; }
|
|
67
|
+
.ol-city-layers .sunlight-time button { width: auto; padding: 0 .4em; flex-shrink: 0; }
|
|
68
|
+
.openlayers-city-mapper .leaflet-pane {
|
|
69
|
+
position: absolute;
|
|
70
|
+
inset: 0;
|
|
71
|
+
pointer-events: none;
|
|
72
|
+
}
|
|
73
|
+
.ol-zoom button { width: 30px; height: 30px; }
|
|
74
|
+
.openlayers-city-mapper .leaflet-marker-icon,
|
|
75
|
+
.openlayers-city-mapper .leaflet-marker-shadow {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 0;
|
|
78
|
+
left: 0;
|
|
79
|
+
}
|
|
80
|
+
.openlayers-city-mapper .leaflet-marker-icon { pointer-events: auto; cursor: pointer; }
|
|
81
|
+
.openlayers-city-mapper .leaflet-div-icon { background: #fff; border: 1px solid #666; }
|
|
82
|
+
.ol-city-popup {
|
|
83
|
+
padding: 10px;
|
|
84
|
+
background: white;
|
|
85
|
+
border: 1px solid #888;
|
|
86
|
+
border-radius: 4px;
|
|
87
|
+
font: 14px sans-serif;
|
|
88
|
+
}
|
|
89
|
+
.ol-city-popup button { float: right; margin-left: 12px; }
|
|
90
|
+
.ol-city-tooltip {
|
|
91
|
+
position: absolute;
|
|
92
|
+
z-index: 1100;
|
|
93
|
+
padding: 4px 8px;
|
|
94
|
+
background: white;
|
|
95
|
+
border: 1px solid #888;
|
|
96
|
+
pointer-events: none;
|
|
97
|
+
}
|
|
98
|
+
`,document.head.appendChild(b);const i=window.L={version:"1.9.4-openlayers",control:{}};let Z=0;const g=t=>t._leaflet_id||=++Z,w=(t,e)=>t.options={...t.options,...e},M=new Animation(new KeyframeEffect(null,[],{duration:1,fill:"both",easing:"cubic-bezier(0,0,0.25,1)"}));function f(...t){this.initialize?.(...t),this.callInitHooks()}f.extend=function(t){function e(...o){this.initialize?.(...o),this.callInitHooks()}return Object.setPrototypeOf(e,this),e.prototype=Object.create(this.prototype),Object.assign(e.prototype,t,{constructor:e}),e.prototype.options={...this.prototype.options,...t.options},e.prototype._initHooks=[],e},f.include=function(t){return Object.assign(this.prototype,t),this},f.mergeOptions=function(t){return this.prototype.options={...this.prototype.options,...t},this},f.addInitHook=function(t,...e){return Object.hasOwn(this.prototype,"_initHooks")||(this.prototype._initHooks=[]),this.prototype._initHooks.push(typeof t=="function"?t:function(){this[t](...e)}),this},f.prototype.callInitHooks=function(){if(this._initHooksCalled)return;this._initHooksCalled=!0;const t=[];for(let e=Object.getPrototypeOf(this);e;e=Object.getPrototypeOf(e))t.unshift(e);for(const e of t)if(Object.hasOwn(e,"_initHooks"))for(const o of e._initHooks)o.call(this)},i.Evented=f.extend({on(t,e,o){if(typeof t=="object")for(const[n,a]of Object.entries(t))this.on(n,a,e);else{this._events||={};for(const n of t.split(/\s+/)){const a=this._events[n]||=[];a.some(h=>h.fn===e&&h.context===o)||a.push({fn:e,context:o})}}return this},off(t,e,o){if(!t)this._events={};else if(typeof t=="object")for(const[n,a]of Object.entries(t))this.off(n,a,e);else for(const n of t.split(/\s+/))this._events?.[n]&&(this._events[n]=e?this._events[n].filter(a=>a.fn!==e||a.context!==o):[]);return this},once(t,e,o){const n=a=>{this.off(t,n),e.call(o||this,a)};return this.on(t,n)},fire(t,e){for(const o of[...this._events?.[t]||[]])o.fn.call(o.context||this,{...e,type:t,target:this,sourceTarget:this});return this},listens(t){return!!this._events?.[t]?.length}}),i.Util={stamp:g,setOptions:w,throttle(t,e,o){let n,a;const h=(...l)=>{if(n){a=l;return}t.apply(o,l),n=setTimeout(()=>{if(n=null,a){const s=a;a=null,h(...s)}},e)};return h}},i.Point=function(t,e,o){this.x=o?Math.round(t):t,this.y=o?Math.round(e):e};const p=t=>t instanceof i.Point?t:Array.isArray(t)?new i.Point(...t):new i.Point(t.x,t.y);i.Point.prototype={clone(){return new i.Point(this.x,this.y)},add(t){return this.clone()._add(p(t))},_add(t){return this.x+=t.x,this.y+=t.y,this},subtract(t){return this.clone()._subtract(p(t))},_subtract(t){return this.x-=t.x,this.y-=t.y,this},multiplyBy(t){return new i.Point(this.x*t,this.y*t)},divideBy(t){return new i.Point(this.x/t,this.y/t)},scaleBy(t){return new i.Point(this.x*t.x,this.y*t.y)},unscaleBy(t){return new i.Point(this.x/t.x,this.y/t.y)},round(){return new i.Point(Math.round(this.x),Math.round(this.y))},floor(){return new i.Point(Math.floor(this.x),Math.floor(this.y))},ceil(){return new i.Point(Math.ceil(this.x),Math.ceil(this.y))},distanceTo(t){return t=p(t),Math.hypot(this.x-t.x,this.y-t.y)},equals(t){return t=p(t),this.x===t.x&&this.y===t.y},contains(t){return t=p(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)}},i.LatLng=function(t,e,o){if(!Number.isFinite(Number(t))||!Number.isFinite(Number(e)))throw new Error("Invalid LatLng");this.lat=Number(t),this.lng=Number(e),o!==void 0&&(this.alt=o)};const u=t=>t instanceof i.LatLng?t:Array.isArray(t)?new i.LatLng(...t):new i.LatLng(t.lat,t.lng);i.LatLng.prototype={equals(t,e=1e-9){return t=u(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=e},distanceTo(t){return t=u(t),ol.sphere.getDistance([this.lng,this.lat],[t.lng,t.lat])},wrap(){return new i.LatLng(this.lat,((this.lng+180)%360+360)%360-180,this.alt)}},i.Bounds=function(t,e){if(t)for(const o of e?[t,e]:Array.isArray(t)?t:[t])this.extend(o)},i.Bounds.prototype={extend(t){return t instanceof i.Bounds?(this.extend(t.min),this.extend(t.max),this):(t=p(t),this.min?(this.min.x=Math.min(this.min.x,t.x),this.min.y=Math.min(this.min.y,t.y),this.max.x=Math.max(this.max.x,t.x),this.max.y=Math.max(this.max.y,t.y)):(this.min=t.clone(),this.max=t.clone()),this)},getCenter(){return this.min.add(this.max).divideBy(2)},getSize(){return this.max.subtract(this.min)},contains(t){const e=t.min||p(t),o=t.max||e;return e.x>=this.min.x&&o.x<=this.max.x&&e.y>=this.min.y&&o.y<=this.max.y},intersects(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}},i.LatLngBounds=function(t,e){if(t)for(const o of e?[t,e]:t)this.extend(o)},i.LatLngBounds.prototype={extend(t){return t instanceof i.LatLngBounds?(this.extend(t._southWest),this.extend(t._northEast),this):(t=u(t),this._southWest?(this._southWest.lat=Math.min(this._southWest.lat,t.lat),this._southWest.lng=Math.min(this._southWest.lng,t.lng),this._northEast.lat=Math.max(this._northEast.lat,t.lat),this._northEast.lng=Math.max(this._northEast.lng,t.lng)):(this._southWest=new i.LatLng(t.lat,t.lng),this._northEast=new i.LatLng(t.lat,t.lng)),this)},getSouthWest(){return this._southWest},getNorthEast(){return this._northEast},getNorthWest(){return new i.LatLng(this.getNorth(),this.getWest())},getSouthEast(){return new i.LatLng(this.getSouth(),this.getEast())},getNorth(){return this._northEast.lat},getSouth(){return this._southWest.lat},getEast(){return this._northEast.lng},getWest(){return this._southWest.lng},getCenter(){return new i.LatLng((this.getNorth()+this.getSouth())/2,(this.getEast()+this.getWest())/2)},contains(t){return t=u(t),t.lat>=this.getSouth()&&t.lat<=this.getNorth()&&t.lng>=this.getWest()&&t.lng<=this.getEast()},isValid(){return!!(this._southWest&&this._northEast)}};const T=6378137,L=2*Math.PI*T,m={scale:t=>256*2**t,zoom:t=>Math.log2(t/256),project(t){return t=u(t),p(ol.proj.fromLonLat([t.lng,Math.max(-85.0511287798,Math.min(85.0511287798,t.lat))]))},unproject(t){const[e,o]=ol.proj.toLonLat([t.x,t.y]);return new i.LatLng(o,e)},transformation:{transform(t,e){return new i.Point((t.x/L+.5)*e,(.5-t.y/L)*e)},untransform(t,e){return new i.Point((t.x/e-.5)*L,(.5-t.y/e)*L)}}};i.DomUtil={create(t,e="",o){const n=document.createElement(t);return n.className=e,o?.append(n),n},setPosition(t,e){t._leaflet_pos=p(e),t.style.transform=`translate(${e.x}px,${e.y}px)`},getPosition(t){return t._leaflet_pos||new i.Point(0,0)}};const E=new WeakMap;function P(t,e,o,n,a){if(typeof o=="object"){for(const[l,s]of Object.entries(o))P(t,e,l,s,n);return i.DomEvent}let h=E.get(e);h||E.set(e,h=[]);for(const l of o.split(/\s+/)){const s=h.find(d=>d.type===l&&d.fn===n&&d.context===a);if(t&&!s){const d=a?n.bind(a):n;h.push({type:l,fn:n,context:a,handler:d}),e.addEventListener(l,d,{passive:!1})}else!t&&s&&(e.removeEventListener(l,s.handler),h.splice(h.indexOf(s),1))}return i.DomEvent}const k=t=>t.stopPropagation();i.DomEvent={on:(...t)=>P(!0,...t),off:(...t)=>P(!1,...t),stop(t){t.preventDefault(),t.stopPropagation()},disableClickPropagation(t){return t.classList.add("leaflet-control"),i.DomEvent.on(t,"click dblclick pointerdown mousedown touchstart contextmenu",k),this},disableScrollPropagation(t){return this.on(t,"wheel",k)}},i.Handler=f.extend({initialize(t){this._map=t},enable(){return this._enabled||(this._enabled=!0,this.addHooks?.()),this},disable(){return this._enabled&&(this._enabled=!1,this.removeHooks?.()),this},enabled(){return!!this._enabled},moving(){return!!this._moving}}),i.Layer=i.Evented.extend({initialize(t){w(this,t)},addTo(t){return t.addLayer(this),this},remove(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom(t){return t?.removeLayer(this),this},getAttribution(){return this.options.attribution},getPane(t){return this._map.getPane(t||this.options.pane)},_layerAdd({target:t}){t.hasLayer(this)&&(this._map=t,this.getEvents&&(this._mapEvents=this.getEvents(),t.on(this._mapEvents,this)),this.onAdd?.(t),this.fire("add"),t.fire("layeradd",{layer:this}))}}),i.LayerGroup=i.Layer.extend({initialize(t=[],e){w(this,e),this._layers={};for(const o of t)this.addLayer(o)},addLayer(t){return this._layers[g(t)]=t,this._map?.addLayer(t),this},removeLayer(t){return delete this._layers[g(t)],this._map?.removeLayer(t),this},hasLayer(t){return g(t)in this._layers},eachLayer(t,e){for(const o of Object.values(this._layers))t.call(e||this,o);return this},onAdd(t){this.eachLayer(t.addLayer,t)},onRemove(t){this.eachLayer(t.removeLayer,t)}});for(const[t,e]of[["GridLayer",i.Layer],["Marker",i.Layer],["Path",i.Layer],["Polyline",null],["Polygon",null],["CircleMarker",null],["Circle",null],["ImageOverlay",i.Layer],["VideoOverlay",null],["SVGOverlay",null],["Popup",i.Layer],["Tooltip",i.Layer],["DivIcon",f]]){const o=e||{Polyline:i.Path,Polygon:i.Polyline,CircleMarker:i.Path,Circle:i.CircleMarker,VideoOverlay:i.ImageOverlay,SVGOverlay:i.ImageOverlay}[t];i[t]=o.extend({initialize(){throw new Error(`L.${t} is not supported by the OpenLayers bindings; use L.Layer with a source`)},getEvents(){return{}}})}i.Map=i.Evented.extend({options:{crs:m,minZoom:0,maxZoom:24,zoomSnap:1,touchZoom:!0,scrollWheelZoom:!0,keyboard:!0,doubleClickZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60},initialize(t,e){if(w(this,e),this._container=typeof t=="string"?document.getElementById(t):t,!this._container)throw new Error("Map container not found");g(this._container),this._container.classList.add("openlayers-city-mapper"),this._layers={},this._panes={},this._handlers=[],this._controls=new Set;const o=m.project(this.options.center||[0,0]);this.ol=new ol.Map({target:this._container,controls:[new ol.control.Zoom,new ol.control.Attribution({collapsible:!1})],interactions:[],view:new ol.View({center:[o.x,o.y],zoom:this.options.zoom||0,minZoom:this.getMinZoom(),maxZoom:this.getMaxZoom()})});for(const r of this.ol.getControls().getArray()){r.element.classList.add("leaflet-control");for(const c of r.element.querySelectorAll("button[title]"))c.setAttribute("aria-label",c.title);if(r instanceof ol.control.Zoom)for(const[c,y]of[[".ol-zoom-in",1],[".ol-zoom-out",-1]])r.element.querySelector(c).addEventListener("click",_=>{i.DomEvent.stop(_),_.stopImmediatePropagation(),this._zoomBy(y*(_.shiftKey?3:1))},!0)}this._loaded=!0,this._zoomAnimated=!1,this.dragging=new i.Handler(this).enable(),this.touchZoom=new i.Handler(this),this.options.touchZoom&&this.touchZoom.enable(),this._handlers.push(this.dragging,this.touchZoom);for(const r of["scrollWheelZoom","keyboard","doubleClickZoom"])this.addHandler(r,i.Handler);this._container.hasAttribute("tabindex")||(this._container.tabIndex=0);const n=this.ol.getView();this._viewZoom=n.getZoom(),n.on(["change:center","change:resolution"],()=>{if(this._settingView)return;const r=n.getZoom()!==this._viewZoom;this._viewMoving||(this._viewMoving=!0,this.fire("movestart")),r&&!this._viewZooming&&(this._viewZooming=!0,this.fire("zoomstart")),this.fire("move"),r&&this.fire("zoom"),this._viewZoom=n.getZoom(),!n.getAnimating()&&!n.getInteracting()&&this._endViewChange()}),this.ol.on("moveend",()=>this._endViewChange()),this.ol.getCoordinateFromPixel=r=>{const c=m.project(this.containerPointToLatLng(p(r)));return[c.x,c.y]},this._wheelDelta=0,this.ol.addInteraction(new ol.interaction.Interaction({handleEvent:r=>{const c=r.originalEvent;if(c.target.closest(".ol-control"))return!0;if(r.type==="dblclick"&&this.doubleClickZoom.enabled())this._zoomBy(c.shiftKey?-1:1,p(r.pixel));else if(r.type==="wheel"&&this.scrollWheelZoom.enabled()&&!c.shiftKey){const y=window.devicePixelRatio||1,_=/Linux/.test(navigator.platform)&&/Chrome/.test(navigator.userAgent)?y:/Mac/.test(navigator.platform)?3*y:2*y;this._wheelDelta-=c.deltaY*(c.deltaMode===1?20:c.deltaMode===2?60:1/_),this._wheelPixel=p(r.pixel),this._wheelStart??=performance.now(),clearTimeout(this._wheelTimer),this._wheelTimer=setTimeout(()=>{const x=4*Math.log2(2/(1+Math.exp(-Math.abs(this._wheelDelta/(this.options.wheelPxPerZoomLevel*4))))),z=this.options.zoomSnap,S=Math.sign(this._wheelDelta)*(z?Math.ceil(x/z)*z:x);this._wheelDelta=0,this._wheelStart=null,this._loaded&&this.scrollWheelZoom.enabled()&&this._zoomBy(S,this.options.scrollWheelZoom==="center"?void 0:this._wheelPixel)},Math.max(0,this.options.wheelDebounceTime-(performance.now()-this._wheelStart)))}else return!0;return c.preventDefault(),!1}})),this._controlCorners={};for(const r of["topleft","topright","bottomleft","bottomright"])this._controlCorners[r]=i.DomUtil.create("div",`ol-city-corner ol-city-${r}`,this.ol.getOverlayContainerStopEvent());const a=new ol.source.Vector;this.ol.addLayer(new ol.layer.Vector({source:a}));const h=()=>{const r=new Set(['<a href="https://openlayers.org/">OpenLayers</a>']);this.eachLayer(c=>{c.getAttribution?.()&&r.add(c.getAttribution())}),a.setAttributions([...r])};this.on("layeradd layerremove",h),h();let l,s;const d=r=>{const c=this._container.getBoundingClientRect();return new i.Point(r.clientX-c.left,r.clientY-c.top)};this._onPointer=r=>{if(r.type==="pointerdown"){if(!this.dragging.enabled()||r.button!==0||!r.isPrimary||r.target.closest(".ol-control"))return;l=this.containerPointToLatLng(d(r)),s=r.pointerId,this._moved=this.dragging._moving=!1,this._container.focus({preventScroll:!0}),this._container.setPointerCapture(s)}else if(r.pointerId===s&&r.type==="pointermove"&&this.dragging.enabled()){const c=this.project(l).subtract(this.project(this.containerPointToLatLng(d(r))));Math.hypot(c.x,c.y)>1&&(this._moved=this.dragging._moving=!0),this.setView(this.unproject(this.project(this.getCenter()).add(c)),this.getZoom())}else r.pointerId===s&&r.type!=="pointermove"&&(this._container.hasPointerCapture(s)&&this._container.releasePointerCapture(s),l=null,s=null,this.dragging._moving=!1)},this._onKey=r=>{if(!this.keyboard.enabled()||r.target!==this._container||r.altKey||r.ctrlKey||r.metaKey)return;const c={ArrowLeft:[-80,0],ArrowRight:[80,0],ArrowUp:[0,-80],ArrowDown:[0,80]};if(c[r.key])this.panBy(c[r.key]);else if(["+","=","-","_"].includes(r.key))this._zoomBy((["-","_"].includes(r.key)?-1:1)*(r.shiftKey?3:1));else return;r.preventDefault()},i.DomEvent.on(this._container,"pointerdown pointermove pointerup pointercancel",this._onPointer),i.DomEvent.on(this._container,"keydown",this._onKey),this.ol.on("change:size",()=>this.fire("resize",{newSize:this.getSize()})),this.ol.updateSize()},getContainer(){return this._container},getSize(){return p(this.ol.getSize()||[this._container.clientWidth,this._container.clientHeight])},getCenter(){return m.unproject(p(this.ol.getView().getCenter()))},getZoom(){return this.ol.getView().getZoom()},getMinZoom(){return this.options.minZoom},getMaxZoom(){return this.options.maxZoom},getZoomScale(t,e=this.getZoom()){return 2**(t-e)},getScaleZoom(t,e=this.getZoom()){return e+Math.log2(t)},_limitZoom(t){return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),t))},project(t,e=this.getZoom()){return m.transformation.transform(m.project(t),m.scale(e))},unproject(t,e=this.getZoom()){return m.unproject(m.transformation.untransform(p(t),m.scale(e)))},getPixelOrigin(){return this.project(this.getCenter()).subtract(this.getSize().divideBy(2))},_getMapPanePos(){return new i.Point(0,0)},latLngToLayerPoint(t){return this.project(t).subtract(this.getPixelOrigin())},layerPointToLatLng(t){return this.unproject(p(t).add(this.getPixelOrigin()))},layerPointToContainerPoint(t){return p(t).clone()},containerPointToLayerPoint(t){return p(t).clone()},latLngToContainerPoint(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(t))},containerPointToLatLng(t){return this.layerPointToLatLng(this.containerPointToLayerPoint(t))},getBounds(){return new i.LatLngBounds(this.containerPointToLatLng([0,0]),this.containerPointToLatLng(this.getSize()))},_endViewChange(){if(!this._viewMoving)return;const t=this._viewZooming;this._viewMoving=this._viewZooming=!1,t&&this.fire("zoomend"),this.fire("moveend")},_zoomBy(t,e){if(!t||this.ol.getView().getAnimating())return this;const o=this._limitZoom(this.getZoom()+t);return e?this.setZoomAround(e,o,{animate:!0}):this.setZoom(o,{animate:!0})},setView(t,e=this.getZoom(),o={}){if(t=u(t),e=this._limitZoom(e),(o.animate===!0||o.zoom?.animate===!0)&&e!==this.getZoom()){const l=this.getZoomScale(e),s=m.project(t);return this.ol.getView().animate({center:[s.x,s.y],zoom:e,duration:250,easing:d=>{M.currentTime=d;const r=M.effect.getComputedTiming().progress;return(1-1/(1+(l-1)*r))/(1-1/l)}}),this}this.ol.getView().cancelAnimations(),this._endViewChange();const n=e!==this.getZoom(),a=!t.equals(this.getCenter());if(!n&&!a)return this;this.fire("movestart"),n&&this.fire("zoomstart"),this._settingView=!0;const h=m.project(t);return this.ol.getView().setCenter([h.x,h.y]),this.ol.getView().setZoom(e),this._viewZoom=this.getZoom(),this._settingView=!1,n&&this.fire("zoom"),this.fire("move").fire("viewreset"),n&&this.fire("zoomend"),this.fire("moveend")},setZoom(t,e){return this.setView(this.getCenter(),t,e)},panTo(t){return this.setView(t)},panBy(t){return this.panTo(this.unproject(this.project(this.getCenter()).add(p(t))))},setZoomAround(t,e,o){const n=t instanceof i.Point?t:this.latLngToContainerPoint(t),a=this.getSize().divideBy(2),h=this.getZoomScale(e);return this.setView(this.unproject(this.project(this.getCenter()).add(n.subtract(a).multiplyBy(1-1/h))),e,o)},getBoundsZoom(t,e,o=[0,0]){const n=this.project(t.getSouthEast()).subtract(this.project(t.getNorthWest())),a=this.getSize().subtract(p(o)),h=Math[e?"max":"min"](a.x/n.x,a.y/n.y);return this._limitZoom(this.getScaleZoom(h))},_getBoundsCenterZoom(t,e={}){return{center:t.getCenter(),zoom:this.getBoundsZoom(t,!1,e.padding)}},fitBounds(t,e){const o=this._getBoundsCenterZoom(t,e);return this.setView(o.center,o.zoom)},_limitCenter(t){return t},_limitOffset(t){return t},_tryAnimatedPan(){return!1},panInside(t){return this.getBounds().contains(t)||this.panTo(t),this},whenReady(t,e){return this._loaded?t.call(e||this,{target:this}):this.once("load",t,e),this},addLayer(t){const e=g(t);return this._layers[e]?this:(this._layers[e]=t,t._mapToAdd=this,t.beforeAdd?.(this),this.whenReady(t._layerAdd,t),this)},removeLayer(t){return this.hasLayer(t)?(t.onRemove?.(this),t._mapEvents&&this.off(t._mapEvents,t),delete this._layers[g(t)],this.fire("layerremove",{layer:t}),t.fire("remove"),t._map=t._mapToAdd=null,this):this},hasLayer(t){return!!this._layers[g(t)]},eachLayer(t,e){for(const o of Object.values(this._layers))t.call(e||this,o);return this},createPane(t,e=this._container){return this._panes[t]=i.DomUtil.create("div",`leaflet-pane leaflet-${t}`,e)},getPane(t="overlayPane"){return this._panes[t]},addHandler(t,e){return this[t]=new e(this),this._handlers.push(this[t]),this.options[t]&&this[t].enable(),this},invalidateSize(){return this.ol.updateSize(),this},_draggableMoved(){return!!this._moved},remove(){clearTimeout(this._wheelTimer),this.ol.getView().cancelAnimations(),this.fire("unload");for(const t of[...this._controls])t.remove();this.eachLayer(this.removeLayer,this);for(const t of this._handlers)t.disable();i.DomEvent.off(this._container,"pointerdown pointermove pointerup pointercancel",this._onPointer),i.DomEvent.off(this._container,"keydown",this._onKey),this.ol.setTarget(void 0),this.ol.dispose();for(const t of Object.values(this._controlCorners))t.remove();for(const t of Object.values(this._panes))t.remove();return this._loaded=!1,delete this._container._leaflet_id,this.off()}}),i.Control=f.extend({options:{position:"topright"},initialize(t){w(this,t)},getPosition(){return this.options.position},getContainer(){return this._container},addTo(t){return this.remove(),this._map=t,this._container=this.onAdd(t),i.Control.Rotate&&this instanceof i.Control.Rotate&&this._container.classList.add("ol-city-rotate"),this._container.classList.add("leaflet-control","ol-control","ol-city-control"),this._olControl=new ol.control.Control({element:this._container,target:t._controlCorners[this.getPosition()]}),t.ol.addControl(this._olControl),t._controls.add(this),this},remove(){if(!this._map)return this;const t=this._map;return this.onRemove?.(t),this._container?.remove(),t.ol.removeControl(this._olControl),t._controls.delete(this),this._map=null,this}}),i.Control.Layers=i.Control.extend({options:{collapsed:!0},initialize(t={},e={},o){w(this,o),this._layers=[];for(const[n,a]of Object.entries(t))this._layers.push({name:n,layer:a,overlay:!1});for(const[n,a]of Object.entries(e))this._layers.push({name:n,layer:a,overlay:!0})},onAdd(t){const e=i.DomUtil.create("div","ol-city-layers");i.DomEvent.disableClickPropagation(e),i.DomEvent.disableScrollPropagation(e);const o=i.DomUtil.create("section","",e);o.setAttribute("aria-label","Map layers");const n=i.DomUtil.create("div","",o);i.DomUtil.create("hr","",o);const a=i.DomUtil.create("div","",o);this._inputs=[];for(const h of this._layers){const l=i.DomUtil.create("label","",h.overlay?a:n),s=i.DomUtil.create("input","leaflet-control-layers-selector",l);s.type=h.overlay?"checkbox":"radio",s.name=`base-${g(this)}`,s.layerId=g(h.layer),s.checked=t.hasLayer(h.layer),l.append(document.createTextNode(` ${h.name}`)),this._inputs.push(s),s.onchange=()=>{const d=s.checked;if(!h.overlay)for(const r of this._layers)!r.overlay&&r!==h&&t.removeLayer(r.layer);d?t.addLayer(h.layer):t.removeLayer(h.layer)}}return t.on("layeradd layerremove",this._update,this),e},_update(){for(const t of this._inputs)t.checked=!!this._map._layers[t.layerId]},onRemove(t){t.off("layeradd layerremove",this._update,this)}});const v=t=>t instanceof i.LatLngBounds?t:new i.LatLngBounds(t),O=t=>t.map(e=>Array.isArray(e)&&typeof e[0]!="number"?O(e):u(e)),C=(t,e,o)=>{const n=document.createElement("img");return n.className=o,e.crossOrigin&&(n.crossOrigin=e.crossOrigin===!0?"":e.crossOrigin),n.src=t,n.draggable=!1,n};i.Layer.include({bindPopup(t){return this._popupContent=t,this.off("click",this.openPopup,this).on("click",this.openPopup,this),this.once("remove",this.closePopup,this),this instanceof i.LayerGroup&&this.eachLayer(e=>e.bindPopup(t)),this},openPopup(t){if(!this._map)return this;this.closePopup();const e=t?.latlng||this.getLatLng?.()||this.getBounds?.().getCenter();if(!e)throw new Error("Popup requires a location");const o=i.DomUtil.create("div","ol-city-popup leaflet-popup");o.setAttribute("role","dialog");const n=i.DomUtil.create("button","",o);n.type="button",n.textContent="\xD7",n.setAttribute("aria-label","Close popup"),n.onclick=()=>this.closePopup();const a=i.DomUtil.create("div","",o),h=typeof this._popupContent=="function"?this._popupContent(this):this._popupContent;return h instanceof Node?a.append(h):a.innerHTML=h,i.DomEvent.disableClickPropagation(o),this._popupOverlay=new ol.Overlay({element:o,positioning:"bottom-center",offset:[0,-12]}),this._map.ol.addOverlay(this._popupOverlay),this._popupLocation=u(e),this._map.on("move zoom rotate pitch",this._positionPopup,this),this._positionPopup(),this},_positionPopup(){const t=this._map.latLngToContainerPoint(this._popupLocation);this._popupOverlay.setPosition(this._map.ol.getCoordinateFromPixelInternal([t.x,t.y]))},closePopup(){return this._popupOverlay&&(this._map?.off("move zoom rotate pitch",this._positionPopup,this),this._map?.ol.removeOverlay(this._popupOverlay),this._popupOverlay=null),this},bindTooltip(t){return this._tooltipContent=t,this.on("mouseover",this._showTooltip,this).on("mouseout remove",this._hideTooltip,this),this instanceof i.LayerGroup&&this.eachLayer(e=>e.bindTooltip(t)),this},_showTooltip(t){if(this._hideTooltip(),!this._map||!t.latlng)return;const e=this._tooltipElement=i.DomUtil.create("div","ol-city-tooltip leaflet-tooltip",this._map.getContainer());e.setAttribute("role","tooltip");const o=typeof this._tooltipContent=="function"?this._tooltipContent(this):this._tooltipContent;o instanceof Node?e.append(o):e.innerHTML=o;const n=this._map.latLngToContainerPoint(t.latlng);e.style.left=`${n.x+12}px`,e.style.top=`${n.y+12}px`},_hideTooltip(){this._tooltipElement?.remove(),this._tooltipElement=null}}),i.LayerGroup.include({getLayers(){return Object.values(this._layers)},getBounds(){const t=new i.LatLngBounds;return this.eachLayer(e=>t.extend(e.getBounds?.()||e.getLatLng())),t}}),i.FeatureGroup=i.LayerGroup.extend({}),i.Path.include({options:{pane:"overlayPane",interactive:!0,stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",fill:!1,fillOpacity:.2},initialize(t){i.Util.setOptions(this,t)},setStyle(t){return i.Util.setOptions(this,t),this.redraw()},redraw(){return this},bringToFront(){return this},bringToBack(){return this}}),i.Polyline.include({initialize(t,e){i.Util.setOptions(this,e),this.setLatLngs(t)},getLatLngs(){return this._latlngs},setLatLngs(t){return this._latlngs=O(t),this.redraw()},addLatLng(t){return this._latlngs.push(u(t)),this.redraw()},getBounds(){const t=new i.LatLngBounds,e=o=>{for(const n of o)Array.isArray(n)?e(n):t.extend(n)};return e(this._latlngs),t},_project(){this._rings=[];const t=e=>{e.length&&(Array.isArray(e[0])?e.forEach(t):this._rings.push(e.map(o=>this._map.latLngToLayerPoint(o))))};t(this._latlngs)},closestLayerPoint(t){this._project();const e=this._rings.map(n=>n.map(a=>[a.x,a.y])),o=new ol.geom.MultiLineString(e).getClosestPoint([t.x,t.y]);return p(o)}}),i.Polyline.mergeOptions(i.Path.prototype.options),i.Polygon.include({initialize:i.Polyline.prototype.initialize}),i.Polygon.mergeOptions(i.Path.prototype.options),i.Polygon.mergeOptions({fill:!0}),i.Rectangle=i.Polygon.extend({initialize(t,e){i.Util.setOptions(this,e),this.setBounds(t)},setBounds(t){return t=v(t),this.setLatLngs([t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()])}}),i.CircleMarker.include({options:{...i.Path.prototype.options,fill:!0,radius:10},initialize(t,e){i.Util.setOptions(this,e),this._latlng=u(t)},getLatLng(){return this._latlng},setLatLng(t){return this._latlng=u(t),this.fire("move",{latlng:this._latlng}),this.redraw()},getRadius(){return this.options.radius},setRadius(t){return this.options.radius=t,this.redraw()}}),i.Circle.include({initialize:i.CircleMarker.prototype.initialize,_project(){this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=this._radiusY=this.getRadius()*this._map.options.crs.scale(this._map.getZoom())/(2*Math.PI*6378137*Math.cos(this._latlng.lat*Math.PI/180))},getBounds(){const t=this.getRadius()/6378137*180/Math.PI,e=t/Math.cos(this._latlng.lat*Math.PI/180);return new i.LatLngBounds([this._latlng.lat-t,this._latlng.lng-e],[this._latlng.lat+t,this._latlng.lng+e])}}),i.Circle.mergeOptions(i.CircleMarker.prototype.options),i.GeoJSON=i.FeatureGroup.extend({initialize(t,e){i.LayerGroup.prototype.initialize.call(this,[],e),t&&this.addData(t)},addData(t){const e=new ol.format.GeoJSON().readFeatures(t),o=(n,a)=>{const h=n.getCoordinates(),l=s=>typeof s[0]=="number"?[s[1],s[0]]:s.map(l);switch(n.getType()){case"Point":return this.options.pointToLayer?this.options.pointToLayer(a,u(l(h))):new i.Marker(l(h));case"MultiPoint":return new i.FeatureGroup(h.map(s=>o(new ol.geom.Point(s),a)));case"LineString":case"MultiLineString":return new i.Polyline(l(h),this.options);case"Polygon":case"MultiPolygon":return new i.Polygon(l(h),this.options);default:throw new Error(`Unsupported GeoJSON geometry: ${n.getType()}`)}};for(const n of e){const a=o(n.getGeometry(),new ol.format.GeoJSON().writeFeatureObject(n));this.addLayer(a)}return this}}),i.GridLayer.include({options:{pane:"tilePane",tileSize:256,opacity:1,minZoom:0,maxZoom:24,updateInterval:200},initialize(t){i.Util.setOptions(this,t),this._tiles={}},getTileSize(){return typeof this.options.tileSize=="number"?new i.Point(this.options.tileSize,this.options.tileSize):p(this.options.tileSize)},getEvents(){return{moveend:this._onMoveEnd,zoomend:this._onMoveEnd,resize:this._onMoveEnd}},_initContainer(){this._container=i.DomUtil.create("div","",this.getPane())},onAdd(){this._initContainer(),this._onMoveEnd()},onRemove(){for(const t of Object.values(this._tiles))this.fire("tileunload",{tile:t.el,coords:t.coords});this._tiles={},this._container?.remove()},_getTiledPixelBounds(){return new i.Bounds(this._map.project(this._map.getBounds().getNorthWest(),this._tileZoom),this._map.project(this._map.getBounds().getSouthEast(),this._tileZoom))},_onMoveEnd(){if(!this._map)return;this._tileZoom=Math.max(this.options.minZoom,Math.min(this.options.maxZoom,Math.round(this._map.getZoom())));const t=this.getTileSize(),e=this._getTiledPixelBounds(this._map.getCenter()),o=e.min.unscaleBy(t).floor(),n=e.max.unscaleBy(t).floor(),a=new Set,h=2**this._tileZoom;for(let l=o.x;l<=n.x;l++)for(let s=o.y;s<=n.y;s++){if(s<0||s>=h)continue;const d=`${this._tileZoom}:${l}:${s}`;if(a.add(d),this._tiles[d])continue;const r=new i.Point(l,s);r.z=this._tileZoom;const c=this._tiles[d]={coords:r,current:!0,loaded:0},y=(_,x)=>{if(this._tiles[d]===c){if(c.el=x,_){this.fire("tileerror",{error:_,tile:x,coords:r});return}c.loaded=Date.now(),this.fire("tileload",{tile:x,coords:r}),this.fire("load")}};c.el=this.createTile(r,y),this.createTile.length<2&&y(null,c.el)}for(const[l,s]of Object.entries(this._tiles))a.has(l)||(delete this._tiles[l],this.fire("tileunload",{tile:s.el,coords:s.coords}))},_tileCoordsToNwSe(t){const e=this.getTileSize(),o=new i.Point(t.x*e.x,t.y*e.y);return[this._map.unproject(o,t.z),this._map.unproject(o.add(e),t.z)]},setOpacity(t){return this.options.opacity=t,this},setZIndex(t){return this.options.zIndex=t,this},redraw(){return this._map&&(this.onRemove(),this._onMoveEnd()),this}}),i.TileLayer=i.GridLayer.extend({initialize(t,e){i.GridLayer.prototype.initialize.call(this,e),this.setUrl(t)},setUrl(t){return this._url=t,this._source=new ol.source.XYZ({url:t,crossOrigin:"anonymous"}),this.redraw()},createTile(t,e){const o=this._source.getTileUrlFunction()([t.z,t.x,t.y],1,ol.proj.get("EPSG:3857")),n=C(o,this.options,"");return n.onload=()=>e(null,n),n.onerror=()=>e(new Error(`Unable to load tile: ${o}`),n),n}}),i.TileLayer.WMS=i.TileLayer.extend({setUrl(t){return this._url=t,this._source=new ol.source.TileWMS({url:t,crossOrigin:"anonymous",params:{LAYERS:this.options.layers,FORMAT:this.options.format||"image/png",TRANSPARENT:this.options.transparent||!1}}),this.redraw()}}),i.ImageOverlay.include({options:{pane:"overlayPane",opacity:1,interactive:!1},initialize(t,e,o){i.Util.setOptions(this,o),this._url=t,this._bounds=v(e)},_initImage(){this._image=C(this._url,this.options,""),this._image.onload=()=>this.fire("load"),this._image.onerror=()=>this.fire("error",{error:new Error(`Unable to load image: ${this._url}`)})},getBounds(){return this._bounds},setBounds(t){return this._bounds=v(t),this},setUrl(t){return this._url=t,this._image&&(this._image.src=t),this},setOpacity(t){return this.options.opacity=t,this},setZIndex(t){return this.options.zIndex=t,this}}),i.Icon=i.Evented.extend({initialize(t){i.Util.setOptions(this,t)},createIcon(){return this._create("icon")},createShadow(){return this.options.shadowUrl?this._create("shadow"):null},_create(t){const e=C(this.options[`${t}Url`],this.options,`leaflet-marker-${t}`),o=this.options[`${t}Size`],n=this.options[`${t}Anchor`]||this.options.iconAnchor;return o&&(e.style.width=`${o[0]}px`,e.style.height=`${o[1]}px`),n&&(e.style.marginLeft=`${-n[0]}px`,e.style.marginTop=`${-n[1]}px`),e}}),i.Icon.Default=i.Icon.extend({options:{iconUrl:"https://unpkg.com/leaflet@1.9/dist/images/marker-icon.png",shadowUrl:"https://unpkg.com/leaflet@1.9/dist/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],shadowSize:[41,41],shadowAnchor:[12,41]}}),i.DivIcon=i.Icon.extend({createIcon(){const t=i.DomUtil.create("div",`leaflet-marker-icon ${this.options.className||""}`);this.options.html instanceof Node?t.append(this.options.html):t.innerHTML=this.options.html||"";const e=this.options.iconSize||[12,12],o=this.options.iconAnchor||e.map(n=>n/2);return t.style.cssText=`width:${e[0]}px;height:${e[1]}px;margin-left:${-o[0]}px;margin-top:${-o[1]}px`,t},createShadow(){return null}}),i.Marker.include({options:{pane:"markerPane",icon:new i.Icon.Default,opacity:1,interactive:!0,zIndexOffset:0},initialize(t,e){i.Util.setOptions(this,e),this._latlng=u(t)},getLatLng(){return this._latlng},setLatLng(t){return this._latlng=u(t),this.update(),this.fire("move",{latlng:this._latlng})},setIcon(t){return this.options.icon=t,this._map&&(this.onRemove(),this.onAdd()),this},getEvents(){return{zoom:this.update,viewreset:this.update}},onAdd(){this._icon=this.options.icon.createIcon(),this._shadow=this.options.icon.createShadow(),this._icon.tabIndex=0,this._icon.setAttribute("role","button"),this._icon.setAttribute("aria-label",this.options.title||"Marker"),this._icon.title=this.options.title||"";for(const t of[this._shadow,this._icon])t&&this.getPane().append(t);this._initInteraction(),this.update()},onRemove(){this.dragging?.disable(),this._icon?.remove(),this._shadow?.remove()},update(){return this._map&&this._icon&&this._setPos(this._map.latLngToLayerPoint(this._latlng)),this},_setPos(t){for(const e of[this._icon,this._shadow])e&&i.DomUtil.setPosition(e,t);this._zIndex=t.y+this.options.zIndexOffset,this._updateZIndex(0)},_updateZIndex(t){this._icon&&(this._icon.style.zIndex=this._zIndex+t)},setOpacity(t){return this.options.opacity=t,this},setZIndexOffset(t){return this.options.zIndexOffset=t,this.update()},_initInteraction(){this._icon._cityLayer=this;const t=this.dragging=new i.Handler(this._map),e=this._icon;i.DomEvent.on(e,"pointerdown",s=>{this._map._moved=!1,s.stopPropagation()}),i.DomEvent.on(e,"keydown",s=>{s.key!=="Enter"&&s.key!==" "||(i.DomEvent.stop(s),this.fire("click",{latlng:this._latlng,originalEvent:s}))}),t._marker=this,t._draggable=new i.Evented,t._onDrag=function(){const s=this._marker;s._latlng=s._map.layerPointToLatLng(i.DomUtil.getPosition(s._icon)),s.fire("move",{latlng:s._latlng}).fire("drag",{latlng:s._latlng})},t._adjustPan=function(){},t._draggable.on("drag",t._onDrag,t);let o,n,a,h;const l=s=>{if(t.enabled())if(s.type==="pointerdown"){if(s.button!==0)return;s.preventDefault(),s.stopPropagation(),o=s.pointerId,n=[s.clientX,s.clientY],a=this._map.latLngToContainerPoint(this._latlng),h=!1,e.setPointerCapture(o),this.fire("dragstart")}else if(s.pointerId===o&&s.type==="pointermove"){const d=new i.Point(a.x+s.clientX-n[0],a.y+s.clientY-n[1]);i.DomUtil.setPosition(e,d),t._draggable._newPos=d,t._draggable.fire("drag",{originalEvent:s}),h=!0}else s.pointerId===o&&(e.hasPointerCapture(o)&&e.releasePointerCapture(o),o=null,this.fire("dragend"),this._map._moved=h)};t.addHooks=()=>i.DomEvent.on(e,"pointerdown pointermove pointerup pointercancel",l),t.removeHooks=()=>i.DomEvent.off(e,"pointerdown pointermove pointerup pointercancel",l),this.options.draggable&&t.enable()}}),i.Map.include({_fireDOMEvent(t,e=t.type,o){const n=this.getContainer().getBoundingClientRect(),a=new i.Point(t.clientX-n.left,t.clientY-n.top),h=this.containerPointToLatLng(a),l=t.target.closest?.(".leaflet-marker-icon")?._cityLayer;if(!(e==="click"&&this._draggableMoved(l)))for(const s of o||(l?[l]:[this]))s.fire(e,{originalEvent:t,latlng:h,containerPoint:a,layerPoint:this.containerPointToLayerPoint(a)})}}),i.Map.addInitHook(function(){for(const[e,o]of[["tilePane",200],["overlayPane",400],["markerPane",600]])this.createPane(e).style.zIndex=o;const t=e=>this._fireDOMEvent(e);i.DomEvent.on(this.getContainer(),"click mousemove mouseout mouseover",t),this.once("unload",()=>i.DomEvent.off(this.getContainer(),"click mousemove mouseout mouseover",t))})})();
|
|
99
|
+
//# sourceMappingURL=openlayers-bindings.min.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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 for (const [name, order] of [['tilePane', 200], ['overlayPane', 400], ['markerPane', 600]]) {\r\n this.createPane(name).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"],
|
|
5
|
+
"mappings": "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",
|
|
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", "order"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leaflet-city-mapper",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "A small 3D rendering engine for leaflet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/leaflet-city-mapper.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"build": "node build/build.js",
|
|
12
12
|
"test": "node build/test.js",
|
|
13
13
|
"pmtiles": "node build/pmtiles.js",
|
|
14
|
-
"version": "npm run build && git add -A dist"
|
|
14
|
+
"version": "npm run build && git add -A dist libs"
|
|
15
15
|
},
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"@cucumber/cucumber": "^10.3.1",
|
|
42
42
|
"acorn": "^8.15.0",
|
|
43
43
|
"esbuild": "^0.28.2",
|
|
44
|
-
"playwright": "^1.64.1"
|
|
44
|
+
"playwright": "^1.64.1",
|
|
45
|
+
"pngjs": "^7.0.0"
|
|
45
46
|
}
|
|
46
47
|
}
|
|
@@ -1,32 +1,50 @@
|
|
|
1
|
+
import { directoryReader } from '../globals/directoryReader.js';
|
|
1
2
|
import { varint } from './varint.js';
|
|
3
|
+
|
|
2
4
|
/** Decode delta/varint directory columns, rejecting malformed entries. */
|
|
3
5
|
|
|
4
6
|
export function decodeDirectory(data) {
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
tileId += varint(reader);
|
|
14
|
-
if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {
|
|
15
|
-
throw new Error('Invalid PMTiles directory tile IDs');
|
|
7
|
+
const reader = directoryReader;
|
|
8
|
+
const bytes = /* alloc */ new Uint8Array(data);
|
|
9
|
+
reader.bytes = bytes;
|
|
10
|
+
reader.cursor = 0;
|
|
11
|
+
try {
|
|
12
|
+
const count = varint(reader);
|
|
13
|
+
if (count > (bytes.length - reader.cursor) / 4) {
|
|
14
|
+
throw /* alloc */ new Error('Invalid PMTiles directory count');
|
|
16
15
|
}
|
|
17
|
-
entries
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
entry
|
|
16
|
+
const entries = /* alloc */ new Array(count);
|
|
17
|
+
let tileId = 0;
|
|
18
|
+
let i, entry, value;
|
|
19
|
+
for (i = 0; i < count; i++) {
|
|
20
|
+
tileId += varint(reader);
|
|
21
|
+
if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {
|
|
22
|
+
throw /* alloc */ new Error('Invalid PMTiles directory tile IDs');
|
|
23
|
+
}
|
|
24
|
+
entries[i] = /* alloc */ { tileId, runLength: 0, length: 0, offset: 0 };
|
|
25
|
+
}
|
|
26
|
+
for (entry of entries) entry.runLength = varint(reader);
|
|
27
|
+
for (entry of entries) {
|
|
28
|
+
entry.length = varint(reader);
|
|
29
|
+
if (!entry.length) {
|
|
30
|
+
throw /* alloc */ new Error('Invalid PMTiles directory length');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (i = 0; i < entries.length; i++) {
|
|
34
|
+
entry = entries[i];
|
|
35
|
+
value = varint(reader);
|
|
36
|
+
if (!value && !i) {
|
|
37
|
+
throw /* alloc */ new Error('Invalid PMTiles directory offset');
|
|
38
|
+
}
|
|
39
|
+
entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;
|
|
40
|
+
}
|
|
41
|
+
if (reader.cursor !== bytes.length) {
|
|
42
|
+
throw /* alloc */ new Error('Trailing PMTiles directory data');
|
|
43
|
+
}
|
|
44
|
+
return entries;
|
|
45
|
+
} finally {
|
|
46
|
+
// Decoding is synchronous; release the input before reusing this reader.
|
|
47
|
+
reader.bytes = null;
|
|
48
|
+
reader.cursor = 0;
|
|
29
49
|
}
|
|
30
|
-
if (reader.cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');
|
|
31
|
-
return entries;
|
|
32
50
|
}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { headerOffsets } from '../globals/headerOffsets.js';
|
|
2
|
+
import { headerFlags } from '../globals/headerFlags.js';
|
|
3
|
+
import { headerBounds } from '../globals/headerBounds.js';
|
|
4
|
+
|
|
2
5
|
|
|
6
|
+
/** Decode the PMTiles v3 header. */
|
|
3
7
|
export function decodeHeader(data) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
8
|
+
const view = data.byteLength >= 127
|
|
9
|
+
? /* alloc */ new DataView(data) : null;
|
|
10
|
+
// "PMTiles" followed by version 3, read as two little-endian words.
|
|
11
|
+
if (!view || view.getUint32(0, true) !== 0x69544d50 || view.getUint32(4, true) !== 0x0373656c) {
|
|
12
|
+
throw /* alloc */ new Error('Expected a PMTiles v3 archive');
|
|
13
|
+
}
|
|
14
|
+
const header = /* alloc */ {};
|
|
11
15
|
let i;
|
|
12
|
-
for (i = 0; i <
|
|
13
|
-
for (i = 0; i <
|
|
14
|
-
for (i = 0; i <
|
|
16
|
+
for (i = 0; i < headerOffsets.length; i++) header[headerOffsets[i]] = Number(view.getBigUint64(8 + i * 8, true));
|
|
17
|
+
for (i = 0; i < headerFlags.length; i++) header[headerFlags[i]] = view.getUint8(96 + i);
|
|
18
|
+
for (i = 0; i < headerBounds.length; i++) header[headerBounds[i]] = view.getInt32(102 + i * 4, true) / 1e7;
|
|
15
19
|
header.centerZoom = view.getUint8(118);
|
|
16
20
|
header.centerLon = view.getInt32(119, true) / 1e7;
|
|
17
21
|
header.centerLat = view.getInt32(123, true) / 1e7;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export async function decompress(data, compression) {
|
|
2
2
|
if (compression === 1) return data;
|
|
3
|
-
if (compression !== 2)
|
|
4
|
-
|
|
3
|
+
if (compression !== 2) {
|
|
4
|
+
throw /* alloc */ new Error(`Unsupported PMTiles compression: ${compression}`);
|
|
5
|
+
}
|
|
6
|
+
const blob = /* alloc */ new Blob(
|
|
7
|
+
/* alloc */ [data]);
|
|
8
|
+
const stream = /* alloc */ new DecompressionStream('gzip');
|
|
9
|
+
return /* alloc */ new Response(blob.stream().pipeThrough(stream)).arrayBuffer();
|
|
5
10
|
}
|