当可见容器区域发生变化时,如何保持传单地图的可见区域?

问题描述 投票:0回答:1

我正在展示一张传单地图。在某些时候,我知道地图容器中地图可见区域的纬度边界。

如果用户调整容器的大小,我想要平移/缩放,以便可见的地图区域保持不变(使用实现这一目标的最大缩放)。

我知道我可以使用 map.on('moveend Zoomend', myFn) (调用 (map.getBounds()) 来跟踪可见的地图边界,但我不太确定如何监听地图容器的大小调整我可以使用map.getContainer()获取容器。

此外,我有两个对话框,当它们打开时,它们会覆盖地图的一部分,当该对话框打开/关闭时,我想做同样的事情,更改平移/缩放,以便地图区域在在最大变焦下,不断变化的房地产仍然可见。

所以我需要根据两个对话框的隐藏状态找到可见的最大像素矩形,然后以某种方式设置地图,以便该像素矩形显示所需的地图边界,我真的不知道如何处理这个问题.

我发现一个插件使用 map.panBy() 在特定对话框打开/关闭时将地图移动增量,这很有趣,但并不能解决我的问题。

我正在制作的地图是这样的: https://supragamescommunity.github.io/maps/

所以右上角的图层对话框扩大/缩小就是一个例子。

但我正在努力添加左侧和右侧边栏对话框,如下所示: https://joric.github.io/supraland/3d/

非常感谢任何指点。

javascript html leaflet
1个回答
0
投票

我主要从https://icomoon.io/

获取图标

至于放大或缩小地图,这是如何处理的一个小示例。当然,它并不完美,但它对于工作的开始很有用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Leaflet Map Resize Example with Zoom</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
    <style>
        #map {
            width: 100%;
            height: 100%;
        }
        #container {
            width: 600px;
            height: 400px;
            resize: both;
            overflow: auto;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="map"></div>
    </div>
    <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
    <script>
        // Inicjalizacja mapy
        var map = L.map('map').setView([52.22977, 21.01178], 13);

        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: '© OpenStreetMap contributors'
        }).addTo(map);

        function resizeMap() {
            map.invalidateSize();

            const container = document.getElementById('container');
            const width = container.offsetWidth;
            const height = container.offsetHeight;

            const newZoom = Math.min(Math.max(1, Math.floor(width / 100)), 18); 
            map.setZoom(newZoom);
        }

       
        const container = document.getElementById('container');
        const observer = new ResizeObserver(function(entries) {
            for (let entry of entries) {
                resizeMap();
            }
        });

        observer.observe(container);
    </script>
</body>
</html>

© www.soinside.com 2019 - 2024. All rights reserved.