leaflet-city-mapper 0.0.2 → 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 +56 -14
- package/cucumber.mjs +2 -2
- 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 -1
- 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 +5 -3
- package/src/archives/decodeDirectory.js +50 -0
- package/src/archives/decodeHeader.js +23 -0
- package/src/archives/decompress.js +10 -0
- 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 +13 -0
- package/src/archives/getTileData.js +13 -0
- package/src/archives/getZxy.js +19 -0
- package/src/archives/loadDirectory.js +7 -0
- package/src/archives/loadSource.js +31 -0
- package/src/archives/read.js +32 -0
- package/src/archives/tileId.js +23 -0
- package/src/archives/varint.js +19 -0
- package/src/camera/angles.js +14 -0
- package/src/camera/animationPoint.js +11 -0
- package/src/camera/cameraMapReady.js +11 -0
- package/src/camera/cancelCameraAnimation.js +15 -0
- package/src/camera/cleanupCameraMap.js +14 -0
- package/src/camera/constrainCameraToBounds.js +3 -0
- package/src/camera/displayPoint.js +3 -0
- package/src/camera/fitCameraBounds.js +58 -0
- package/src/camera/getBearing.js +5 -0
- package/src/camera/getPitch.js +5 -0
- package/src/camera/groundBounds.js +18 -0
- package/src/camera/initializeCameraMap.js +30 -0
- package/src/camera/mapAnimateCamera.js +24 -0
- package/src/camera/mapCamera.js +103 -0
- package/src/camera/mapContainerPointToLayerPoint.js +9 -0
- package/src/camera/mapGetBearing.js +4 -0
- package/src/camera/mapGetBounds.js +20 -0
- package/src/camera/mapGetBoundsCenterZoom.js +10 -0
- package/src/camera/mapGetBoundsZoom.js +24 -0
- package/src/camera/mapGetCenterLayerPoint.js +6 -0
- package/src/camera/mapGetPitch.js +4 -0
- package/src/camera/mapLayerPointToContainerPoint.js +8 -0
- package/src/camera/mapLimitCenter.js +17 -0
- package/src/camera/mapLimitOffset.js +14 -0
- package/src/camera/mapPanBy.js +10 -0
- package/src/camera/mapPanInside.js +20 -0
- package/src/camera/mapResetNorth.js +4 -0
- package/src/camera/mapResetNorthPitch.js +4 -0
- package/src/camera/mapSetBearing.js +3 -0
- package/src/camera/mapSetPitch.js +3 -0
- package/src/camera/mapSetPitchAndBearing.js +22 -0
- package/src/camera/mapSetZoomAround.js +15 -0
- package/src/camera/mapStopPitchBearingAnimation.js +6 -0
- package/src/camera/mapTryAnimatedPan.js +10 -0
- package/src/camera/mapUpdateCameraOverlays.js +8 -0
- package/src/camera/pointOf.js +5 -0
- package/src/camera/project.js +27 -0
- package/src/camera/runCameraAnimations.js +31 -0
- package/src/camera/scheduleCameraAnimation.js +13 -0
- package/src/camera/updateSky.js +22 -0
- package/src/camera/verticalGroundY.js +4 -0
- 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/collectMeshes.js +5 -0
- package/src/collision/collider.js +56 -0
- package/src/collision/hiddenLightHit.js +8 -0
- package/src/collision/indexTriangle.js +11 -0
- package/src/collision/intersectMeshes.js +32 -0
- 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 +17 -0
- package/src/collision/transformTriangle.js +9 -0
- package/src/collision/triangleDistance.js +21 -0
- package/src/collision/worldHit.js +18 -0
- package/src/controls/acceptPitchDrag.js +4 -0
- package/src/controls/acceptRotateDrag.js +3 -0
- package/src/controls/addCameraHandler.js +9 -0
- package/src/controls/adjustCameraDrag.js +15 -0
- package/src/controls/cameraControls.js +91 -0
- package/src/controls/cameraDragClick.js +10 -0
- package/src/controls/cameraDragContextMenu.js +9 -0
- package/src/controls/cameraDragDown.js +23 -0
- package/src/controls/cameraDragEnd.js +7 -0
- package/src/controls/cameraDragMove.js +28 -0
- package/src/controls/changeCameraTouch.js +17 -0
- package/src/controls/cleanupCameraTouch.js +29 -0
- package/src/controls/compassAddHooks.js +18 -0
- package/src/controls/compassOrientation.js +7 -0
- package/src/controls/compassRemoveHooks.js +5 -0
- package/src/controls/containerResizeAddHooks.js +8 -0
- package/src/controls/containerResizeRemoveHooks.js +5 -0
- package/src/controls/dragCamera.js +26 -0
- package/src/controls/editable.js +3 -0
- package/src/controls/endAllCameraDrags.js +9 -0
- package/src/controls/endAllCameraTouches.js +9 -0
- package/src/controls/endCameraTouch.js +12 -0
- package/src/controls/endCameraTouchEvent.js +8 -0
- package/src/controls/failCompassPermission.js +4 -0
- package/src/controls/finishCameraDrag.js +9 -0
- package/src/controls/finishCompassPermission.js +17 -0
- package/src/controls/loadCameraControls.js +9 -0
- package/src/controls/moveCameraTouch.js +29 -0
- package/src/controls/notifyCameraTouchChange.js +1 -0
- package/src/controls/pitchDragAddHooks.js +8 -0
- package/src/controls/pitchDragRemoveHooks.js +5 -0
- package/src/controls/refreshRotateControl.js +10 -0
- package/src/controls/refreshRotateFocus.js +5 -0
- package/src/controls/removeCameraDrag.js +26 -0
- package/src/controls/resizeMap.js +3 -0
- package/src/controls/rotateButtonClick.js +11 -0
- package/src/controls/rotateButtonKeydown.js +15 -0
- package/src/controls/rotateControl.js +4 -0
- package/src/controls/rotateOnAdd.js +42 -0
- package/src/controls/rotateOnRemove.js +6 -0
- package/src/controls/shiftRotateAddHooks.js +10 -0
- package/src/controls/shiftRotateRemoveHooks.js +5 -0
- package/src/controls/shiftRotateWheel.js +11 -0
- package/src/controls/startCameraTouch.js +33 -0
- package/src/core/addImageState.js +8 -0
- package/src/core/addRasterImage.js +12 -0
- package/src/core/adjustCameraMarkerPan.js +28 -0
- package/src/core/beforeNativeRender.js +10 -0
- package/src/core/boundsQuad.js +12 -0
- package/src/core/bringNativeLayerToBack.js +8 -0
- package/src/core/bringNativeLayerToFront.js +8 -0
- package/src/core/bypassNativeEvent.js +11 -0
- package/src/core/cameraCircleBounds.js +7 -0
- package/src/core/cameraMarkerDrag.js +21 -0
- package/src/core/cameraMarkerOnDrag.js +13 -0
- package/src/core/cancelGridFade.js +14 -0
- package/src/core/closestCameraLayerPoint.js +8 -0
- package/src/core/compareNativeHits.js +3 -0
- package/src/core/current.js +6 -0
- package/src/core/disposeNativeLayer.js +39 -0
- package/src/core/fireRasterLoad.js +6 -0
- package/src/core/forwardNativeError.js +3 -0
- package/src/core/gridlayerGetEvents.js +10 -0
- package/src/core/gridlayerGetTiledPixelBounds.js +12 -0
- package/src/core/handleNativeMapEvent.js +27 -0
- package/src/core/hideTargets.js +18 -0
- package/src/core/initNativeGPU.js +25 -0
- package/src/core/initializeGridContainer.js +7 -0
- package/src/core/initializeNativeLayer.js +40 -0
- package/src/core/layerCallInitHooks.js +14 -0
- package/src/core/localPixel.js +5 -0
- package/src/core/localPixelForGeometry.js +7 -0
- package/src/core/localPosition.js +10 -0
- package/src/core/markerCameraIconPoint.js +12 -0
- package/src/core/markerGetEvents.js +9 -0
- package/src/core/markerImageBounds.js +11 -0
- package/src/core/markerInitInteraction.js +10 -0
- package/src/core/markerQuadCorners.js +48 -0
- package/src/core/markerSetIcon.js +12 -0
- package/src/core/markerSetPos.js +19 -0
- package/src/core/markerSetRotation.js +9 -0
- package/src/core/markerUpdateZIndex.js +12 -0
- package/src/core/nativeAddLatLng.js +3 -0
- package/src/core/nativeBringToBack.js +3 -0
- package/src/core/nativeBringToFront.js +3 -0
- package/src/core/nativeEventSource.js +18 -0
- package/src/core/nativeEvents.js +31 -0
- package/src/core/nativeImageError.js +13 -0
- package/src/core/nativeImageRefresh.js +11 -0
- package/src/core/nativeLayer.js +100 -0
- package/src/core/nativeLayerMethod.js +26 -0
- package/src/core/nativeRedraw.js +3 -0
- package/src/core/nativeSetBounds.js +3 -0
- package/src/core/nativeSetIcon.js +3 -0
- package/src/core/nativeSetLatLng.js +3 -0
- package/src/core/nativeSetLatLngs.js +3 -0
- package/src/core/nativeSetOpacity.js +3 -0
- package/src/core/nativeSetRadius.js +3 -0
- package/src/core/nativeSetStyle.js +3 -0
- package/src/core/nativeSetUrl.js +3 -0
- package/src/core/nativeSetZIndex.js +3 -0
- package/src/core/nativeSetZIndexOffset.js +3 -0
- package/src/core/popupAdjustPan.js +29 -0
- package/src/core/popupGetEvents.js +8 -0
- package/src/core/popupUpdatePosition.js +17 -0
- package/src/core/pruneNativeResources.js +20 -0
- package/src/core/putNativeMesh.js +36 -0
- package/src/core/quadNativeMesh.js +20 -0
- package/src/core/readyNativeGPU.js +9 -0
- package/src/core/redrawPath.js +6 -0
- package/src/core/refreshNativeEvent.js +5 -0
- package/src/core/refreshNativeLayer.js +34 -0
- package/src/core/refreshNativeLayerContract.js +8 -0
- package/src/core/rejectNativeReady.js +4 -0
- package/src/core/removeImageState.js +9 -0
- package/src/core/removeLayer.js +22 -0
- package/src/core/removeNativeEvents.js +17 -0
- package/src/core/removeTargets.js +12 -0
- package/src/core/reorderNativeLayer.js +9 -0
- package/src/core/resolveNativeReady.js +4 -0
- package/src/core/restoreNativeEvents.js +6 -0
- package/src/core/runGridFades.js +19 -0
- package/src/core/runMarkerPanFrame.js +14 -0
- package/src/core/scheduleGridFade.js +14 -0
- package/src/core/scheduleMarkerPan.js +11 -0
- package/src/core/setRotation.js +5 -0
- package/src/core/styleNativeMesh.js +14 -0
- package/src/core/syncGridLayer.js +29 -0
- package/src/core/syncImageOverlay.js +9 -0
- package/src/core/syncMarker.js +14 -0
- package/src/core/syncVectorLayer.js +29 -0
- package/src/core/synchronizeNativeLayer.js +26 -0
- package/src/core/textureFor.js +46 -0
- package/src/core/tooltipGetEvents.js +8 -0
- package/src/core/tooltipSetPosition.js +11 -0
- package/src/core/transformNativePoint.js +7 -0
- package/src/core/updateGridOpacity.js +27 -0
- package/src/core/updateNativeHover.js +7 -0
- package/src/core/updateNativeLayerView.js +9 -0
- package/src/core/uploadCanvasTexture.js +22 -0
- package/src/core/uploadNativeImage.js +13 -0
- package/src/geometry/addBridges.js +29 -0
- package/src/geometry/below.js +3 -0
- package/src/geometry/box.js +8 -0
- package/src/geometry/bridgeEdge.js +11 -0
- package/src/geometry/bridgeElevation.js +21 -0
- package/src/geometry/bridgeFaces.js +15 -0
- package/src/geometry/bridgeLocal.js +5 -0
- 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 +23 -0
- package/src/geometry/circleAt.js +7 -0
- package/src/geometry/circleGeometry.js +34 -0
- package/src/geometry/clipLine.js +23 -0
- package/src/geometry/clipSegment.js +23 -0
- package/src/geometry/computeBounds.js +38 -0
- package/src/geometry/conformModelToTerrain.js +72 -0
- package/src/geometry/cross.js +7 -0
- package/src/geometry/dashValues.js +14 -0
- package/src/geometry/dashedSegment.js +16 -0
- package/src/geometry/disk.js +11 -0
- package/src/geometry/diskAt.js +6 -0
- package/src/geometry/dot.js +6 -0
- package/src/geometry/emitter.js +8 -0
- package/src/geometry/indexBridge.js +29 -0
- package/src/geometry/lampPostGeometry.js +30 -0
- package/src/geometry/lampRing.js +14 -0
- package/src/geometry/lightGeometry.js +15 -0
- package/src/geometry/line.js +21 -0
- package/src/geometry/lineJoin.js +26 -0
- package/src/geometry/nativeGeometry.js +21 -0
- package/src/geometry/nativeTriangle.js +3 -0
- package/src/geometry/polygon.js +23 -0
- package/src/geometry/push.js +3 -0
- package/src/geometry/quad.js +9 -0
- package/src/geometry/roofCoverage.js +23 -0
- package/src/geometry/roofFootprint.js +29 -0
- package/src/geometry/samePoint.js +3 -0
- package/src/geometry/segment.js +22 -0
- package/src/geometry/setVertexColor.js +17 -0
- package/src/geometry/sub.js +6 -0
- package/src/geometry/subtractRoofTile.js +19 -0
- package/src/geometry/surface.js +18 -0
- package/src/geometry/treeGeometry.js +30 -0
- package/src/geometry/treeRing.js +15 -0
- package/src/geometry/triangle.js +13 -0
- package/src/geometry/validateTree.js +7 -0
- package/src/geometry/vertexNormals.js +26 -0
- package/src/geometry/visit.js +10 -0
- package/src/globals/CELL.js +3 -0
- package/src/globals/Compass.js +1 -0
- package/src/globals/ContainerResize.js +1 -0
- package/src/globals/HEIGHT.js +1 -0
- package/src/globals/L.js +1 -0
- package/src/globals/PitchDrag.js +1 -0
- package/src/globals/ShiftRotate.js +1 -0
- package/src/globals/TILE_RADIUS.js +1 -0
- package/src/globals/TILE_SIZE.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/globals/colliders.js +1 -0
- 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/dark.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/globals/elevationWGSL.js +27 -0
- 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/glass.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/globals/limbs.js +8 -0
- 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/nativeEventMaps.js +1 -0
- package/src/globals/nativeMethodHandlers.js +31 -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/pendingUpdates.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/shirt.js +1 -0
- package/src/globals/sinObliquity.js +3 -0
- package/src/globals/sizes.js +6 -0
- package/src/globals/skin.js +2 -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/globals/trafficShader.js +49 -0
- package/src/globals/triangleContexts.js +1 -0
- package/src/globals/trousers.js +1 -0
- package/src/globals/tyre.js +1 -0
- package/src/globals/uVLayout.js +8 -0
- package/src/globals/vehicles.js +55 -0
- 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 +48 -328
- package/src/lighting/cacheLightGrid.js +32 -0
- package/src/lighting/collectLightMeshes.js +9 -0
- package/src/lighting/lightGrid.js +43 -0
- package/src/lighting/updatePointLights.js +38 -0
- package/src/lighting/visitCells.js +8 -0
- package/src/lighting/visitLightCells.js +13 -0
- package/src/lighting/worldLights.js +25 -0
- 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 +48 -0
- package/src/models/hasUnsupportedPrimitives.js +10 -0
- package/src/models/loadBuffer.js +6 -0
- package/src/models/loadImage.js +19 -0
- package/src/models/loadModel.js +44 -0
- package/src/models/loadModelResources.js +19 -0
- package/src/models/materialFor.js +21 -0
- package/src/models/modelNode.js +49 -0
- package/src/models/nodeMatrix.js +27 -0
- package/src/models/normalizeAccessor.js +11 -0
- package/src/models/readAccessor.js +33 -0
- package/src/models/readAccessorValue.js +7 -0
- package/src/models/readAccessorValues.js +20 -0
- 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 +38 -0
- package/src/models/textureSampler.js +10 -0
- package/src/picking/collectVisibleMesh.js +4 -0
- package/src/picking/findFeature.js +52 -0
- package/src/picking/hit.js +24 -0
- package/src/picking/hitColliderCell.js +19 -0
- package/src/picking/hitMesh.js +26 -0
- package/src/picking/onClick.js +16 -0
- package/src/picking/onPointerLeave.js +14 -0
- package/src/picking/onPointerMove.js +18 -0
- package/src/picking/pointerClick.js +5 -0
- package/src/picking/pointerLeave.js +5 -0
- package/src/picking/pointerMove.js +5 -0
- package/src/picking/raycast.js +66 -0
- package/src/picking/setHighlight.js +20 -0
- package/src/picking/shouldSkipOther.js +6 -0
- package/src/picking/showFeature.js +37 -0
- package/src/picking/validateCameraInverse.js +8 -0
- package/src/raster/addRasterTile.js +69 -0
- package/src/raster/comparePendingTiles.js +5 -0
- package/src/raster/createGeometry.js +29 -0
- package/src/raster/createRasterMesh.js +76 -0
- package/src/raster/finishAttachment.js +15 -0
- package/src/raster/finishRasterTile.js +61 -0
- package/src/raster/getRasterEvents.js +6 -0
- package/src/raster/getRasterTileSize.js +7 -0
- package/src/raster/initRaster.js +33 -0
- package/src/raster/isLoading.js +7 -0
- package/src/raster/loadRasterTile.js +13 -0
- package/src/raster/onPMTileAdd.js +13 -0
- package/src/raster/onPMTileRemove.js +11 -0
- package/src/raster/pruneRasterTiles.js +40 -0
- package/src/raster/pumpRasterTiles.js +26 -0
- package/src/raster/rasterTileRange.js +23 -0
- package/src/raster/readyRaster.js +16 -0
- package/src/raster/registerTerrainTile.js +15 -0
- package/src/raster/releaseRasterTile.js +21 -0
- package/src/raster/releaseRasterTiles.js +18 -0
- package/src/raster/removeRasterTile.js +16 -0
- package/src/raster/reportError.js +6 -0
- package/src/raster/retainRasterTiles.js +15 -0
- package/src/raster/setPMTileOpacity.js +7 -0
- package/src/raster/setPMTileZIndex.js +7 -0
- package/src/raster/setRasterOpacity.js +14 -0
- package/src/raster/setRasterTerrain.js +25 -0
- package/src/raster/setRasterZIndex.js +14 -0
- package/src/raster/terrainTileGeometry.js +16 -0
- package/src/raster/updateAttachedTiles.js +13 -0
- package/src/raster/updateRasterTiles.js +51 -0
- package/src/rendering/bindMeshTextures.js +50 -0
- package/src/rendering/collectFrameMeshes.js +38 -0
- package/src/rendering/collectMeshes.js +14 -0
- 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 -0
- package/src/rendering/compareRoofTiles.js +4 -0
- package/src/rendering/composeRoofAtlas.js +69 -0
- package/src/rendering/createMesh.js +44 -0
- package/src/rendering/createProgram.js +75 -0
- package/src/rendering/createProgramLayout.js +36 -0
- package/src/rendering/createProgramUniforms.js +17 -0
- package/src/rendering/destroyAfterSubmission.js +8 -0
- package/src/rendering/destroyTexture.js +9 -0
- package/src/rendering/disposeMesh.js +14 -0
- package/src/rendering/drawGeometry.js +41 -0
- package/src/rendering/drawPipeline.js +34 -0
- package/src/rendering/drawSceneMeshes.js +48 -0
- package/src/rendering/ensureRoofBlit.js +20 -0
- package/src/rendering/prepareFrameBuffer.js +17 -0
- package/src/rendering/prepareFrameMeshes.js +37 -0
- package/src/rendering/prepareFrameUniforms.js +44 -0
- 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 +52 -0
- package/src/rendering/render.js +69 -0
- package/src/rendering/reportCompilation.js +17 -0
- package/src/rendering/resizeRenderer.js +24 -0
- package/src/rendering/resizeRoofTexture.js +24 -0
- package/src/rendering/revealRoofMesh.js +15 -0
- package/src/rendering/sortMeshes.js +6 -0
- package/src/rendering/synchronizeZoomView.js +26 -0
- package/src/rendering/textureBinding.js +7 -0
- package/src/rendering/updateMapCamera.js +46 -0
- package/src/rendering/updateRoofAtlas.js +20 -0
- package/src/rendering/updateRoofRaster.js +25 -0
- 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 -0
- package/src/scene/attachLayer.js +13 -0
- package/src/scene/callLayer.js +26 -0
- package/src/scene/cancelUpdate.js +13 -0
- 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 +3 -0
- package/src/scene/emptyNode.js +12 -0
- package/src/scene/endZoom.js +23 -0
- package/src/scene/failAttachment.js +12 -0
- package/src/scene/get3DEvents.js +16 -0
- package/src/scene/getLocation.js +7 -0
- package/src/scene/init3D.js +43 -0
- package/src/scene/initializeLayer.js +22 -0
- package/src/scene/initializeRendererResources.js +35 -0
- package/src/scene/initializeSharedRenderer.js +45 -0
- package/src/scene/initializerFor.js +16 -0
- package/src/scene/isNativeLayer.js +12 -0
- package/src/scene/layerCountTitle.js +4 -0
- package/src/scene/layerInitialize.js +48 -0
- package/src/scene/layerLayerAdd.js +43 -0
- package/src/scene/mountRenderer.js +25 -0
- package/src/scene/onAdd3DLayer.js +39 -0
- package/src/scene/onMapChange.js +18 -0
- package/src/scene/onRemove3DLayer.js +63 -0
- package/src/scene/onZoomAnim.js +18 -0
- package/src/scene/placeEntry.js +13 -0
- package/src/scene/placeEntryElement.js +22 -0
- package/src/scene/placeUnderEntry.js +8 -0
- package/src/scene/ready.js +9 -0
- package/src/scene/ready3D.js +35 -0
- package/src/scene/releaseRenderer.js +14 -0
- package/src/scene/releaseSharedScene.js +25 -0
- package/src/scene/removeEntry.js +8 -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 +15 -0
- package/src/scene/renderPendingUpdates.js +23 -0
- package/src/scene/renderPendingZoomAnimation.js +11 -0
- package/src/scene/rendererDeviceError.js +14 -0
- package/src/scene/rendererDeviceLost.js +14 -0
- package/src/scene/replaceEntry.js +9 -0
- package/src/scene/reportError.js +3 -0
- package/src/scene/requestAdapter.js +12 -0
- package/src/scene/requestDevice.js +9 -0
- package/src/scene/resolveNextInitialization.js +13 -0
- package/src/scene/restoreGeometry.js +23 -0
- package/src/scene/restoreMaterialTextures.js +16 -0
- package/src/scene/restoreObject.js +35 -0
- package/src/scene/runPlacements.js +9 -0
- package/src/scene/showWebGPUWarning.js +16 -0
- package/src/scene/startZoom.js +8 -0
- package/src/scene/traverse.js +7 -0
- package/src/scene/underEntry.js +16 -0
- package/src/scene/update.js +23 -0
- package/src/scene/updateCamera.js +57 -0
- package/src/scene/updateLayerCount.js +22 -0
- package/src/scene/updateWorldMatrix.js +43 -0
- package/src/scene/worldMatrixChanged.js +18 -0
- package/src/shaders/materialBaseShader.js +17 -0
- package/src/shaders/materialShaders.js +130 -0
- 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 +21 -0
- package/src/shadows/drawShadowMeshes.js +58 -0
- package/src/shadows/ensureShadowPipeline.js +64 -0
- package/src/shadows/meshShadowBounds.js +24 -0
- package/src/shadows/renderSunlight.js +48 -0
- package/src/shadows/resizeSunlight.js +21 -0
- package/src/shadows/shadowBounds.js +23 -0
- package/src/shadows/shadowCacheMatches.js +17 -0
- package/src/shadows/shadowMatrix.js +49 -0
- package/src/shadows/shadowMeshMatches.js +11 -0
- package/src/sources/addGeneratedTriangle.js +7 -0
- package/src/sources/addTriangle.js +17 -0
- package/src/sources/attachAreaMesh.js +64 -0
- package/src/sources/buildArea.js +46 -0
- package/src/sources/buildAreaFeature.js +36 -0
- package/src/sources/buildAreaPoint.js +25 -0
- package/src/sources/buildAreaPolygon.js +29 -0
- package/src/sources/compareAreaDistance.js +3 -0
- package/src/sources/extrusionStyle.js +10 -0
- package/src/sources/featureAnchor.js +9 -0
- package/src/sources/generateTreeGeometry.js +13 -0
- package/src/sources/groundOffset.js +3 -0
- package/src/sources/initializeGeoJSON.js +10 -0
- package/src/sources/instanceAreaGeometry.js +31 -0
- package/src/sources/pendingSourceAreas.js +20 -0
- package/src/sources/projectRing.js +27 -0
- package/src/sources/projectedTree.js +19 -0
- package/src/sources/pump.js +44 -0
- package/src/sources/releaseArea.js +25 -0
- package/src/sources/setGeoJSONData.js +15 -0
- package/src/sources/setGeoJSONLayerData.js +5 -0
- package/src/sources/sourceAreaContext.js +19 -0
- package/src/sources/updateArea.js +52 -0
- package/src/sources/updateStatus.js +15 -0
- package/src/sunlight/addTimeLayer.js +6 -0
- package/src/sunlight/addTo.js +11 -0
- package/src/sunlight/atmosphere.js +25 -0
- package/src/sunlight/createSun.js +54 -0
- package/src/sunlight/horizontalPosition.js +16 -0
- package/src/sunlight/initSunlight.js +17 -0
- package/src/sunlight/initialize.js +14 -0
- package/src/sunlight/mix.js +7 -0
- package/src/sunlight/moonPosition.js +18 -0
- package/src/sunlight/onAdd.js +5 -0
- package/src/sunlight/onAddSun.js +27 -0
- package/src/sunlight/onRemoveSun.js +10 -0
- package/src/sunlight/projectCelestialBody.js +13 -0
- package/src/sunlight/remove.js +8 -0
- package/src/sunlight/removeSun.js +21 -0
- package/src/sunlight/removeTimeLayer.js +7 -0
- package/src/sunlight/render.js +9 -0
- package/src/sunlight/rgb.js +8 -0
- package/src/sunlight/solarPosition.js +18 -0
- package/src/sunlight/solarTime.js +11 -0
- package/src/sunlight/styleTimeControl.js +7 -0
- package/src/sunlight/tickSun.js +5 -0
- package/src/sunlight/updateCelestialDisc.js +12 -0
- package/src/sunlight/updateSky.js +17 -0
- package/src/sunlight/updateSun.js +40 -0
- package/src/sunlight/useLiveTime.js +6 -0
- package/src/sunlight/useSelectedTime.js +23 -0
- package/src/terrain/applyTerrain.js +21 -0
- package/src/terrain/clearLayerTerrain.js +8 -0
- package/src/terrain/copyTerrainTile.js +12 -0
- package/src/terrain/getElevation.js +14 -0
- package/src/terrain/initTerrain.js +23 -0
- package/src/terrain/loadReadyTerrain.js +5 -0
- package/src/terrain/loadTerrain.js +43 -0
- package/src/terrain/loadTerrainTiles.js +17 -0
- package/src/terrain/onTerrainAdd.js +25 -0
- package/src/terrain/onTerrainChange.js +17 -0
- package/src/terrain/onTerrainRemove.js +45 -0
- package/src/terrain/rasterProgram.js +51 -0
- package/src/terrain/readBridges.js +4 -0
- package/src/terrain/sample.js +7 -0
- package/src/terrain/setLayerTerrain.js +8 -0
- package/src/terrain/setTerrainHeight.js +14 -0
- package/src/terrain/terrainAtlas.js +17 -0
- package/src/terrain/terrainBuffers.js +27 -0
- package/src/terrain/terrainElevation.js +15 -0
- package/src/terrain/terrainGrid.js +32 -0
- package/src/terrain/terrainTileQueue.js +25 -0
- package/src/traffic/addTraffic.js +10 -0
- package/src/traffic/along.js +20 -0
- package/src/traffic/appendRouteDash.js +15 -0
- package/src/traffic/appendRouteSegment.js +15 -0
- package/src/traffic/clockMinutes.js +6 -0
- package/src/traffic/compareDepartures.js +5 -0
- package/src/traffic/createTrafficMesh.js +7 -0
- package/src/traffic/destroyTrafficGpu.js +7 -0
- package/src/traffic/disposeTrafficObject.js +16 -0
- package/src/traffic/drawTrafficRoute.js +9 -0
- package/src/traffic/failTraffic.js +6 -0
- package/src/traffic/failedTrafficLoad.js +5 -0
- package/src/traffic/fetchTrafficLanes.js +10 -0
- package/src/traffic/groundTraffic.js +19 -0
- package/src/traffic/initTraffic.js +66 -0
- package/src/traffic/loadTraffic.js +15 -0
- package/src/traffic/loadedTrafficLanes.js +16 -0
- package/src/traffic/locateTraffic.js +11 -0
- package/src/traffic/moveTraffic.js +15 -0
- package/src/traffic/placeTraffic.js +21 -0
- package/src/traffic/prepareTraffic.js +30 -0
- package/src/traffic/readyTraffic.js +6 -0
- package/src/traffic/rebaseTraffic.js +60 -0
- package/src/traffic/rebuildTrafficMesh.js +32 -0
- package/src/traffic/refreshTrafficTrips.js +32 -0
- package/src/traffic/removeTraffic.js +20 -0
- package/src/traffic/routeColor.js +6 -0
- package/src/traffic/routeGeometry.js +21 -0
- package/src/traffic/scheduledTrips.js +51 -0
- package/src/traffic/startTraffic.js +8 -0
- package/src/traffic/tickTraffic.js +26 -0
- package/src/traffic/toLanes.js +24 -0
- package/src/traffic/tooltip.js +9 -0
- package/src/traffic/trafficBounds.js +21 -0
- package/src/traffic/trafficNow.js +10 -0
- package/src/traffic/trafficStatusText.js +5 -0
- package/src/traffic/trafficStorage.js +5 -0
- package/src/traffic/tripsAt.js +27 -0
- package/src/traffic/updateTraffic.js +11 -0
- package/src/traffic/updateTrafficLights.js +16 -0
- package/src/traffic/updateTrafficPose.js +8 -0
- package/src/traffic/updateTrafficTerrain.js +12 -0
- package/src/traffic/uploadTrafficLanes.js +21 -0
- package/src/traffic/vehicleOffsets.js +12 -0
- package/src/triangulation/area.js +9 -0
- package/src/triangulation/clean.js +18 -0
- package/src/triangulation/clipEars.js +23 -0
- package/src/triangulation/connectHole.js +18 -0
- package/src/triangulation/containsVertex.js +11 -0
- package/src/triangulation/cross.js +3 -0
- package/src/triangulation/crossesBoundary.js +8 -0
- package/src/triangulation/crossesRing.js +9 -0
- package/src/triangulation/equal.js +3 -0
- package/src/triangulation/inside.js +10 -0
- package/src/triangulation/insideHole.js +7 -0
- package/src/triangulation/intersects.js +11 -0
- package/src/triangulation/isClockWise.js +13 -0
- package/src/triangulation/mergeHoles.js +11 -0
- package/src/triangulation/minimumX.js +6 -0
- package/src/triangulation/on.js +4 -0
- package/src/triangulation/polygonRings.js +14 -0
- package/src/triangulation/sortHoles.js +21 -0
- package/src/triangulation/triangulate.js +48 -0
- package/src/triangulation/validateArea.js +10 -0
- package/src/utils/channel.js +2 -2
- package/src/utils/compareDistance.js +3 -0
- package/src/utils/noOperation.js +1 -0
- package/src/utils/parseColor.js +4 -4
- package/src/utils/toSRGB.js +3 -1
- package/src/utils/wrap.js +3 -1
- package/src/vehicles/bicycleModel.js +24 -0
- package/src/vehicles/boatBenches.js +9 -0
- package/src/vehicles/boatModel.js +35 -0
- package/src/vehicles/busModel.js +6 -0
- package/src/vehicles/carModel.js +38 -0
- package/src/vehicles/carriage.js +20 -0
- package/src/vehicles/metroModel.js +9 -0
- package/src/vehicles/mirror.js +8 -0
- package/src/vehicles/pedestrianModel.js +18 -0
- package/src/vehicles/tramModel.js +9 -0
- package/src/walk/blocked.js +6 -0
- package/src/walk/createWalk.js +66 -0
- package/src/walk/initWalk.js +19 -0
- package/src/walk/initialize.js +7 -0
- package/src/walk/land.js +32 -0
- package/src/walk/local.js +18 -0
- package/src/walk/moveWalker.js +23 -0
- package/src/walk/onAdd.js +29 -0
- package/src/walk/onBlur.js +3 -0
- package/src/walk/onKey.js +15 -0
- package/src/walk/onPointer.js +18 -0
- package/src/walk/onRemove.js +12 -0
- package/src/walk/onTerrain.js +5 -0
- package/src/walk/place.js +20 -0
- package/src/walk/start.js +46 -0
- package/src/walk/step.js +45 -0
- package/src/walk/stepWalkerHeight.js +11 -0
- package/src/walk/stop.js +30 -0
- package/src/walk/toggle.js +6 -0
- package/src/walk/updateWalkerView.js +22 -0
- package/dist/utils/CELL.js +0 -2
- package/dist/utils/CELL.js.map +0 -7
- package/dist/utils/addBridges.js +0 -2
- package/dist/utils/addBridges.js.map +0 -7
- package/dist/utils/addRasterTile.js +0 -2
- package/dist/utils/addRasterTile.js.map +0 -7
- package/dist/utils/along.js +0 -2
- package/dist/utils/along.js.map +0 -7
- package/dist/utils/atmosphere.js +0 -2
- package/dist/utils/atmosphere.js.map +0 -7
- package/dist/utils/attach.js +0 -2
- package/dist/utils/attach.js.map +0 -7
- package/dist/utils/bindSunlight.js +0 -2
- package/dist/utils/bindSunlight.js.map +0 -7
- package/dist/utils/box.js +0 -2
- package/dist/utils/box.js.map +0 -7
- package/dist/utils/bridgeElevation.js +0 -2
- package/dist/utils/bridgeElevation.js.map +0 -7
- package/dist/utils/build.js +0 -2
- package/dist/utils/build.js.map +0 -7
- package/dist/utils/cameraControls.js +0 -2
- package/dist/utils/cameraControls.js.map +0 -7
- package/dist/utils/channel.js +0 -2
- package/dist/utils/channel.js.map +0 -7
- package/dist/utils/collider.js +0 -2
- package/dist/utils/collider.js.map +0 -7
- package/dist/utils/colliders.js +0 -2
- package/dist/utils/colliders.js.map +0 -7
- package/dist/utils/computeBounds.js +0 -2
- package/dist/utils/computeBounds.js.map +0 -7
- package/dist/utils/conformModelToTerrain.js +0 -2
- package/dist/utils/conformModelToTerrain.js.map +0 -7
- package/dist/utils/createMesh.js +0 -2
- package/dist/utils/createMesh.js.map +0 -7
- package/dist/utils/createProgram.js +0 -3
- package/dist/utils/createProgram.js.map +0 -7
- package/dist/utils/decodeDirectory.js +0 -2
- package/dist/utils/decodeDirectory.js.map +0 -7
- package/dist/utils/decodeHeader.js +0 -2
- package/dist/utils/decodeHeader.js.map +0 -7
- package/dist/utils/decodeModel.js +0 -2
- package/dist/utils/decodeModel.js.map +0 -7
- package/dist/utils/decompress.js +0 -2
- package/dist/utils/decompress.js.map +0 -7
- package/dist/utils/destroyTexture.js +0 -2
- package/dist/utils/destroyTexture.js.map +0 -7
- package/dist/utils/disposeMesh.js +0 -2
- package/dist/utils/disposeMesh.js.map +0 -7
- package/dist/utils/drawGeometry.js +0 -2
- package/dist/utils/drawGeometry.js.map +0 -7
- package/dist/utils/elevationWGSL.js +0 -24
- package/dist/utils/elevationWGSL.js.map +0 -7
- package/dist/utils/emptyNode.js +0 -2
- package/dist/utils/emptyNode.js.map +0 -7
- package/dist/utils/endZoom.js +0 -2
- package/dist/utils/endZoom.js.map +0 -7
- package/dist/utils/findFeature.js +0 -2
- package/dist/utils/findFeature.js.map +0 -7
- package/dist/utils/geometry.js +0 -1
- package/dist/utils/geometry.js.map +0 -7
- package/dist/utils/getElevation.js +0 -2
- package/dist/utils/getElevation.js.map +0 -7
- package/dist/utils/getHeader.js +0 -2
- package/dist/utils/getHeader.js.map +0 -7
- package/dist/utils/getZxy.js +0 -2
- package/dist/utils/getZxy.js.map +0 -7
- package/dist/utils/glass.js +0 -2
- package/dist/utils/glass.js.map +0 -7
- package/dist/utils/headlight.js +0 -2
- package/dist/utils/headlight.js.map +0 -7
- package/dist/utils/hit.js +0 -2
- package/dist/utils/hit.js.map +0 -7
- package/dist/utils/horizontalPosition.js +0 -2
- package/dist/utils/horizontalPosition.js.map +0 -7
- package/dist/utils/horizontalRay.js +0 -2
- package/dist/utils/horizontalRay.js.map +0 -7
- package/dist/utils/hull.js +0 -2
- package/dist/utils/hull.js.map +0 -7
- package/dist/utils/initSunlight.js +0 -2
- package/dist/utils/initSunlight.js.map +0 -7
- package/dist/utils/initTerrain.js +0 -2
- package/dist/utils/initTerrain.js.map +0 -7
- package/dist/utils/initTraffic.js +0 -40
- package/dist/utils/initTraffic.js.map +0 -7
- package/dist/utils/initWalk.js +0 -2
- package/dist/utils/initWalk.js.map +0 -7
- package/dist/utils/intersectMeshes.js +0 -2
- package/dist/utils/intersectMeshes.js.map +0 -7
- package/dist/utils/isClockWise.js +0 -2
- package/dist/utils/isClockWise.js.map +0 -7
- package/dist/utils/lampPostGeometry.js +0 -2
- package/dist/utils/lampPostGeometry.js.map +0 -7
- package/dist/utils/lightGeometry.js +0 -2
- package/dist/utils/lightGeometry.js.map +0 -7
- package/dist/utils/lightGrid.js +0 -2
- package/dist/utils/lightGrid.js.map +0 -7
- package/dist/utils/limbs.js +0 -2
- package/dist/utils/limbs.js.map +0 -7
- package/dist/utils/loadModel.js +0 -2
- package/dist/utils/loadModel.js.map +0 -7
- package/dist/utils/loadSource.js +0 -2
- package/dist/utils/loadSource.js.map +0 -7
- package/dist/utils/loadTerrain.js +0 -2
- package/dist/utils/loadTerrain.js.map +0 -7
- package/dist/utils/mapCamera.js +0 -2
- package/dist/utils/mapCamera.js.map +0 -7
- package/dist/utils/materialShaders.js +0 -211
- package/dist/utils/materialShaders.js.map +0 -7
- package/dist/utils/mirror.js +0 -2
- package/dist/utils/mirror.js.map +0 -7
- package/dist/utils/moonPosition.js +0 -2
- package/dist/utils/moonPosition.js.map +0 -7
- package/dist/utils/moves.js +0 -2
- package/dist/utils/moves.js.map +0 -7
- package/dist/utils/nativeEvents.js +0 -2
- package/dist/utils/nativeEvents.js.map +0 -7
- package/dist/utils/nativeGeometry.js +0 -2
- package/dist/utils/nativeGeometry.js.map +0 -7
- package/dist/utils/nativeLayer.js +0 -2
- package/dist/utils/nativeLayer.js.map +0 -7
- package/dist/utils/nodeMatrix.js +0 -2
- package/dist/utils/nodeMatrix.js.map +0 -7
- package/dist/utils/onAdd3DLayer.js +0 -2
- package/dist/utils/onAdd3DLayer.js.map +0 -7
- package/dist/utils/onAddSun.js +0 -2
- package/dist/utils/onAddSun.js.map +0 -7
- package/dist/utils/onClick.js +0 -2
- package/dist/utils/onClick.js.map +0 -7
- package/dist/utils/onMapChange.js +0 -2
- package/dist/utils/onMapChange.js.map +0 -7
- package/dist/utils/onPMTileAdd.js +0 -2
- package/dist/utils/onPMTileAdd.js.map +0 -7
- package/dist/utils/onPMTileRemove.js +0 -2
- package/dist/utils/onPMTileRemove.js.map +0 -7
- package/dist/utils/onPointerLeave.js +0 -2
- package/dist/utils/onPointerLeave.js.map +0 -7
- package/dist/utils/onPointerMove.js +0 -2
- package/dist/utils/onPointerMove.js.map +0 -7
- package/dist/utils/onRemove3DLayer.js +0 -2
- package/dist/utils/onRemove3DLayer.js.map +0 -7
- package/dist/utils/onRemoveSun.js +0 -2
- package/dist/utils/onRemoveSun.js.map +0 -7
- package/dist/utils/onTerrainAdd.js +0 -2
- package/dist/utils/onTerrainAdd.js.map +0 -7
- package/dist/utils/onTerrainChange.js +0 -2
- package/dist/utils/onTerrainChange.js.map +0 -7
- package/dist/utils/onTerrainRemove.js +0 -2
- package/dist/utils/onTerrainRemove.js.map +0 -7
- package/dist/utils/onZoomAnim.js +0 -2
- package/dist/utils/onZoomAnim.js.map +0 -7
- package/dist/utils/paints.js +0 -2
- package/dist/utils/paints.js.map +0 -7
- package/dist/utils/parseColor.js +0 -2
- package/dist/utils/parseColor.js.map +0 -7
- package/dist/utils/parts.js +0 -2
- package/dist/utils/parts.js.map +0 -7
- package/dist/utils/projectCelestialBody.js +0 -2
- package/dist/utils/projectCelestialBody.js.map +0 -7
- package/dist/utils/pump.js +0 -2
- package/dist/utils/pump.js.map +0 -7
- package/dist/utils/rasterTiles.js +0 -2
- package/dist/utils/rasterTiles.js.map +0 -7
- package/dist/utils/raycast.js +0 -2
- package/dist/utils/raycast.js.map +0 -7
- package/dist/utils/read.js +0 -2
- package/dist/utils/read.js.map +0 -7
- package/dist/utils/readAccessor.js +0 -2
- package/dist/utils/readAccessor.js.map +0 -7
- package/dist/utils/releaseArea.js +0 -2
- package/dist/utils/releaseArea.js.map +0 -7
- package/dist/utils/removeRasterTile.js +0 -2
- package/dist/utils/removeRasterTile.js.map +0 -7
- package/dist/utils/render.js +0 -15
- package/dist/utils/render.js.map +0 -7
- package/dist/utils/renderSunlight.js +0 -13
- package/dist/utils/renderSunlight.js.map +0 -7
- package/dist/utils/renderers.js +0 -2
- package/dist/utils/renderers.js.map +0 -7
- package/dist/utils/resizeSunlight.js +0 -2
- package/dist/utils/resizeSunlight.js.map +0 -7
- package/dist/utils/roofCoverage.js +0 -2
- package/dist/utils/roofCoverage.js.map +0 -7
- package/dist/utils/routeGeometry.js +0 -2
- package/dist/utils/routeGeometry.js.map +0 -7
- package/dist/utils/scheduledTrips.js +0 -2
- package/dist/utils/scheduledTrips.js.map +0 -7
- package/dist/utils/setGeoJSONData.js +0 -2
- package/dist/utils/setGeoJSONData.js.map +0 -7
- package/dist/utils/setHighlight.js +0 -2
- package/dist/utils/setHighlight.js.map +0 -7
- package/dist/utils/setPMTileOpacity.js +0 -2
- package/dist/utils/setPMTileOpacity.js.map +0 -7
- package/dist/utils/setPMTileZIndex.js +0 -2
- package/dist/utils/setPMTileZIndex.js.map +0 -7
- package/dist/utils/setParent.js +0 -2
- package/dist/utils/setParent.js.map +0 -7
- package/dist/utils/setTerrainHeight.js +0 -2
- package/dist/utils/setTerrainHeight.js.map +0 -7
- package/dist/utils/setVertexColor.js +0 -2
- package/dist/utils/setVertexColor.js.map +0 -7
- package/dist/utils/showFeature.js +0 -2
- package/dist/utils/showFeature.js.map +0 -7
- package/dist/utils/sizes.js +0 -2
- package/dist/utils/sizes.js.map +0 -7
- package/dist/utils/skin.js +0 -2
- package/dist/utils/skin.js.map +0 -7
- package/dist/utils/solarPosition.js +0 -2
- package/dist/utils/solarPosition.js.map +0 -7
- package/dist/utils/sortMeshes.js +0 -2
- package/dist/utils/sortMeshes.js.map +0 -7
- package/dist/utils/speed.js +0 -2
- package/dist/utils/speed.js.map +0 -7
- package/dist/utils/startZoom.js +0 -2
- package/dist/utils/startZoom.js.map +0 -7
- package/dist/utils/taillight.js +0 -2
- package/dist/utils/taillight.js.map +0 -7
- package/dist/utils/terrainAtlas.js +0 -2
- package/dist/utils/terrainAtlas.js.map +0 -7
- package/dist/utils/terrainElevation.js +0 -2
- package/dist/utils/terrainElevation.js.map +0 -7
- package/dist/utils/terrainGrid.js +0 -2
- package/dist/utils/terrainGrid.js.map +0 -7
- package/dist/utils/textureSampler.js +0 -2
- package/dist/utils/textureSampler.js.map +0 -7
- package/dist/utils/tileId.js +0 -2
- package/dist/utils/tileId.js.map +0 -7
- package/dist/utils/toLanes.js +0 -2
- package/dist/utils/toLanes.js.map +0 -7
- package/dist/utils/toSRGB.js +0 -2
- package/dist/utils/toSRGB.js.map +0 -7
- package/dist/utils/tooltip.js +0 -3
- package/dist/utils/tooltip.js.map +0 -7
- package/dist/utils/traffic.js +0 -2
- package/dist/utils/traffic.js.map +0 -7
- package/dist/utils/traverse.js +0 -2
- package/dist/utils/traverse.js.map +0 -7
- package/dist/utils/treeGeometry.js +0 -2
- package/dist/utils/treeGeometry.js.map +0 -7
- package/dist/utils/triangulate.js +0 -2
- package/dist/utils/triangulate.js.map +0 -7
- package/dist/utils/tripsAt.js +0 -2
- package/dist/utils/tripsAt.js.map +0 -7
- package/dist/utils/types.js +0 -2
- package/dist/utils/types.js.map +0 -7
- package/dist/utils/underEntry.js +0 -2
- package/dist/utils/underEntry.js.map +0 -7
- package/dist/utils/update.js +0 -2
- package/dist/utils/update.js.map +0 -7
- package/dist/utils/updateArea.js +0 -2
- package/dist/utils/updateArea.js.map +0 -7
- package/dist/utils/updateCamera.js +0 -2
- package/dist/utils/updateCamera.js.map +0 -7
- package/dist/utils/updatePointLights.js +0 -2
- package/dist/utils/updatePointLights.js.map +0 -7
- package/dist/utils/updateWorldMatrix.js +0 -2
- package/dist/utils/updateWorldMatrix.js.map +0 -7
- package/dist/utils/vehicleOffsets.js +0 -2
- package/dist/utils/vehicleOffsets.js.map +0 -7
- package/dist/utils/vehicles.js +0 -2
- package/dist/utils/vehicles.js.map +0 -7
- package/dist/utils/vertexNormals.js +0 -2
- package/dist/utils/vertexNormals.js.map +0 -7
- package/dist/utils/walk.js +0 -2
- package/dist/utils/walk.js.map +0 -7
- package/dist/utils/white.js +0 -2
- package/dist/utils/white.js.map +0 -7
- package/dist/utils/worldLights.js +0 -2
- package/dist/utils/worldLights.js.map +0 -7
- package/dist/utils/wrap.js +0 -2
- package/dist/utils/wrap.js.map +0 -7
- package/src/utils/CELL.js +0 -4
- package/src/utils/addBridges.js +0 -66
- package/src/utils/addRasterTile.js +0 -112
- package/src/utils/along.js +0 -9
- package/src/utils/atmosphere.js +0 -20
- package/src/utils/attach.js +0 -255
- package/src/utils/bindSunlight.js +0 -12
- package/src/utils/box.js +0 -1
- package/src/utils/bridgeElevation.js +0 -18
- package/src/utils/build.js +0 -20
- package/src/utils/cameraControls.js +0 -287
- package/src/utils/collider.js +0 -62
- package/src/utils/colliders.js +0 -2
- package/src/utils/computeBounds.js +0 -17
- package/src/utils/conformModelToTerrain.js +0 -69
- package/src/utils/createMesh.js +0 -31
- package/src/utils/createProgram.js +0 -92
- package/src/utils/decodeDirectory.js +0 -40
- package/src/utils/decodeHeader.js +0 -15
- package/src/utils/decodeModel.js +0 -43
- package/src/utils/decompress.js +0 -5
- package/src/utils/destroyTexture.js +0 -7
- package/src/utils/disposeMesh.js +0 -13
- package/src/utils/drawGeometry.js +0 -122
- package/src/utils/elevationWGSL.js +0 -27
- package/src/utils/emptyNode.js +0 -9
- package/src/utils/endZoom.js +0 -15
- package/src/utils/findFeature.js +0 -49
- package/src/utils/geometry.js +0 -2
- package/src/utils/getElevation.js +0 -10
- package/src/utils/getHeader.js +0 -9
- package/src/utils/getZxy.js +0 -76
- package/src/utils/glass.js +0 -1
- package/src/utils/hit.js +0 -41
- package/src/utils/horizontalPosition.js +0 -16
- package/src/utils/hull.js +0 -1
- package/src/utils/initSunlight.js +0 -9
- package/src/utils/initTerrain.js +0 -19
- package/src/utils/initTraffic.js +0 -93
- package/src/utils/initWalk.js +0 -72
- package/src/utils/intersectMeshes.js +0 -121
- package/src/utils/isClockWise.js +0 -12
- package/src/utils/lampPostGeometry.js +0 -26
- package/src/utils/lightGeometry.js +0 -22
- package/src/utils/lightGrid.js +0 -50
- package/src/utils/limbs.js +0 -9
- package/src/utils/loadModel.js +0 -217
- package/src/utils/loadSource.js +0 -17
- package/src/utils/loadTerrain.js +0 -65
- package/src/utils/mapCamera.js +0 -432
- package/src/utils/materialShaders.js +0 -243
- package/src/utils/mirror.js +0 -6
- package/src/utils/moonPosition.js +0 -17
- package/src/utils/nativeEvents.js +0 -77
- package/src/utils/nativeGeometry.js +0 -131
- package/src/utils/nativeLayer.js +0 -317
- package/src/utils/nodeMatrix.js +0 -22
- package/src/utils/onAdd3DLayer.js +0 -31
- package/src/utils/onAddSun.js +0 -147
- package/src/utils/onClick.js +0 -13
- package/src/utils/onMapChange.js +0 -16
- package/src/utils/onPMTileAdd.js +0 -15
- package/src/utils/onPMTileRemove.js +0 -8
- package/src/utils/onPointerLeave.js +0 -11
- package/src/utils/onPointerMove.js +0 -15
- package/src/utils/onRemove3DLayer.js +0 -78
- package/src/utils/onRemoveSun.js +0 -3
- package/src/utils/onTerrainAdd.js +0 -18
- package/src/utils/onTerrainChange.js +0 -13
- package/src/utils/onTerrainRemove.js +0 -40
- package/src/utils/onZoomAnim.js +0 -14
- package/src/utils/parts.js +0 -16
- package/src/utils/projectCelestialBody.js +0 -13
- package/src/utils/pump.js +0 -226
- package/src/utils/rasterTiles.js +0 -285
- package/src/utils/raycast.js +0 -60
- package/src/utils/read.js +0 -29
- package/src/utils/readAccessor.js +0 -68
- package/src/utils/releaseArea.js +0 -34
- package/src/utils/removeRasterTile.js +0 -13
- package/src/utils/render.js +0 -406
- package/src/utils/renderSunlight.js +0 -170
- package/src/utils/resizeSunlight.js +0 -15
- package/src/utils/roofCoverage.js +0 -47
- package/src/utils/routeGeometry.js +0 -22
- package/src/utils/scheduledTrips.js +0 -29
- package/src/utils/setGeoJSONData.js +0 -11
- package/src/utils/setHighlight.js +0 -13
- package/src/utils/setPMTileOpacity.js +0 -7
- package/src/utils/setPMTileZIndex.js +0 -7
- package/src/utils/setTerrainHeight.js +0 -10
- package/src/utils/setVertexColor.js +0 -14
- package/src/utils/showFeature.js +0 -27
- package/src/utils/sizes.js +0 -1
- package/src/utils/skin.js +0 -2
- package/src/utils/solarPosition.js +0 -17
- package/src/utils/sortMeshes.js +0 -12
- package/src/utils/startZoom.js +0 -5
- package/src/utils/terrainAtlas.js +0 -21
- package/src/utils/terrainElevation.js +0 -20
- package/src/utils/terrainGrid.js +0 -23
- package/src/utils/textureSampler.js +0 -10
- package/src/utils/tileId.js +0 -18
- package/src/utils/toLanes.js +0 -7
- package/src/utils/tooltip.js +0 -6
- package/src/utils/traffic.js +0 -315
- package/src/utils/traverse.js +0 -6
- package/src/utils/treeGeometry.js +0 -45
- package/src/utils/triangulate.js +0 -100
- package/src/utils/tripsAt.js +0 -16
- package/src/utils/underEntry.js +0 -17
- package/src/utils/update.js +0 -18
- package/src/utils/updateArea.js +0 -40
- package/src/utils/updateCamera.js +0 -32
- package/src/utils/updatePointLights.js +0 -38
- package/src/utils/updateWorldMatrix.js +0 -47
- package/src/utils/vehicleOffsets.js +0 -8
- package/src/utils/vehicles.js +0 -65
- package/src/utils/vertexNormals.js +0 -30
- package/src/utils/walk.js +0 -187
- package/src/utils/worldLights.js +0 -25
- /package/src/{utils → collision}/horizontalRay.js +0 -0
- /package/src/{utils → globals}/headlight.js +0 -0
- /package/src/{utils → globals}/moves.js +0 -0
- /package/src/{utils → globals}/paints.js +0 -0
- /package/src/{utils → globals}/renderers.js +0 -0
- /package/src/{utils → globals}/speed.js +0 -0
- /package/src/{utils → globals}/taillight.js +0 -0
- /package/src/{utils → globals}/types.js +0 -0
- /package/src/{utils → globals}/white.js +0 -0
- /package/src/{utils → scene}/setParent.js +0 -0
|
@@ -0,0 +1,1128 @@
|
|
|
1
|
+
// Leaflet-compatible classes backed by OpenLayers. Load after ol.js and before the plugin.
|
|
2
|
+
(() => {
|
|
3
|
+
if (!window.ol) throw new Error('Unable to load OpenLayers');
|
|
4
|
+
|
|
5
|
+
const style = document.createElement('style');
|
|
6
|
+
style.dataset.openlayersBindings = '';
|
|
7
|
+
style.textContent = `
|
|
8
|
+
.openlayers-city-mapper {
|
|
9
|
+
position: relative;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
touch-action: none;
|
|
12
|
+
}
|
|
13
|
+
.ol-viewport {
|
|
14
|
+
position: absolute !important;
|
|
15
|
+
inset: 0;
|
|
16
|
+
}
|
|
17
|
+
.ol-overlaycontainer-stopevent { z-index: 1000 !important; }
|
|
18
|
+
.ol-city-corner {
|
|
19
|
+
position: absolute;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
gap: .5em;
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
.ol-city-topleft { top: 5em; left: .5em; }
|
|
26
|
+
.ol-city-topright { top: 10px; right: 10px; }
|
|
27
|
+
.ol-city-bottomleft { bottom: .5em; left: .5em; }
|
|
28
|
+
.ol-city-bottomright { bottom: 4em; right: .5em; }
|
|
29
|
+
.ol-attribution {
|
|
30
|
+
text-align: justify;
|
|
31
|
+
border-radius: 0 !important;
|
|
32
|
+
left: 0;
|
|
33
|
+
right: 0 !important;
|
|
34
|
+
max-width: unset;
|
|
35
|
+
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
|
|
36
|
+
font-size: .75rem;
|
|
37
|
+
line-height: 1.5;
|
|
38
|
+
}
|
|
39
|
+
.ol-attribution a { color: #0078A8; }
|
|
40
|
+
.ol-attribution * { text-shadow: none !important; }
|
|
41
|
+
.ol-city-control {
|
|
42
|
+
position: static;
|
|
43
|
+
pointer-events: auto;
|
|
44
|
+
font: 13px/1.5 sans-serif;
|
|
45
|
+
}
|
|
46
|
+
.ol-city-rotate {
|
|
47
|
+
padding: 0;
|
|
48
|
+
border: 1px solid #0003;
|
|
49
|
+
border-radius: 4px;
|
|
50
|
+
background: #fff;
|
|
51
|
+
background-clip: padding-box;
|
|
52
|
+
}
|
|
53
|
+
.ol-city-rotate a {
|
|
54
|
+
display: block;
|
|
55
|
+
width: 30px;
|
|
56
|
+
height: 30px;
|
|
57
|
+
border-radius: 2px;
|
|
58
|
+
color: #000;
|
|
59
|
+
text-decoration: none;
|
|
60
|
+
}
|
|
61
|
+
.ol-city-rotate a:hover { background: #f4f4f4; }
|
|
62
|
+
.ol-city-rotate a:focus-visible { outline: 2px solid #2675c9; }
|
|
63
|
+
.ol-city-layers {
|
|
64
|
+
max-height: calc(100vh - 5em);
|
|
65
|
+
overflow: auto;
|
|
66
|
+
border-radius: 4px;
|
|
67
|
+
}
|
|
68
|
+
.ol-city-layers section { padding: .5em; background: var(--ol-background-color); }
|
|
69
|
+
.ol-city-layers label { display: block; cursor: pointer; white-space: nowrap; }
|
|
70
|
+
.ol-city-layers input { vertical-align: middle; }
|
|
71
|
+
.ol-city-layers hr { border: 0; border-top: 1px solid #ccc; }
|
|
72
|
+
.ol-city-layers .ol-control { background: transparent; }
|
|
73
|
+
.ol-city-layers .sunlight-time button { width: auto; padding: 0 .4em; flex-shrink: 0; }
|
|
74
|
+
.openlayers-city-mapper .leaflet-pane {
|
|
75
|
+
position: absolute;
|
|
76
|
+
inset: 0;
|
|
77
|
+
pointer-events: none;
|
|
78
|
+
}
|
|
79
|
+
.ol-zoom button { width: 30px; height: 30px; }
|
|
80
|
+
.openlayers-city-mapper .leaflet-marker-icon,
|
|
81
|
+
.openlayers-city-mapper .leaflet-marker-shadow {
|
|
82
|
+
position: absolute;
|
|
83
|
+
top: 0;
|
|
84
|
+
left: 0;
|
|
85
|
+
}
|
|
86
|
+
.openlayers-city-mapper .leaflet-marker-icon { pointer-events: auto; cursor: pointer; }
|
|
87
|
+
.openlayers-city-mapper .leaflet-div-icon { background: #fff; border: 1px solid #666; }
|
|
88
|
+
.ol-city-popup {
|
|
89
|
+
padding: 10px;
|
|
90
|
+
background: white;
|
|
91
|
+
border: 1px solid #888;
|
|
92
|
+
border-radius: 4px;
|
|
93
|
+
font: 14px sans-serif;
|
|
94
|
+
}
|
|
95
|
+
.ol-city-popup button { float: right; margin-left: 12px; }
|
|
96
|
+
.ol-city-tooltip {
|
|
97
|
+
position: absolute;
|
|
98
|
+
z-index: 1100;
|
|
99
|
+
padding: 4px 8px;
|
|
100
|
+
background: white;
|
|
101
|
+
border: 1px solid #888;
|
|
102
|
+
pointer-events: none;
|
|
103
|
+
}
|
|
104
|
+
`;
|
|
105
|
+
document.head.appendChild(style);
|
|
106
|
+
|
|
107
|
+
const L = window.L = { version: '1.9.4-openlayers', control: {} };
|
|
108
|
+
let lastId = 0;
|
|
109
|
+
const stamp = object => object._leaflet_id ||= ++lastId;
|
|
110
|
+
const setOptions = (object, options) => object.options = { ...object.options, ...options };
|
|
111
|
+
const zoomTiming = new Animation(new KeyframeEffect(null, [], {
|
|
112
|
+
duration: 1, fill: 'both', easing: 'cubic-bezier(0,0,0.25,1)',
|
|
113
|
+
}));
|
|
114
|
+
|
|
115
|
+
function Class(...args) {
|
|
116
|
+
this.initialize?.(...args);
|
|
117
|
+
this.callInitHooks();
|
|
118
|
+
}
|
|
119
|
+
Class.extend = function (properties) {
|
|
120
|
+
function Child(...args) {
|
|
121
|
+
this.initialize?.(...args);
|
|
122
|
+
this.callInitHooks();
|
|
123
|
+
}
|
|
124
|
+
Object.setPrototypeOf(Child, this);
|
|
125
|
+
Child.prototype = Object.create(this.prototype);
|
|
126
|
+
Object.assign(Child.prototype, properties, { constructor: Child });
|
|
127
|
+
Child.prototype.options = { ...this.prototype.options, ...properties.options };
|
|
128
|
+
Child.prototype._initHooks = [];
|
|
129
|
+
return Child;
|
|
130
|
+
};
|
|
131
|
+
Class.include = function (properties) { Object.assign(this.prototype, properties); return this; };
|
|
132
|
+
Class.mergeOptions = function (options) {
|
|
133
|
+
this.prototype.options = { ...this.prototype.options, ...options };
|
|
134
|
+
return this;
|
|
135
|
+
};
|
|
136
|
+
Class.addInitHook = function (hook, ...args) {
|
|
137
|
+
if (!Object.hasOwn(this.prototype, '_initHooks')) this.prototype._initHooks = [];
|
|
138
|
+
this.prototype._initHooks.push(typeof hook === 'function' ? hook : function () { this[hook](...args); });
|
|
139
|
+
return this;
|
|
140
|
+
};
|
|
141
|
+
Class.prototype.callInitHooks = function () {
|
|
142
|
+
if (this._initHooksCalled) return;
|
|
143
|
+
this._initHooksCalled = true;
|
|
144
|
+
const prototypes = [];
|
|
145
|
+
for (let proto = Object.getPrototypeOf(this); proto; proto = Object.getPrototypeOf(proto)) prototypes.unshift(proto);
|
|
146
|
+
for (const proto of prototypes) {
|
|
147
|
+
if (Object.hasOwn(proto, '_initHooks')) for (const hook of proto._initHooks) hook.call(this);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
L.Evented = Class.extend({
|
|
151
|
+
on(types, fn, context) {
|
|
152
|
+
if (typeof types === 'object') {
|
|
153
|
+
for (const [type, handler] of Object.entries(types)) this.on(type, handler, fn);
|
|
154
|
+
} else {
|
|
155
|
+
this._events ||= {};
|
|
156
|
+
for (const type of types.split(/\s+/)) {
|
|
157
|
+
const events = this._events[type] ||= [];
|
|
158
|
+
if (!events.some(event => event.fn === fn && event.context === context)) events.push({ fn, context });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return this;
|
|
162
|
+
},
|
|
163
|
+
off(types, fn, context) {
|
|
164
|
+
if (!types) this._events = {};
|
|
165
|
+
else if (typeof types === 'object') {
|
|
166
|
+
for (const [type, handler] of Object.entries(types)) this.off(type, handler, fn);
|
|
167
|
+
} else {
|
|
168
|
+
for (const type of types.split(/\s+/)) {
|
|
169
|
+
if (this._events?.[type]) this._events[type] = fn
|
|
170
|
+
? this._events[type].filter(event => event.fn !== fn || event.context !== context) : [];
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return this;
|
|
174
|
+
},
|
|
175
|
+
once(types, fn, context) {
|
|
176
|
+
const handler = event => { this.off(types, handler); fn.call(context || this, event); };
|
|
177
|
+
return this.on(types, handler);
|
|
178
|
+
},
|
|
179
|
+
fire(type, data) {
|
|
180
|
+
for (const event of [...this._events?.[type] || []]) {
|
|
181
|
+
event.fn.call(event.context || this, { ...data, type, target: this, sourceTarget: this });
|
|
182
|
+
}
|
|
183
|
+
return this;
|
|
184
|
+
},
|
|
185
|
+
listens(type) { return Boolean(this._events?.[type]?.length); },
|
|
186
|
+
});
|
|
187
|
+
L.Util = {
|
|
188
|
+
stamp, setOptions,
|
|
189
|
+
throttle(fn, interval, context) {
|
|
190
|
+
let timer, pending;
|
|
191
|
+
const run = (...args) => {
|
|
192
|
+
if (timer) { pending = args; return; }
|
|
193
|
+
fn.apply(context, args);
|
|
194
|
+
timer = setTimeout(() => {
|
|
195
|
+
timer = null;
|
|
196
|
+
if (pending) { const args = pending; pending = null; run(...args); }
|
|
197
|
+
}, interval);
|
|
198
|
+
};
|
|
199
|
+
return run;
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
L.Point = function (x, y, round) {
|
|
204
|
+
this.x = round ? Math.round(x) : x;
|
|
205
|
+
this.y = round ? Math.round(y) : y;
|
|
206
|
+
};
|
|
207
|
+
const point = value => value instanceof L.Point ? value
|
|
208
|
+
: Array.isArray(value) ? new L.Point(...value) : new L.Point(value.x, value.y);
|
|
209
|
+
L.Point.prototype = {
|
|
210
|
+
clone() { return new L.Point(this.x, this.y); },
|
|
211
|
+
add(value) { return this.clone()._add(point(value)); },
|
|
212
|
+
_add(value) { this.x += value.x; this.y += value.y; return this; },
|
|
213
|
+
subtract(value) { return this.clone()._subtract(point(value)); },
|
|
214
|
+
_subtract(value) { this.x -= value.x; this.y -= value.y; return this; },
|
|
215
|
+
multiplyBy(value) { return new L.Point(this.x * value, this.y * value); },
|
|
216
|
+
divideBy(value) { return new L.Point(this.x / value, this.y / value); },
|
|
217
|
+
scaleBy(value) { return new L.Point(this.x * value.x, this.y * value.y); },
|
|
218
|
+
unscaleBy(value) { return new L.Point(this.x / value.x, this.y / value.y); },
|
|
219
|
+
round() { return new L.Point(Math.round(this.x), Math.round(this.y)); },
|
|
220
|
+
floor() { return new L.Point(Math.floor(this.x), Math.floor(this.y)); },
|
|
221
|
+
ceil() { return new L.Point(Math.ceil(this.x), Math.ceil(this.y)); },
|
|
222
|
+
distanceTo(value) { value = point(value); return Math.hypot(this.x - value.x, this.y - value.y); },
|
|
223
|
+
equals(value) { value = point(value); return this.x === value.x && this.y === value.y; },
|
|
224
|
+
contains(value) { value = point(value); return Math.abs(value.x) <= Math.abs(this.x) && Math.abs(value.y) <= Math.abs(this.y); },
|
|
225
|
+
};
|
|
226
|
+
L.LatLng = function (lat, lng, alt) {
|
|
227
|
+
if (!Number.isFinite(Number(lat)) || !Number.isFinite(Number(lng))) throw new Error('Invalid LatLng');
|
|
228
|
+
this.lat = Number(lat); this.lng = Number(lng);
|
|
229
|
+
if (alt !== undefined) this.alt = alt;
|
|
230
|
+
};
|
|
231
|
+
const latLng = value => value instanceof L.LatLng ? value
|
|
232
|
+
: Array.isArray(value) ? new L.LatLng(...value) : new L.LatLng(value.lat, value.lng);
|
|
233
|
+
L.LatLng.prototype = {
|
|
234
|
+
equals(value, margin = 1e-9) {
|
|
235
|
+
value = latLng(value);
|
|
236
|
+
return Math.max(Math.abs(this.lat - value.lat), Math.abs(this.lng - value.lng)) <= margin;
|
|
237
|
+
},
|
|
238
|
+
distanceTo(value) { value = latLng(value); return ol.sphere.getDistance([this.lng, this.lat], [value.lng, value.lat]); },
|
|
239
|
+
wrap() { return new L.LatLng(this.lat, ((this.lng + 180) % 360 + 360) % 360 - 180, this.alt); },
|
|
240
|
+
};
|
|
241
|
+
L.Bounds = function (a, b) {
|
|
242
|
+
if (a) for (const value of b ? [a, b] : Array.isArray(a) ? a : [a]) this.extend(value);
|
|
243
|
+
};
|
|
244
|
+
L.Bounds.prototype = {
|
|
245
|
+
extend(value) {
|
|
246
|
+
if (value instanceof L.Bounds) { this.extend(value.min); this.extend(value.max); return this; }
|
|
247
|
+
value = point(value);
|
|
248
|
+
if (!this.min) { this.min = value.clone(); this.max = value.clone(); }
|
|
249
|
+
else {
|
|
250
|
+
this.min.x = Math.min(this.min.x, value.x); this.min.y = Math.min(this.min.y, value.y);
|
|
251
|
+
this.max.x = Math.max(this.max.x, value.x); this.max.y = Math.max(this.max.y, value.y);
|
|
252
|
+
}
|
|
253
|
+
return this;
|
|
254
|
+
},
|
|
255
|
+
getCenter() { return this.min.add(this.max).divideBy(2); },
|
|
256
|
+
getSize() { return this.max.subtract(this.min); },
|
|
257
|
+
contains(value) {
|
|
258
|
+
const min = value.min || point(value), max = value.max || min;
|
|
259
|
+
return min.x >= this.min.x && max.x <= this.max.x && min.y >= this.min.y && max.y <= this.max.y;
|
|
260
|
+
},
|
|
261
|
+
intersects(value) {
|
|
262
|
+
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;
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
L.LatLngBounds = function (a, b) {
|
|
266
|
+
if (a) for (const value of b ? [a, b] : a) this.extend(value);
|
|
267
|
+
};
|
|
268
|
+
L.LatLngBounds.prototype = {
|
|
269
|
+
extend(value) {
|
|
270
|
+
if (value instanceof L.LatLngBounds) { this.extend(value._southWest); this.extend(value._northEast); return this; }
|
|
271
|
+
value = latLng(value);
|
|
272
|
+
if (!this._southWest) {
|
|
273
|
+
this._southWest = new L.LatLng(value.lat, value.lng);
|
|
274
|
+
this._northEast = new L.LatLng(value.lat, value.lng);
|
|
275
|
+
} else {
|
|
276
|
+
this._southWest.lat = Math.min(this._southWest.lat, value.lat);
|
|
277
|
+
this._southWest.lng = Math.min(this._southWest.lng, value.lng);
|
|
278
|
+
this._northEast.lat = Math.max(this._northEast.lat, value.lat);
|
|
279
|
+
this._northEast.lng = Math.max(this._northEast.lng, value.lng);
|
|
280
|
+
}
|
|
281
|
+
return this;
|
|
282
|
+
},
|
|
283
|
+
getSouthWest() { return this._southWest; },
|
|
284
|
+
getNorthEast() { return this._northEast; },
|
|
285
|
+
getNorthWest() { return new L.LatLng(this.getNorth(), this.getWest()); },
|
|
286
|
+
getSouthEast() { return new L.LatLng(this.getSouth(), this.getEast()); },
|
|
287
|
+
getNorth() { return this._northEast.lat; },
|
|
288
|
+
getSouth() { return this._southWest.lat; },
|
|
289
|
+
getEast() { return this._northEast.lng; },
|
|
290
|
+
getWest() { return this._southWest.lng; },
|
|
291
|
+
getCenter() { return new L.LatLng((this.getNorth() + this.getSouth()) / 2, (this.getEast() + this.getWest()) / 2); },
|
|
292
|
+
contains(value) {
|
|
293
|
+
value = latLng(value);
|
|
294
|
+
return value.lat >= this.getSouth() && value.lat <= this.getNorth() && value.lng >= this.getWest() && value.lng <= this.getEast();
|
|
295
|
+
},
|
|
296
|
+
isValid() { return Boolean(this._southWest && this._northEast); },
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const radius = 6378137, circumference = 2 * Math.PI * radius;
|
|
300
|
+
const crs = {
|
|
301
|
+
scale: zoom => 256 * 2 ** zoom,
|
|
302
|
+
zoom: scale => Math.log2(scale / 256),
|
|
303
|
+
project(value) { value = latLng(value); return point(ol.proj.fromLonLat([value.lng, Math.max(-85.0511287798, Math.min(85.0511287798, value.lat))])); },
|
|
304
|
+
unproject(value) { const [lng, lat] = ol.proj.toLonLat([value.x, value.y]); return new L.LatLng(lat, lng); },
|
|
305
|
+
transformation: {
|
|
306
|
+
transform(value, scale) { return new L.Point((value.x / circumference + 0.5) * scale, (0.5 - value.y / circumference) * scale); },
|
|
307
|
+
untransform(value, scale) { return new L.Point((value.x / scale - 0.5) * circumference, (0.5 - value.y / scale) * circumference); },
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
L.DomUtil = {
|
|
312
|
+
create(tag, className = '', parent) {
|
|
313
|
+
const element = document.createElement(tag);
|
|
314
|
+
element.className = className; parent?.append(element); return element;
|
|
315
|
+
},
|
|
316
|
+
setPosition(element, value) { element._leaflet_pos = point(value); element.style.transform = `translate(${value.x}px,${value.y}px)`; },
|
|
317
|
+
getPosition(element) { return element._leaflet_pos || new L.Point(0, 0); },
|
|
318
|
+
};
|
|
319
|
+
const domListeners = new WeakMap();
|
|
320
|
+
function domEvent(add, element, types, fn, context) {
|
|
321
|
+
if (typeof types === 'object') {
|
|
322
|
+
for (const [type, handler] of Object.entries(types)) domEvent(add, element, type, handler, fn);
|
|
323
|
+
return L.DomEvent;
|
|
324
|
+
}
|
|
325
|
+
let listeners = domListeners.get(element);
|
|
326
|
+
if (!listeners) domListeners.set(element, listeners = []);
|
|
327
|
+
for (const type of types.split(/\s+/)) {
|
|
328
|
+
const existing = listeners.find(item => item.type === type && item.fn === fn && item.context === context);
|
|
329
|
+
if (add && !existing) {
|
|
330
|
+
const handler = context ? fn.bind(context) : fn;
|
|
331
|
+
listeners.push({ type, fn, context, handler });
|
|
332
|
+
element.addEventListener(type, handler, { passive: false });
|
|
333
|
+
} else if (!add && existing) {
|
|
334
|
+
element.removeEventListener(type, existing.handler);
|
|
335
|
+
listeners.splice(listeners.indexOf(existing), 1);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return L.DomEvent;
|
|
339
|
+
}
|
|
340
|
+
const stopPropagation = event => event.stopPropagation();
|
|
341
|
+
L.DomEvent = {
|
|
342
|
+
on: (...args) => domEvent(true, ...args),
|
|
343
|
+
off: (...args) => domEvent(false, ...args),
|
|
344
|
+
stop(event) { event.preventDefault(); event.stopPropagation(); },
|
|
345
|
+
disableClickPropagation(element) {
|
|
346
|
+
element.classList.add('leaflet-control');
|
|
347
|
+
L.DomEvent.on(element, 'click dblclick pointerdown mousedown touchstart contextmenu', stopPropagation);
|
|
348
|
+
return this;
|
|
349
|
+
},
|
|
350
|
+
disableScrollPropagation(element) { return this.on(element, 'wheel', stopPropagation); },
|
|
351
|
+
};
|
|
352
|
+
L.Handler = Class.extend({
|
|
353
|
+
initialize(map) { this._map = map; },
|
|
354
|
+
enable() { if (!this._enabled) { this._enabled = true; this.addHooks?.(); } return this; },
|
|
355
|
+
disable() { if (this._enabled) { this._enabled = false; this.removeHooks?.(); } return this; },
|
|
356
|
+
enabled() { return Boolean(this._enabled); },
|
|
357
|
+
moving() { return Boolean(this._moving); },
|
|
358
|
+
});
|
|
359
|
+
L.Layer = L.Evented.extend({
|
|
360
|
+
initialize(options) { setOptions(this, options); },
|
|
361
|
+
addTo(map) { map.addLayer(this); return this; },
|
|
362
|
+
remove() { return this.removeFrom(this._map || this._mapToAdd); },
|
|
363
|
+
removeFrom(map) { map?.removeLayer(this); return this; },
|
|
364
|
+
getAttribution() { return this.options.attribution; },
|
|
365
|
+
getPane(name) { return this._map.getPane(name || this.options.pane); },
|
|
366
|
+
_layerAdd({ target: map }) {
|
|
367
|
+
if (!map.hasLayer(this)) return;
|
|
368
|
+
this._map = map;
|
|
369
|
+
if (this.getEvents) { this._mapEvents = this.getEvents(); map.on(this._mapEvents, this); }
|
|
370
|
+
this.onAdd?.(map);
|
|
371
|
+
this.fire('add'); map.fire('layeradd', { layer: this });
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
L.LayerGroup = L.Layer.extend({
|
|
375
|
+
initialize(layers = [], options) {
|
|
376
|
+
setOptions(this, options); this._layers = {};
|
|
377
|
+
for (const layer of layers) this.addLayer(layer);
|
|
378
|
+
},
|
|
379
|
+
addLayer(layer) { this._layers[stamp(layer)] = layer; this._map?.addLayer(layer); return this; },
|
|
380
|
+
removeLayer(layer) { delete this._layers[stamp(layer)]; this._map?.removeLayer(layer); return this; },
|
|
381
|
+
hasLayer(layer) { return stamp(layer) in this._layers; },
|
|
382
|
+
eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },
|
|
383
|
+
onAdd(map) { this.eachLayer(map.addLayer, map); },
|
|
384
|
+
onRemove(map) { this.eachLayer(map.removeLayer, map); },
|
|
385
|
+
});
|
|
386
|
+
// Declare the hierarchy before the plugin installs its instanceof checks and hooks.
|
|
387
|
+
for (const [name, parent] of [
|
|
388
|
+
['GridLayer', L.Layer], ['Marker', L.Layer], ['Path', L.Layer],
|
|
389
|
+
['Polyline', null], ['Polygon', null], ['CircleMarker', null], ['Circle', null],
|
|
390
|
+
['ImageOverlay', L.Layer], ['VideoOverlay', null], ['SVGOverlay', null],
|
|
391
|
+
['Popup', L.Layer], ['Tooltip', L.Layer], ['DivIcon', Class],
|
|
392
|
+
]) {
|
|
393
|
+
const base = parent || ({ Polyline: L.Path, Polygon: L.Polyline, CircleMarker: L.Path,
|
|
394
|
+
Circle: L.CircleMarker, VideoOverlay: L.ImageOverlay, SVGOverlay: L.ImageOverlay })[name];
|
|
395
|
+
L[name] = base.extend({
|
|
396
|
+
initialize() { throw new Error(`L.${name} is not supported by the OpenLayers bindings; use L.Layer with a source`); },
|
|
397
|
+
getEvents() { return {}; },
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
L.Map = L.Evented.extend({
|
|
402
|
+
options: { crs, minZoom: 0, maxZoom: 24, zoomSnap: 1, touchZoom: true,
|
|
403
|
+
scrollWheelZoom: true, keyboard: true, doubleClickZoom: true,
|
|
404
|
+
wheelDebounceTime: 40, wheelPxPerZoomLevel: 60 },
|
|
405
|
+
initialize(target, options) {
|
|
406
|
+
setOptions(this, options);
|
|
407
|
+
this._container = typeof target === 'string' ? document.getElementById(target) : target;
|
|
408
|
+
if (!this._container) throw new Error('Map container not found');
|
|
409
|
+
stamp(this._container);
|
|
410
|
+
this._container.classList.add('openlayers-city-mapper');
|
|
411
|
+
this._layers = {}; this._panes = {}; this._handlers = []; this._controls = new Set();
|
|
412
|
+
const center = crs.project(this.options.center || [0, 0]);
|
|
413
|
+
this.ol = new ol.Map({
|
|
414
|
+
target: this._container, controls: [new ol.control.Zoom(), new ol.control.Attribution({collapsible: false })],
|
|
415
|
+
interactions: [],
|
|
416
|
+
view: new ol.View({ center: [center.x, center.y], zoom: this.options.zoom || 0,
|
|
417
|
+
minZoom: this.getMinZoom(), maxZoom: this.getMaxZoom() }),
|
|
418
|
+
});
|
|
419
|
+
for (const control of this.ol.getControls().getArray()) {
|
|
420
|
+
control.element.classList.add('leaflet-control');
|
|
421
|
+
for (const button of control.element.querySelectorAll('button[title]')) button.setAttribute('aria-label', button.title);
|
|
422
|
+
if (control instanceof ol.control.Zoom) {
|
|
423
|
+
for (const [selector, delta] of [['.ol-zoom-in', 1], ['.ol-zoom-out', -1]]) {
|
|
424
|
+
control.element.querySelector(selector).addEventListener('click', event => {
|
|
425
|
+
L.DomEvent.stop(event);
|
|
426
|
+
event.stopImmediatePropagation();
|
|
427
|
+
this._zoomBy(delta * (event.shiftKey ? 3 : 1));
|
|
428
|
+
}, true);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
this._loaded = true;
|
|
433
|
+
this._zoomAnimated = false;
|
|
434
|
+
this.dragging = new L.Handler(this).enable();
|
|
435
|
+
this.touchZoom = new L.Handler(this);
|
|
436
|
+
if (this.options.touchZoom) this.touchZoom.enable();
|
|
437
|
+
this._handlers.push(this.dragging, this.touchZoom);
|
|
438
|
+
for (const name of ['scrollWheelZoom', 'keyboard', 'doubleClickZoom']) this.addHandler(name, L.Handler);
|
|
439
|
+
if (!this._container.hasAttribute('tabindex')) this._container.tabIndex = 0;
|
|
440
|
+
const view = this.ol.getView();
|
|
441
|
+
this._viewZoom = view.getZoom();
|
|
442
|
+
view.on(['change:center', 'change:resolution'], () => {
|
|
443
|
+
if (this._settingView) return;
|
|
444
|
+
const zoomChanged = view.getZoom() !== this._viewZoom;
|
|
445
|
+
if (!this._viewMoving) { this._viewMoving = true; this.fire('movestart'); }
|
|
446
|
+
if (zoomChanged && !this._viewZooming) { this._viewZooming = true; this.fire('zoomstart'); }
|
|
447
|
+
this.fire('move');
|
|
448
|
+
if (zoomChanged) this.fire('zoom');
|
|
449
|
+
this._viewZoom = view.getZoom();
|
|
450
|
+
if (!view.getAnimating() && !view.getInteracting()) this._endViewChange();
|
|
451
|
+
});
|
|
452
|
+
this.ol.on('moveend', () => this._endViewChange());
|
|
453
|
+
// OpenLayers interactions need the pitched ground coordinate, not the flat viewport.
|
|
454
|
+
this.ol.getCoordinateFromPixel = pixel => {
|
|
455
|
+
const coordinate = crs.project(this.containerPointToLatLng(point(pixel)));
|
|
456
|
+
return [coordinate.x, coordinate.y];
|
|
457
|
+
};
|
|
458
|
+
this._wheelDelta = 0;
|
|
459
|
+
this.ol.addInteraction(new ol.interaction.Interaction({
|
|
460
|
+
handleEvent: event => {
|
|
461
|
+
const original = event.originalEvent;
|
|
462
|
+
if (original.target.closest('.ol-control')) return true;
|
|
463
|
+
if (event.type === 'dblclick' && this.doubleClickZoom.enabled()) {
|
|
464
|
+
this._zoomBy(original.shiftKey ? -1 : 1, point(event.pixel));
|
|
465
|
+
} else if (event.type === 'wheel' && this.scrollWheelZoom.enabled() && !original.shiftKey) {
|
|
466
|
+
const ratio = window.devicePixelRatio || 1;
|
|
467
|
+
const factor = /Linux/.test(navigator.platform) && /Chrome/.test(navigator.userAgent) ? ratio
|
|
468
|
+
: /Mac/.test(navigator.platform) ? 3 * ratio : 2 * ratio;
|
|
469
|
+
this._wheelDelta -= original.deltaY * (original.deltaMode === 1 ? 20
|
|
470
|
+
: original.deltaMode === 2 ? 60 : 1 / factor);
|
|
471
|
+
this._wheelPixel = point(event.pixel);
|
|
472
|
+
this._wheelStart ??= performance.now();
|
|
473
|
+
clearTimeout(this._wheelTimer);
|
|
474
|
+
this._wheelTimer = setTimeout(() => {
|
|
475
|
+
const magnitude = 4 * Math.log2(2 / (1 + Math.exp(-Math.abs(this._wheelDelta /
|
|
476
|
+
(this.options.wheelPxPerZoomLevel * 4)))));
|
|
477
|
+
const snap = this.options.zoomSnap;
|
|
478
|
+
const delta = Math.sign(this._wheelDelta) * (snap ? Math.ceil(magnitude / snap) * snap : magnitude);
|
|
479
|
+
this._wheelDelta = 0;
|
|
480
|
+
this._wheelStart = null;
|
|
481
|
+
if (this._loaded && this.scrollWheelZoom.enabled()) this._zoomBy(delta,
|
|
482
|
+
this.options.scrollWheelZoom === 'center' ? undefined : this._wheelPixel);
|
|
483
|
+
}, Math.max(0, this.options.wheelDebounceTime - (performance.now() - this._wheelStart)));
|
|
484
|
+
} else return true;
|
|
485
|
+
original.preventDefault();
|
|
486
|
+
return false;
|
|
487
|
+
},
|
|
488
|
+
}));
|
|
489
|
+
this._controlCorners = {};
|
|
490
|
+
for (const position of ['topleft', 'topright', 'bottomleft', 'bottomright']) {
|
|
491
|
+
this._controlCorners[position] = L.DomUtil.create('div',
|
|
492
|
+
`ol-city-corner ol-city-${position}`, this.ol.getOverlayContainerStopEvent());
|
|
493
|
+
}
|
|
494
|
+
const attributionSource = new ol.source.Vector();
|
|
495
|
+
this.ol.addLayer(new ol.layer.Vector({ source: attributionSource }));
|
|
496
|
+
const updateAttribution = () => {
|
|
497
|
+
const values = new Set(['<a href="https://openlayers.org/">OpenLayers</a>']);
|
|
498
|
+
this.eachLayer(layer => { if (layer.getAttribution?.()) values.add(layer.getAttribution()); });
|
|
499
|
+
attributionSource.setAttributions([...values]);
|
|
500
|
+
};
|
|
501
|
+
this.on('layeradd layerremove', updateAttribution);
|
|
502
|
+
updateAttribution();
|
|
503
|
+
let anchor, pointerId;
|
|
504
|
+
const pixel = event => {
|
|
505
|
+
const rect = this._container.getBoundingClientRect();
|
|
506
|
+
return new L.Point(event.clientX - rect.left, event.clientY - rect.top);
|
|
507
|
+
};
|
|
508
|
+
this._onPointer = event => {
|
|
509
|
+
if (event.type === 'pointerdown') {
|
|
510
|
+
if (!this.dragging.enabled() || event.button !== 0 || !event.isPrimary || event.target.closest('.ol-control')) return;
|
|
511
|
+
anchor = this.containerPointToLatLng(pixel(event)); pointerId = event.pointerId;
|
|
512
|
+
this._moved = this.dragging._moving = false;
|
|
513
|
+
this._container.focus({ preventScroll: true });
|
|
514
|
+
this._container.setPointerCapture(pointerId);
|
|
515
|
+
} else if (event.pointerId === pointerId && event.type === 'pointermove' && this.dragging.enabled()) {
|
|
516
|
+
const delta = this.project(anchor).subtract(this.project(this.containerPointToLatLng(pixel(event))));
|
|
517
|
+
if (Math.hypot(delta.x, delta.y) > 1) this._moved = this.dragging._moving = true;
|
|
518
|
+
this.setView(this.unproject(this.project(this.getCenter()).add(delta)), this.getZoom());
|
|
519
|
+
} else if (event.pointerId === pointerId && event.type !== 'pointermove') {
|
|
520
|
+
if (this._container.hasPointerCapture(pointerId)) this._container.releasePointerCapture(pointerId);
|
|
521
|
+
anchor = null; pointerId = null;
|
|
522
|
+
this.dragging._moving = false;
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
this._onKey = event => {
|
|
526
|
+
if (!this.keyboard.enabled() || event.target !== this._container || event.altKey || event.ctrlKey || event.metaKey) return;
|
|
527
|
+
const offsets = { ArrowLeft: [-80, 0], ArrowRight: [80, 0], ArrowUp: [0, -80], ArrowDown: [0, 80] };
|
|
528
|
+
if (offsets[event.key]) this.panBy(offsets[event.key]);
|
|
529
|
+
else if (['+', '=', '-', '_'].includes(event.key)) this._zoomBy(
|
|
530
|
+
(['-', '_'].includes(event.key) ? -1 : 1) * (event.shiftKey ? 3 : 1));
|
|
531
|
+
else return;
|
|
532
|
+
event.preventDefault();
|
|
533
|
+
};
|
|
534
|
+
L.DomEvent.on(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);
|
|
535
|
+
L.DomEvent.on(this._container, 'keydown', this._onKey);
|
|
536
|
+
this.ol.on('change:size', () => this.fire('resize', { newSize: this.getSize() }));
|
|
537
|
+
this.ol.updateSize();
|
|
538
|
+
},
|
|
539
|
+
getContainer() { return this._container; },
|
|
540
|
+
getSize() { return point(this.ol.getSize() || [this._container.clientWidth, this._container.clientHeight]); },
|
|
541
|
+
getCenter() { return crs.unproject(point(this.ol.getView().getCenter())); },
|
|
542
|
+
getZoom() { return this.ol.getView().getZoom(); },
|
|
543
|
+
getMinZoom() { return this.options.minZoom; },
|
|
544
|
+
getMaxZoom() { return this.options.maxZoom; },
|
|
545
|
+
getZoomScale(to, from = this.getZoom()) { return 2 ** (to - from); },
|
|
546
|
+
getScaleZoom(scale, from = this.getZoom()) { return from + Math.log2(scale); },
|
|
547
|
+
_limitZoom(zoom) { return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), zoom)); },
|
|
548
|
+
project(value, zoom = this.getZoom()) { return crs.transformation.transform(crs.project(value), crs.scale(zoom)); },
|
|
549
|
+
unproject(value, zoom = this.getZoom()) { return crs.unproject(crs.transformation.untransform(point(value), crs.scale(zoom))); },
|
|
550
|
+
getPixelOrigin() { return this.project(this.getCenter()).subtract(this.getSize().divideBy(2)); },
|
|
551
|
+
_getMapPanePos() { return new L.Point(0, 0); },
|
|
552
|
+
latLngToLayerPoint(value) { return this.project(value).subtract(this.getPixelOrigin()); },
|
|
553
|
+
layerPointToLatLng(value) { return this.unproject(point(value).add(this.getPixelOrigin())); },
|
|
554
|
+
layerPointToContainerPoint(value) { return point(value).clone(); },
|
|
555
|
+
containerPointToLayerPoint(value) { return point(value).clone(); },
|
|
556
|
+
latLngToContainerPoint(value) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(value)); },
|
|
557
|
+
containerPointToLatLng(value) { return this.layerPointToLatLng(this.containerPointToLayerPoint(value)); },
|
|
558
|
+
getBounds() { return new L.LatLngBounds(this.containerPointToLatLng([0, 0]), this.containerPointToLatLng(this.getSize())); },
|
|
559
|
+
_endViewChange() {
|
|
560
|
+
if (!this._viewMoving) return;
|
|
561
|
+
const zooming = this._viewZooming;
|
|
562
|
+
this._viewMoving = this._viewZooming = false;
|
|
563
|
+
if (zooming) this.fire('zoomend');
|
|
564
|
+
this.fire('moveend');
|
|
565
|
+
},
|
|
566
|
+
_zoomBy(delta, pixel) {
|
|
567
|
+
if (!delta || this.ol.getView().getAnimating()) return this;
|
|
568
|
+
const zoom = this._limitZoom(this.getZoom() + delta);
|
|
569
|
+
return pixel ? this.setZoomAround(pixel, zoom, { animate: true })
|
|
570
|
+
: this.setZoom(zoom, { animate: true });
|
|
571
|
+
},
|
|
572
|
+
setView(center, zoom = this.getZoom(), options = {}) {
|
|
573
|
+
center = latLng(center); zoom = this._limitZoom(zoom);
|
|
574
|
+
if ((options.animate === true || options.zoom?.animate === true) && zoom !== this.getZoom()) {
|
|
575
|
+
const scale = this.getZoomScale(zoom), projected = crs.project(center);
|
|
576
|
+
// Leaflet animates CSS scale, not resolution; convert the same native CSS easing.
|
|
577
|
+
this.ol.getView().animate({
|
|
578
|
+
center: [projected.x, projected.y], zoom, duration: 250,
|
|
579
|
+
easing: time => {
|
|
580
|
+
zoomTiming.currentTime = time;
|
|
581
|
+
const progress = zoomTiming.effect.getComputedTiming().progress;
|
|
582
|
+
return (1 - 1 / (1 + (scale - 1) * progress)) / (1 - 1 / scale);
|
|
583
|
+
},
|
|
584
|
+
});
|
|
585
|
+
return this;
|
|
586
|
+
}
|
|
587
|
+
this.ol.getView().cancelAnimations();
|
|
588
|
+
this._endViewChange();
|
|
589
|
+
const zoomChanged = zoom !== this.getZoom(), moved = !center.equals(this.getCenter());
|
|
590
|
+
if (!zoomChanged && !moved) return this;
|
|
591
|
+
this.fire('movestart');
|
|
592
|
+
if (zoomChanged) this.fire('zoomstart');
|
|
593
|
+
this._settingView = true;
|
|
594
|
+
const projected = crs.project(center);
|
|
595
|
+
this.ol.getView().setCenter([projected.x, projected.y]);
|
|
596
|
+
this.ol.getView().setZoom(zoom);
|
|
597
|
+
this._viewZoom = this.getZoom();
|
|
598
|
+
this._settingView = false;
|
|
599
|
+
if (zoomChanged) this.fire('zoom');
|
|
600
|
+
this.fire('move').fire('viewreset');
|
|
601
|
+
if (zoomChanged) this.fire('zoomend');
|
|
602
|
+
return this.fire('moveend');
|
|
603
|
+
},
|
|
604
|
+
setZoom(zoom, options) { return this.setView(this.getCenter(), zoom, options); },
|
|
605
|
+
panTo(center) { return this.setView(center); },
|
|
606
|
+
panBy(offset) { return this.panTo(this.unproject(this.project(this.getCenter()).add(point(offset)))); },
|
|
607
|
+
setZoomAround(value, zoom, options) {
|
|
608
|
+
const anchor = value instanceof L.Point ? value : this.latLngToContainerPoint(value);
|
|
609
|
+
const half = this.getSize().divideBy(2), scale = this.getZoomScale(zoom);
|
|
610
|
+
return this.setView(this.unproject(this.project(this.getCenter()).add(anchor.subtract(half).multiplyBy(1 - 1 / scale))), zoom, options);
|
|
611
|
+
},
|
|
612
|
+
getBoundsZoom(bounds, inside, padding = [0, 0]) {
|
|
613
|
+
const size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));
|
|
614
|
+
const available = this.getSize().subtract(point(padding));
|
|
615
|
+
const scale = Math[inside ? 'max' : 'min'](available.x / size.x, available.y / size.y);
|
|
616
|
+
return this._limitZoom(this.getScaleZoom(scale));
|
|
617
|
+
},
|
|
618
|
+
_getBoundsCenterZoom(bounds, options = {}) { return { center: bounds.getCenter(), zoom: this.getBoundsZoom(bounds, false, options.padding) }; },
|
|
619
|
+
fitBounds(bounds, options) { const view = this._getBoundsCenterZoom(bounds, options); return this.setView(view.center, view.zoom); },
|
|
620
|
+
_limitCenter(center) { return center; },
|
|
621
|
+
_limitOffset(offset) { return offset; },
|
|
622
|
+
_tryAnimatedPan() { return false; },
|
|
623
|
+
panInside(value) { if (!this.getBounds().contains(value)) this.panTo(value); return this; },
|
|
624
|
+
whenReady(fn, context) { if (this._loaded) fn.call(context || this, { target: this }); else this.once('load', fn, context); return this; },
|
|
625
|
+
addLayer(layer) {
|
|
626
|
+
const id = stamp(layer);
|
|
627
|
+
if (this._layers[id]) return this;
|
|
628
|
+
this._layers[id] = layer; layer._mapToAdd = this;
|
|
629
|
+
layer.beforeAdd?.(this);
|
|
630
|
+
this.whenReady(layer._layerAdd, layer);
|
|
631
|
+
return this;
|
|
632
|
+
},
|
|
633
|
+
removeLayer(layer) {
|
|
634
|
+
if (!this.hasLayer(layer)) return this;
|
|
635
|
+
layer.onRemove?.(this);
|
|
636
|
+
if (layer._mapEvents) this.off(layer._mapEvents, layer);
|
|
637
|
+
delete this._layers[stamp(layer)];
|
|
638
|
+
this.fire('layerremove', { layer }); layer.fire('remove');
|
|
639
|
+
layer._map = layer._mapToAdd = null;
|
|
640
|
+
return this;
|
|
641
|
+
},
|
|
642
|
+
hasLayer(layer) { return Boolean(this._layers[stamp(layer)]); },
|
|
643
|
+
eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },
|
|
644
|
+
createPane(name, parent = this._container) { return this._panes[name] = L.DomUtil.create('div', `leaflet-pane leaflet-${name}`, parent); },
|
|
645
|
+
getPane(name = 'overlayPane') { return this._panes[name]; },
|
|
646
|
+
addHandler(name, Handler) { this[name] = new Handler(this); this._handlers.push(this[name]); if (this.options[name]) this[name].enable(); return this; },
|
|
647
|
+
invalidateSize() { this.ol.updateSize(); return this; },
|
|
648
|
+
_draggableMoved() { return Boolean(this._moved); },
|
|
649
|
+
remove() {
|
|
650
|
+
clearTimeout(this._wheelTimer);
|
|
651
|
+
this.ol.getView().cancelAnimations();
|
|
652
|
+
this.fire('unload');
|
|
653
|
+
for (const control of [...this._controls]) control.remove();
|
|
654
|
+
this.eachLayer(this.removeLayer, this);
|
|
655
|
+
for (const handler of this._handlers) handler.disable();
|
|
656
|
+
L.DomEvent.off(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);
|
|
657
|
+
L.DomEvent.off(this._container, 'keydown', this._onKey);
|
|
658
|
+
this.ol.setTarget(undefined); this.ol.dispose();
|
|
659
|
+
for (const corner of Object.values(this._controlCorners)) corner.remove();
|
|
660
|
+
for (const pane of Object.values(this._panes)) pane.remove();
|
|
661
|
+
this._loaded = false;
|
|
662
|
+
delete this._container._leaflet_id;
|
|
663
|
+
return this.off();
|
|
664
|
+
},
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
L.Control = Class.extend({
|
|
668
|
+
options: { position: 'topright' },
|
|
669
|
+
initialize(options) { setOptions(this, options); },
|
|
670
|
+
getPosition() { return this.options.position; },
|
|
671
|
+
getContainer() { return this._container; },
|
|
672
|
+
addTo(map) {
|
|
673
|
+
this.remove(); this._map = map;
|
|
674
|
+
this._container = this.onAdd(map);
|
|
675
|
+
if (L.Control.Rotate && this instanceof L.Control.Rotate) {
|
|
676
|
+
this._container.classList.add('ol-city-rotate');
|
|
677
|
+
}
|
|
678
|
+
this._container.classList.add('leaflet-control', 'ol-control', 'ol-city-control');
|
|
679
|
+
this._olControl = new ol.control.Control({
|
|
680
|
+
element: this._container, target: map._controlCorners[this.getPosition()],
|
|
681
|
+
});
|
|
682
|
+
map.ol.addControl(this._olControl);
|
|
683
|
+
map._controls.add(this);
|
|
684
|
+
return this;
|
|
685
|
+
},
|
|
686
|
+
remove() {
|
|
687
|
+
if (!this._map) return this;
|
|
688
|
+
const map = this._map;
|
|
689
|
+
this.onRemove?.(map); this._container?.remove();
|
|
690
|
+
map.ol.removeControl(this._olControl);
|
|
691
|
+
map._controls.delete(this); this._map = null;
|
|
692
|
+
return this;
|
|
693
|
+
},
|
|
694
|
+
});
|
|
695
|
+
L.Control.Layers = L.Control.extend({
|
|
696
|
+
options: { collapsed: true },
|
|
697
|
+
initialize(base = {}, overlays = {}, options) {
|
|
698
|
+
setOptions(this, options); this._layers = [];
|
|
699
|
+
for (const [name, layer] of Object.entries(base)) this._layers.push({ name, layer, overlay: false });
|
|
700
|
+
for (const [name, layer] of Object.entries(overlays)) this._layers.push({ name, layer, overlay: true });
|
|
701
|
+
},
|
|
702
|
+
onAdd(map) {
|
|
703
|
+
const container = L.DomUtil.create('div', 'ol-city-layers');
|
|
704
|
+
L.DomEvent.disableClickPropagation(container); L.DomEvent.disableScrollPropagation(container);
|
|
705
|
+
const list = L.DomUtil.create('section', '', container);
|
|
706
|
+
list.setAttribute('aria-label', 'Map layers');
|
|
707
|
+
const base = L.DomUtil.create('div', '', list);
|
|
708
|
+
L.DomUtil.create('hr', '', list);
|
|
709
|
+
const overlays = L.DomUtil.create('div', '', list);
|
|
710
|
+
this._inputs = [];
|
|
711
|
+
for (const entry of this._layers) {
|
|
712
|
+
const label = L.DomUtil.create('label', '', entry.overlay ? overlays : base);
|
|
713
|
+
const input = L.DomUtil.create('input', 'leaflet-control-layers-selector', label);
|
|
714
|
+
input.type = entry.overlay ? 'checkbox' : 'radio';
|
|
715
|
+
input.name = `base-${stamp(this)}`; input.layerId = stamp(entry.layer);
|
|
716
|
+
input.checked = map.hasLayer(entry.layer);
|
|
717
|
+
label.append(document.createTextNode(` ${entry.name}`));
|
|
718
|
+
this._inputs.push(input);
|
|
719
|
+
input.onchange = () => {
|
|
720
|
+
const checked = input.checked;
|
|
721
|
+
if (!entry.overlay) for (const other of this._layers) {
|
|
722
|
+
if (!other.overlay && other !== entry) map.removeLayer(other.layer);
|
|
723
|
+
}
|
|
724
|
+
if (checked) map.addLayer(entry.layer); else map.removeLayer(entry.layer);
|
|
725
|
+
};
|
|
726
|
+
}
|
|
727
|
+
map.on('layeradd layerremove', this._update, this);
|
|
728
|
+
return container;
|
|
729
|
+
},
|
|
730
|
+
_update() { for (const input of this._inputs) input.checked = Boolean(this._map._layers[input.layerId]); },
|
|
731
|
+
onRemove(map) { map.off('layeradd layerremove', this._update, this); },
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
// Native layer contracts consumed by the plugin's WebGPU renderer.
|
|
735
|
+
const bounds = value => value instanceof L.LatLngBounds ? value : new L.LatLngBounds(value);
|
|
736
|
+
const coordinates = values => values.map(value => Array.isArray(value) && typeof value[0] !== 'number'
|
|
737
|
+
? coordinates(value) : latLng(value));
|
|
738
|
+
const image = (url, options, className) => {
|
|
739
|
+
const element = document.createElement('img');
|
|
740
|
+
element.className = className;
|
|
741
|
+
if (options.crossOrigin) element.crossOrigin = options.crossOrigin === true ? '' : options.crossOrigin;
|
|
742
|
+
element.src = url;
|
|
743
|
+
element.draggable = false;
|
|
744
|
+
return element;
|
|
745
|
+
};
|
|
746
|
+
|
|
747
|
+
L.Layer.include({
|
|
748
|
+
bindPopup(content) {
|
|
749
|
+
this._popupContent = content;
|
|
750
|
+
this.off('click', this.openPopup, this).on('click', this.openPopup, this);
|
|
751
|
+
this.once('remove', this.closePopup, this);
|
|
752
|
+
if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindPopup(content));
|
|
753
|
+
return this;
|
|
754
|
+
},
|
|
755
|
+
openPopup(event) {
|
|
756
|
+
if (!this._map) return this;
|
|
757
|
+
this.closePopup();
|
|
758
|
+
const location = event?.latlng || this.getLatLng?.() || this.getBounds?.().getCenter();
|
|
759
|
+
if (!location) throw new Error('Popup requires a location');
|
|
760
|
+
const element = L.DomUtil.create('div', 'ol-city-popup leaflet-popup');
|
|
761
|
+
element.setAttribute('role', 'dialog');
|
|
762
|
+
const close = L.DomUtil.create('button', '', element);
|
|
763
|
+
close.type = 'button'; close.textContent = '\u00d7'; close.setAttribute('aria-label', 'Close popup');
|
|
764
|
+
close.onclick = () => this.closePopup();
|
|
765
|
+
const content = L.DomUtil.create('div', '', element);
|
|
766
|
+
const value = typeof this._popupContent === 'function' ? this._popupContent(this) : this._popupContent;
|
|
767
|
+
if (value instanceof Node) content.append(value); else content.innerHTML = value;
|
|
768
|
+
L.DomEvent.disableClickPropagation(element);
|
|
769
|
+
this._popupOverlay = new ol.Overlay({ element, positioning: 'bottom-center', offset: [0, -12] });
|
|
770
|
+
this._map.ol.addOverlay(this._popupOverlay);
|
|
771
|
+
this._popupLocation = latLng(location);
|
|
772
|
+
this._map.on('move zoom rotate pitch', this._positionPopup, this);
|
|
773
|
+
this._positionPopup();
|
|
774
|
+
return this;
|
|
775
|
+
},
|
|
776
|
+
_positionPopup() {
|
|
777
|
+
const screen = this._map.latLngToContainerPoint(this._popupLocation);
|
|
778
|
+
this._popupOverlay.setPosition(this._map.ol.getCoordinateFromPixelInternal([screen.x, screen.y]));
|
|
779
|
+
},
|
|
780
|
+
closePopup() {
|
|
781
|
+
if (this._popupOverlay) {
|
|
782
|
+
this._map?.off('move zoom rotate pitch', this._positionPopup, this);
|
|
783
|
+
this._map?.ol.removeOverlay(this._popupOverlay);
|
|
784
|
+
this._popupOverlay = null;
|
|
785
|
+
}
|
|
786
|
+
return this;
|
|
787
|
+
},
|
|
788
|
+
bindTooltip(content) {
|
|
789
|
+
this._tooltipContent = content;
|
|
790
|
+
this.on('mouseover', this._showTooltip, this).on('mouseout remove', this._hideTooltip, this);
|
|
791
|
+
if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindTooltip(content));
|
|
792
|
+
return this;
|
|
793
|
+
},
|
|
794
|
+
_showTooltip(event) {
|
|
795
|
+
this._hideTooltip();
|
|
796
|
+
if (!this._map || !event.latlng) return;
|
|
797
|
+
const element = this._tooltipElement = L.DomUtil.create('div', 'ol-city-tooltip leaflet-tooltip', this._map.getContainer());
|
|
798
|
+
element.setAttribute('role', 'tooltip');
|
|
799
|
+
const value = typeof this._tooltipContent === 'function' ? this._tooltipContent(this) : this._tooltipContent;
|
|
800
|
+
if (value instanceof Node) element.append(value); else element.innerHTML = value;
|
|
801
|
+
const pixel = this._map.latLngToContainerPoint(event.latlng);
|
|
802
|
+
element.style.left = `${pixel.x + 12}px`; element.style.top = `${pixel.y + 12}px`;
|
|
803
|
+
},
|
|
804
|
+
_hideTooltip() { this._tooltipElement?.remove(); this._tooltipElement = null; },
|
|
805
|
+
});
|
|
806
|
+
L.LayerGroup.include({
|
|
807
|
+
getLayers() { return Object.values(this._layers); },
|
|
808
|
+
getBounds() {
|
|
809
|
+
const result = new L.LatLngBounds();
|
|
810
|
+
this.eachLayer(layer => result.extend(layer.getBounds?.() || layer.getLatLng()));
|
|
811
|
+
return result;
|
|
812
|
+
},
|
|
813
|
+
});
|
|
814
|
+
L.FeatureGroup = L.LayerGroup.extend({});
|
|
815
|
+
|
|
816
|
+
L.Path.include({
|
|
817
|
+
options: { pane: 'overlayPane', interactive: true, stroke: true, color: '#3388ff',
|
|
818
|
+
weight: 3, opacity: 1, lineCap: 'round', lineJoin: 'round', fill: false, fillOpacity: 0.2 },
|
|
819
|
+
initialize(options) { L.Util.setOptions(this, options); },
|
|
820
|
+
setStyle(options) { L.Util.setOptions(this, options); return this.redraw(); },
|
|
821
|
+
redraw() { return this; },
|
|
822
|
+
bringToFront() { return this; },
|
|
823
|
+
bringToBack() { return this; },
|
|
824
|
+
});
|
|
825
|
+
L.Polyline.include({
|
|
826
|
+
initialize(values, options) { L.Util.setOptions(this, options); this.setLatLngs(values); },
|
|
827
|
+
getLatLngs() { return this._latlngs; },
|
|
828
|
+
setLatLngs(values) { this._latlngs = coordinates(values); return this.redraw(); },
|
|
829
|
+
addLatLng(value) { this._latlngs.push(latLng(value)); return this.redraw(); },
|
|
830
|
+
getBounds() {
|
|
831
|
+
const result = new L.LatLngBounds();
|
|
832
|
+
const visit = values => { for (const value of values) Array.isArray(value) ? visit(value) : result.extend(value); };
|
|
833
|
+
visit(this._latlngs);
|
|
834
|
+
return result;
|
|
835
|
+
},
|
|
836
|
+
_project() {
|
|
837
|
+
this._rings = [];
|
|
838
|
+
const visit = values => {
|
|
839
|
+
if (!values.length) return;
|
|
840
|
+
if (Array.isArray(values[0])) values.forEach(visit);
|
|
841
|
+
else this._rings.push(values.map(value => this._map.latLngToLayerPoint(value)));
|
|
842
|
+
};
|
|
843
|
+
visit(this._latlngs);
|
|
844
|
+
},
|
|
845
|
+
closestLayerPoint(value) {
|
|
846
|
+
this._project();
|
|
847
|
+
const paths = this._rings.map(ring => ring.map(value => [value.x, value.y]));
|
|
848
|
+
const closest = new ol.geom.MultiLineString(paths).getClosestPoint([value.x, value.y]);
|
|
849
|
+
return point(closest);
|
|
850
|
+
},
|
|
851
|
+
});
|
|
852
|
+
L.Polyline.mergeOptions(L.Path.prototype.options);
|
|
853
|
+
L.Polygon.include({ initialize: L.Polyline.prototype.initialize });
|
|
854
|
+
L.Polygon.mergeOptions(L.Path.prototype.options);
|
|
855
|
+
L.Polygon.mergeOptions({ fill: true });
|
|
856
|
+
L.Rectangle = L.Polygon.extend({
|
|
857
|
+
initialize(value, options) { L.Util.setOptions(this, options); this.setBounds(value); },
|
|
858
|
+
setBounds(value) {
|
|
859
|
+
value = bounds(value);
|
|
860
|
+
return this.setLatLngs([value.getSouthWest(), value.getNorthWest(), value.getNorthEast(), value.getSouthEast()]);
|
|
861
|
+
},
|
|
862
|
+
});
|
|
863
|
+
L.CircleMarker.include({
|
|
864
|
+
options: { ...L.Path.prototype.options, fill: true, radius: 10 },
|
|
865
|
+
initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },
|
|
866
|
+
getLatLng() { return this._latlng; },
|
|
867
|
+
setLatLng(value) { this._latlng = latLng(value); this.fire('move', { latlng: this._latlng }); return this.redraw(); },
|
|
868
|
+
getRadius() { return this.options.radius; },
|
|
869
|
+
setRadius(radius) { this.options.radius = radius; return this.redraw(); },
|
|
870
|
+
});
|
|
871
|
+
L.Circle.include({
|
|
872
|
+
initialize: L.CircleMarker.prototype.initialize,
|
|
873
|
+
_project() {
|
|
874
|
+
this._point = this._map.latLngToLayerPoint(this._latlng);
|
|
875
|
+
this._radius = this._radiusY = this.getRadius() * this._map.options.crs.scale(this._map.getZoom()) /
|
|
876
|
+
(2 * Math.PI * 6378137 * Math.cos(this._latlng.lat * Math.PI / 180));
|
|
877
|
+
},
|
|
878
|
+
getBounds() {
|
|
879
|
+
const north = this.getRadius() / 6378137 * 180 / Math.PI;
|
|
880
|
+
const east = north / Math.cos(this._latlng.lat * Math.PI / 180);
|
|
881
|
+
return new L.LatLngBounds([this._latlng.lat - north, this._latlng.lng - east],
|
|
882
|
+
[this._latlng.lat + north, this._latlng.lng + east]);
|
|
883
|
+
},
|
|
884
|
+
});
|
|
885
|
+
L.Circle.mergeOptions(L.CircleMarker.prototype.options);
|
|
886
|
+
L.GeoJSON = L.FeatureGroup.extend({
|
|
887
|
+
initialize(data, options) {
|
|
888
|
+
L.LayerGroup.prototype.initialize.call(this, [], options);
|
|
889
|
+
if (data) this.addData(data);
|
|
890
|
+
},
|
|
891
|
+
addData(data) {
|
|
892
|
+
const features = new ol.format.GeoJSON().readFeatures(data);
|
|
893
|
+
const convert = (geometry, feature) => {
|
|
894
|
+
const values = geometry.getCoordinates();
|
|
895
|
+
const locations = value => typeof value[0] === 'number' ? [value[1], value[0]] : value.map(locations);
|
|
896
|
+
switch (geometry.getType()) {
|
|
897
|
+
case 'Point': return this.options.pointToLayer
|
|
898
|
+
? this.options.pointToLayer(feature, latLng(locations(values))) : new L.Marker(locations(values));
|
|
899
|
+
case 'MultiPoint': return new L.FeatureGroup(values.map(value => convert(new ol.geom.Point(value), feature)));
|
|
900
|
+
case 'LineString': case 'MultiLineString': return new L.Polyline(locations(values), this.options);
|
|
901
|
+
case 'Polygon': case 'MultiPolygon': return new L.Polygon(locations(values), this.options);
|
|
902
|
+
default: throw new Error(`Unsupported GeoJSON geometry: ${geometry.getType()}`);
|
|
903
|
+
}
|
|
904
|
+
};
|
|
905
|
+
for (const feature of features) {
|
|
906
|
+
const layer = convert(feature.getGeometry(), new ol.format.GeoJSON().writeFeatureObject(feature));
|
|
907
|
+
this.addLayer(layer);
|
|
908
|
+
}
|
|
909
|
+
return this;
|
|
910
|
+
},
|
|
911
|
+
});
|
|
912
|
+
|
|
913
|
+
L.GridLayer.include({
|
|
914
|
+
options: { pane: 'tilePane', tileSize: 256, opacity: 1, minZoom: 0, maxZoom: 24, updateInterval: 200 },
|
|
915
|
+
initialize(options) { L.Util.setOptions(this, options); this._tiles = {}; },
|
|
916
|
+
getTileSize() { return typeof this.options.tileSize === 'number'
|
|
917
|
+
? new L.Point(this.options.tileSize, this.options.tileSize) : point(this.options.tileSize); },
|
|
918
|
+
getEvents() { return { moveend: this._onMoveEnd, zoomend: this._onMoveEnd, resize: this._onMoveEnd }; },
|
|
919
|
+
_initContainer() { this._container = L.DomUtil.create('div', '', this.getPane()); },
|
|
920
|
+
onAdd() { this._initContainer(); this._onMoveEnd(); },
|
|
921
|
+
onRemove() {
|
|
922
|
+
for (const tile of Object.values(this._tiles)) this.fire('tileunload', { tile: tile.el, coords: tile.coords });
|
|
923
|
+
this._tiles = {}; this._container?.remove();
|
|
924
|
+
},
|
|
925
|
+
_getTiledPixelBounds() {
|
|
926
|
+
return new L.Bounds(this._map.project(this._map.getBounds().getNorthWest(), this._tileZoom),
|
|
927
|
+
this._map.project(this._map.getBounds().getSouthEast(), this._tileZoom));
|
|
928
|
+
},
|
|
929
|
+
_onMoveEnd() {
|
|
930
|
+
if (!this._map) return;
|
|
931
|
+
this._tileZoom = Math.max(this.options.minZoom, Math.min(this.options.maxZoom, Math.round(this._map.getZoom())));
|
|
932
|
+
const size = this.getTileSize(), extent = this._getTiledPixelBounds(this._map.getCenter());
|
|
933
|
+
const min = extent.min.unscaleBy(size).floor(), max = extent.max.unscaleBy(size).floor();
|
|
934
|
+
const retained = new Set(), limit = 2 ** this._tileZoom;
|
|
935
|
+
for (let x = min.x; x <= max.x; x++) for (let y = min.y; y <= max.y; y++) {
|
|
936
|
+
if (y < 0 || y >= limit) continue;
|
|
937
|
+
const key = `${this._tileZoom}:${x}:${y}`;
|
|
938
|
+
retained.add(key);
|
|
939
|
+
if (this._tiles[key]) continue;
|
|
940
|
+
const coords = new L.Point(x, y); coords.z = this._tileZoom;
|
|
941
|
+
const tile = this._tiles[key] = { coords, current: true, loaded: 0 };
|
|
942
|
+
const done = (error, element) => {
|
|
943
|
+
if (this._tiles[key] !== tile) return;
|
|
944
|
+
tile.el = element;
|
|
945
|
+
if (error) { this.fire('tileerror', { error, tile: element, coords }); return; }
|
|
946
|
+
tile.loaded = Date.now();
|
|
947
|
+
this.fire('tileload', { tile: element, coords });
|
|
948
|
+
this.fire('load');
|
|
949
|
+
};
|
|
950
|
+
tile.el = this.createTile(coords, done);
|
|
951
|
+
if (this.createTile.length < 2) done(null, tile.el);
|
|
952
|
+
}
|
|
953
|
+
for (const [key, tile] of Object.entries(this._tiles)) {
|
|
954
|
+
if (retained.has(key)) continue;
|
|
955
|
+
delete this._tiles[key];
|
|
956
|
+
this.fire('tileunload', { tile: tile.el, coords: tile.coords });
|
|
957
|
+
}
|
|
958
|
+
},
|
|
959
|
+
_tileCoordsToNwSe(coords) {
|
|
960
|
+
const size = this.getTileSize(), nw = new L.Point(coords.x * size.x, coords.y * size.y);
|
|
961
|
+
return [this._map.unproject(nw, coords.z), this._map.unproject(nw.add(size), coords.z)];
|
|
962
|
+
},
|
|
963
|
+
setOpacity(opacity) { this.options.opacity = opacity; return this; },
|
|
964
|
+
setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },
|
|
965
|
+
redraw() { if (this._map) { this.onRemove(); this._onMoveEnd(); } return this; },
|
|
966
|
+
});
|
|
967
|
+
L.TileLayer = L.GridLayer.extend({
|
|
968
|
+
initialize(url, options) {
|
|
969
|
+
L.GridLayer.prototype.initialize.call(this, options); this.setUrl(url);
|
|
970
|
+
},
|
|
971
|
+
setUrl(url) { this._url = url; this._source = new ol.source.XYZ({ url, crossOrigin: 'anonymous' }); return this.redraw(); },
|
|
972
|
+
createTile(coords, done) {
|
|
973
|
+
const url = this._source.getTileUrlFunction()([coords.z, coords.x, coords.y], 1, ol.proj.get('EPSG:3857'));
|
|
974
|
+
const tile = image(url, this.options, '');
|
|
975
|
+
tile.onload = () => done(null, tile);
|
|
976
|
+
tile.onerror = () => done(new Error(`Unable to load tile: ${url}`), tile);
|
|
977
|
+
return tile;
|
|
978
|
+
},
|
|
979
|
+
});
|
|
980
|
+
L.TileLayer.WMS = L.TileLayer.extend({
|
|
981
|
+
setUrl(url) {
|
|
982
|
+
this._url = url;
|
|
983
|
+
this._source = new ol.source.TileWMS({ url, crossOrigin: 'anonymous', params: {
|
|
984
|
+
LAYERS: this.options.layers, FORMAT: this.options.format || 'image/png',
|
|
985
|
+
TRANSPARENT: this.options.transparent || false,
|
|
986
|
+
} });
|
|
987
|
+
return this.redraw();
|
|
988
|
+
},
|
|
989
|
+
});
|
|
990
|
+
L.ImageOverlay.include({
|
|
991
|
+
options: { pane: 'overlayPane', opacity: 1, interactive: false },
|
|
992
|
+
initialize(url, value, options) { L.Util.setOptions(this, options); this._url = url; this._bounds = bounds(value); },
|
|
993
|
+
_initImage() {
|
|
994
|
+
this._image = image(this._url, this.options, '');
|
|
995
|
+
this._image.onload = () => this.fire('load');
|
|
996
|
+
this._image.onerror = () => this.fire('error', { error: new Error(`Unable to load image: ${this._url}`) });
|
|
997
|
+
},
|
|
998
|
+
getBounds() { return this._bounds; },
|
|
999
|
+
setBounds(value) { this._bounds = bounds(value); return this; },
|
|
1000
|
+
setUrl(url) { this._url = url; if (this._image) this._image.src = url; return this; },
|
|
1001
|
+
setOpacity(opacity) { this.options.opacity = opacity; return this; },
|
|
1002
|
+
setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
L.Icon = L.Evented.extend({
|
|
1006
|
+
initialize(options) { L.Util.setOptions(this, options); },
|
|
1007
|
+
createIcon() { return this._create('icon'); },
|
|
1008
|
+
createShadow() { return this.options.shadowUrl ? this._create('shadow') : null; },
|
|
1009
|
+
_create(kind) {
|
|
1010
|
+
const element = image(this.options[`${kind}Url`], this.options, `leaflet-marker-${kind}`);
|
|
1011
|
+
const size = this.options[`${kind}Size`], anchor = this.options[`${kind}Anchor`] || this.options.iconAnchor;
|
|
1012
|
+
if (size) { element.style.width = `${size[0]}px`; element.style.height = `${size[1]}px`; }
|
|
1013
|
+
if (anchor) { element.style.marginLeft = `${-anchor[0]}px`; element.style.marginTop = `${-anchor[1]}px`; }
|
|
1014
|
+
return element;
|
|
1015
|
+
},
|
|
1016
|
+
});
|
|
1017
|
+
L.Icon.Default = L.Icon.extend({
|
|
1018
|
+
options: {
|
|
1019
|
+
iconUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-icon.png',
|
|
1020
|
+
shadowUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-shadow.png',
|
|
1021
|
+
iconSize: [25, 41], iconAnchor: [12, 41], shadowSize: [41, 41], shadowAnchor: [12, 41],
|
|
1022
|
+
},
|
|
1023
|
+
});
|
|
1024
|
+
L.DivIcon = L.Icon.extend({
|
|
1025
|
+
createIcon() {
|
|
1026
|
+
const element = L.DomUtil.create('div', `leaflet-marker-icon ${this.options.className || ''}`);
|
|
1027
|
+
if (this.options.html instanceof Node) element.append(this.options.html); else element.innerHTML = this.options.html || '';
|
|
1028
|
+
const size = this.options.iconSize || [12, 12], anchor = this.options.iconAnchor || size.map(value => value / 2);
|
|
1029
|
+
element.style.cssText = `width:${size[0]}px;height:${size[1]}px;margin-left:${-anchor[0]}px;margin-top:${-anchor[1]}px`;
|
|
1030
|
+
return element;
|
|
1031
|
+
},
|
|
1032
|
+
createShadow() { return null; },
|
|
1033
|
+
});
|
|
1034
|
+
L.Marker.include({
|
|
1035
|
+
options: { pane: 'markerPane', icon: new L.Icon.Default(), opacity: 1, interactive: true, zIndexOffset: 0 },
|
|
1036
|
+
initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },
|
|
1037
|
+
getLatLng() { return this._latlng; },
|
|
1038
|
+
setLatLng(value) { this._latlng = latLng(value); this.update(); return this.fire('move', { latlng: this._latlng }); },
|
|
1039
|
+
setIcon(icon) { this.options.icon = icon; if (this._map) { this.onRemove(); this.onAdd(); } return this; },
|
|
1040
|
+
getEvents() { return { zoom: this.update, viewreset: this.update }; },
|
|
1041
|
+
onAdd() {
|
|
1042
|
+
this._icon = this.options.icon.createIcon(); this._shadow = this.options.icon.createShadow();
|
|
1043
|
+
this._icon.tabIndex = 0; this._icon.setAttribute('role', 'button');
|
|
1044
|
+
this._icon.setAttribute('aria-label', this.options.title || 'Marker');
|
|
1045
|
+
this._icon.title = this.options.title || '';
|
|
1046
|
+
for (const element of [this._shadow, this._icon]) if (element) this.getPane().append(element);
|
|
1047
|
+
this._initInteraction(); this.update();
|
|
1048
|
+
},
|
|
1049
|
+
onRemove() { this.dragging?.disable(); this._icon?.remove(); this._shadow?.remove(); },
|
|
1050
|
+
update() { if (this._map && this._icon) this._setPos(this._map.latLngToLayerPoint(this._latlng)); return this; },
|
|
1051
|
+
_setPos(value) {
|
|
1052
|
+
for (const element of [this._icon, this._shadow]) if (element) L.DomUtil.setPosition(element, value);
|
|
1053
|
+
this._zIndex = value.y + this.options.zIndexOffset; this._updateZIndex(0);
|
|
1054
|
+
},
|
|
1055
|
+
_updateZIndex(offset) { if (this._icon) this._icon.style.zIndex = this._zIndex + offset; },
|
|
1056
|
+
setOpacity(opacity) { this.options.opacity = opacity; return this; },
|
|
1057
|
+
setZIndexOffset(value) { this.options.zIndexOffset = value; return this.update(); },
|
|
1058
|
+
_initInteraction() {
|
|
1059
|
+
this._icon._cityLayer = this;
|
|
1060
|
+
const drag = this.dragging = new L.Handler(this._map);
|
|
1061
|
+
const icon = this._icon;
|
|
1062
|
+
L.DomEvent.on(icon, 'pointerdown', event => {
|
|
1063
|
+
this._map._moved = false;
|
|
1064
|
+
event.stopPropagation();
|
|
1065
|
+
});
|
|
1066
|
+
L.DomEvent.on(icon, 'keydown', event => {
|
|
1067
|
+
if (event.key !== 'Enter' && event.key !== ' ') return;
|
|
1068
|
+
L.DomEvent.stop(event);
|
|
1069
|
+
this.fire('click', { latlng: this._latlng, originalEvent: event });
|
|
1070
|
+
});
|
|
1071
|
+
drag._marker = this;
|
|
1072
|
+
drag._draggable = new L.Evented();
|
|
1073
|
+
drag._onDrag = function () {
|
|
1074
|
+
const marker = this._marker;
|
|
1075
|
+
marker._latlng = marker._map.layerPointToLatLng(L.DomUtil.getPosition(marker._icon));
|
|
1076
|
+
marker.fire('move', { latlng: marker._latlng }).fire('drag', { latlng: marker._latlng });
|
|
1077
|
+
};
|
|
1078
|
+
drag._adjustPan = function () {};
|
|
1079
|
+
drag._draggable.on('drag', drag._onDrag, drag);
|
|
1080
|
+
let pointer, anchor, origin, moved;
|
|
1081
|
+
const handle = event => {
|
|
1082
|
+
if (!drag.enabled()) return;
|
|
1083
|
+
if (event.type === 'pointerdown') {
|
|
1084
|
+
if (event.button !== 0) return;
|
|
1085
|
+
event.preventDefault(); event.stopPropagation();
|
|
1086
|
+
pointer = event.pointerId; anchor = [event.clientX, event.clientY];
|
|
1087
|
+
origin = this._map.latLngToContainerPoint(this._latlng); moved = false;
|
|
1088
|
+
icon.setPointerCapture(pointer);
|
|
1089
|
+
this.fire('dragstart');
|
|
1090
|
+
} else if (event.pointerId === pointer && event.type === 'pointermove') {
|
|
1091
|
+
const value = new L.Point(origin.x + event.clientX - anchor[0], origin.y + event.clientY - anchor[1]);
|
|
1092
|
+
L.DomUtil.setPosition(icon, value);
|
|
1093
|
+
drag._draggable._newPos = value;
|
|
1094
|
+
drag._draggable.fire('drag', { originalEvent: event });
|
|
1095
|
+
moved = true;
|
|
1096
|
+
} else if (event.pointerId === pointer) {
|
|
1097
|
+
if (icon.hasPointerCapture(pointer)) icon.releasePointerCapture(pointer);
|
|
1098
|
+
pointer = null; this.fire('dragend'); this._map._moved = moved;
|
|
1099
|
+
}
|
|
1100
|
+
};
|
|
1101
|
+
drag.addHooks = () => L.DomEvent.on(icon, 'pointerdown pointermove pointerup pointercancel', handle);
|
|
1102
|
+
drag.removeHooks = () => L.DomEvent.off(icon, 'pointerdown pointermove pointerup pointercancel', handle);
|
|
1103
|
+
if (this.options.draggable) drag.enable();
|
|
1104
|
+
},
|
|
1105
|
+
});
|
|
1106
|
+
|
|
1107
|
+
L.Map.include({
|
|
1108
|
+
_fireDOMEvent(event, type = event.type, targets) {
|
|
1109
|
+
const rect = this.getContainer().getBoundingClientRect();
|
|
1110
|
+
const pixel = new L.Point(event.clientX - rect.left, event.clientY - rect.top);
|
|
1111
|
+
const location = this.containerPointToLatLng(pixel);
|
|
1112
|
+
const layer = event.target.closest?.('.leaflet-marker-icon')?._cityLayer;
|
|
1113
|
+
if (type === 'click' && this._draggableMoved(layer)) return;
|
|
1114
|
+
for (const target of targets || (layer ? [layer] : [this])) {
|
|
1115
|
+
target.fire(type, { originalEvent: event, latlng: location, containerPoint: pixel,
|
|
1116
|
+
layerPoint: this.containerPointToLayerPoint(pixel) });
|
|
1117
|
+
}
|
|
1118
|
+
},
|
|
1119
|
+
});
|
|
1120
|
+
L.Map.addInitHook(function () {
|
|
1121
|
+
for (const [name, order] of [['tilePane', 200], ['overlayPane', 400], ['markerPane', 600]]) {
|
|
1122
|
+
this.createPane(name).style.zIndex = order;
|
|
1123
|
+
}
|
|
1124
|
+
const handler = event => this._fireDOMEvent(event);
|
|
1125
|
+
L.DomEvent.on(this.getContainer(), 'click mousemove mouseout mouseover', handler);
|
|
1126
|
+
this.once('unload', () => L.DomEvent.off(this.getContainer(), 'click mousemove mouseout mouseover', handler));
|
|
1127
|
+
});
|
|
1128
|
+
})();
|