【问题标题】:Loading map in leaflet is very slow在传单中加载地图非常慢
【发布时间】:2017-07-13 01:03:04
【问题描述】:

我在leaflet中有一张地图,使用如下代码,当页面加载时,地图没有完全显示出来,不知道为什么,如何解决?

var Mmap = L.map('Modalmap').setView([8.7144, 125.7481],8);
L.tileLayer( 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="https://www.openstreetmap.org/copyright"></a>',
    subdomains: ['a','b','c']
}).addTo(Mmap);

L.control.scale({imperial:false}).addTo(Mmap);

var north = L.control({position: "topleft"});
north.onAdd = function(map) {
    var div = L.DomUtil.create("div", "info_legend leaflet-bar");
    div.innerHTML = '<img src="../lib/css/images/north-arrow-2.png" width="100%" height="100%">';
    return div;
}
north.addTo(Mmap);

var geocoder = L.Control.geocoder({
    defaultMarkGeocode: false
})
.on('markgeocode', function(e) {
    var box = e.geocode.center;
    document.getElementById("Latitude").value = box.lat;
    document.getElementById("Longitude").value = box.lng;
    var MarkLayer=L.marker([box.lat,box.lng]).addTo(Mmap);
    var group = new L.featureGroup([MarkLayer]);

    Mmap.fitBounds(group.getBounds());
}).addTo(Mmap);

这张地图是一个模态的,我在导航栏中将其称为Modal-1

<div class="collapse navbar-collapse" id="myNavbar">
    <ul class="nav navbar-nav" style="margin-top: -3px;">
        <li class="dropdown"><a href="#" data-toggle="modal" data-target="#modal-1">New Customer</a></li>
        <li class="dropdown"><a href="#" data-toggle="modal" data-target="#modal-2">New Category</a></li>
    </ul>
</div>

【问题讨论】:

  • 您的页面中包含传单 CSS 吗? (这是一个常见的错误)
  • @Sharky..是的,我已经在主页添加了它
  • stackoverflow.com/questions/36246815/…(类似于@Sharky的下面的答案)

标签: javascript leaflet openstreetmap


【解决方案1】:

这里有点猜测:我看到你的容器的名字是"Modalmap"。这让我觉得您在模态容器中显示您的地图。

我还猜测,当模态出现时,"Modalmap"(这是传单的容器)的高度和宽度正在动态设置。也许这会给您的传单地图带来一些问题,因为传单在初始化时会根据其父宽度和高度计算其宽度和高度。当您的模态未显示并且它可能具有较小的值(例如宽度和高度)时,就会发生这种情况,而这些较小的值最终会成为传单的宽度和高度。

您可以尝试调用传单地图以“刷新”其大小显示模态并且模态具有正确的高度和宽度。

试试这个,就在你触发模态显示的那一行之后:

setTimeout(function(){ map.invalidateSize()}, 500);

这将强制传单在 500 毫秒后重新计算其大小。 (我想 500 毫秒足以显示您的模态)。如果不起作用,请尝试更大的值。

更新: 对于引导程序 3,只需将其放在您的代码中

$('body').on('shown.bs.modal', function (e) {
    setTimeout(function(){ map.invalidateSize()}, 500);
})

提示:我建议你不要使用body 作为 jquery 的选择器,因为这会触发你所有模态的代码。使用标记中更具体的选择器 更多信息在这里Calling a function on bootstrap modal open

【讨论】:

  • @Sharky...你完全正确,我用模态部分更新了我的问题,你能帮我把这段代码放在哪里setTimeout(function(){ map.invalidateSize()}, 500); 吗?
  • @NewatLeaflet 更新了我的答案,它应该适合你!
  • @Sharky...我收到此错误map.invalidateSize is not a function
  • @NewatLeaflet 通过查看您的代码示例,您的传单对象似乎被称为Mmap。尝试将map 更改为Mmap。这意味着setTimeout(function(){ Mmap.invalidateSize()}, 500);
  • @Sharky...对不起。终于成功了..非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
相关资源
最近更新 更多