You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Leaflet中实现仅单轴(频率轴)的缩放功能?

Leaflet单轴拉伸缩放实现频谱瀑布日志

针对你的频谱瀑布数据需求,我们可以通过自定义Leaflet图层和坐标系来实现仅频率轴(宽度)的拉伸缩放,时间轴(高度)保持固定。以下是完整的实现示例:

核心思路

  1. 自定义瓦片图层:根据缩放级别动态匹配对应的切片路径,保证时间轴切片数量不变,频率轴切片数量随缩放翻倍。
  2. 自定义坐标系:修改Leaflet的默认笛卡尔坐标系,仅对x轴(频率)应用缩放逻辑,y轴(时间)保持固定比例。
  3. 约束交互:限制地图在时间轴方向的拖动范围,避免内容偏移出容器。

完整代码示例

<!DOCTYPE html>
<html>
<head>
    <title>频谱瀑布日志</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
    <style>
        #waterfall-map {
            width: 800px;
            height: 800px;
            border: 1px solid #ddd;
        }
    </style>
</head>
<body>
    <div id="waterfall-map"></div>
    <script>
        // 自定义瓦片图层:处理不同缩放级别的切片路径
        L.WaterfallTileLayer = L.TileLayer.extend({
            initialize: function(url, options) {
                // 固定切片尺寸为200×200像素
                options.tileSize = L.point(200, 200);
                options.minZoom = 0;
                options.maxZoom = 1;
                options.noWrap = true; // 禁止瓦片循环
                L.TileLayer.prototype.initialize.call(this, url, options);
            },

            getTileUrl: function(coords) {
                const zoom = coords.z;
                const x = coords.x;
                const y = coords.y;

                // 验证切片坐标有效性:
                // 缩放0:x∈[0,3],y∈[0,3];缩放1:x∈[0,7],y∈[0,3]
                const maxX = zoom === 0 ? 3 : 7;
                if (x < 0 || x > maxX || y < 0 || y > 3) {
                    return null; // 跳过无效切片请求
                }

                return L.Util.template(this._url, { z: zoom, x: x, y: y });
            }
        });

        // 自定义坐标系:仅对频率轴(x轴)应用缩放
        const WaterfallCRS = L.extend({}, L.CRS.Simple, {
            scale: function(zoom) {
                // 缩放0:1单位=1像素;缩放1:1单位=0.5像素(频率轴拉伸2倍)
                return Math.pow(2, zoom);
            },
            // 保持y轴坐标映射不变
            project: function(latlng) {
                return new L.Point(latlng.lng, latlng.lat);
            },
            unproject: function(point) {
                return new L.LatLng(point.y, point.x);
            }
        });

        // 初始化地图
        const map = L.map('waterfall-map', {
            crs: WaterfallCRS,
            zoomControl: true,
            minZoom: 0,
            maxZoom: 1,
            dragging: true
        });

        // 设置初始视图和边界
        map.setView([400, 400], 0); // 居中显示
        map.setMaxBounds([[0, 0], [800, 1600]]); // 限制最大范围

        // 添加自定义瓦片图层
        new L.WaterfallTileLayer('images/{z}/{x}_{y}.png', {
            attribution: '频谱瀑布数据'
        }).addTo(map);

        // 可选:限制时间轴方向的拖动,避免内容偏移
        map.on('drag', function() {
            const center = map.getCenter();
            if (center.y < 0 || center.y > 800) {
                map.panTo([Math.max(0, Math.min(800, center.y)), center.x]);
            }
        });
    </script>
</body>
</html>

关键说明

  • 切片路径匹配:代码中使用的images/{z}/{x}_{y}.png完全匹配你提供的文件夹结构,确保切片能正确加载。
  • 缩放逻辑:缩放级别0对应原始频率范围(0-800MHz),缩放级别1将频率范围的显示分辨率提升1倍(相当于拉伸宽度至2倍),时间轴始终保持80秒的显示范围。
  • 交互约束:通过setMaxBounds和拖动事件监听,确保地图不会拖出时间轴的有效范围。

内容的提问来源于stack exchange,提问作者me me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:43:10