刷新Google Maps API V3图层

man*_*son 22 html javascript google-maps

我一直无法正确地更新Google Maps API v3.我有一个javascript计时器运行应该定期刷新流量层但我没有看到它发生.

据我理解文档,我应该可以说"layer.setMap(null);" 接着是"layer.setMap(map);" 刷新图层(来源:https://developers.google.com/maps/documentation/javascript/reference#TrafficLayer).

我知道正在下载新的地图图块(例如,我可以在Chrome的开发工具的参考资料部分看到它们),但是浏览器没有渲染它们.我可能缺少一些基本的东西.

我尝试了几件事,包括:

有没有办法确保浏览器在不强制重页加载的情况下呈现新图像?

以下是该页面的简化版本(基于Google地图刷新流量图层的答案).

<html>
    <head>
        <title>Map Testing</title>
        <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=weather"></script>
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>

        <script type="text/javascript">
            var map,
                trafficLayer,
                mapTimerHandle;

            $(function() {
                initMap();
                mapTimerHandle = setInterval(refreshMap, 15000);
            });

            function refreshMap() {
                trafficLayer.setMap(null);
                trafficLayer.setMap(map);
            }

            function initMap() {
                var mapDiv = document.getElementById('map');

                map = new google.maps.Map(mapDiv, {zoom: 15, center: new google.maps.LatLng(40.7127, -74.0059)});

                trafficLayer = new google.maps.TrafficLayer();

                trafficLayer.setMap(map);
            }
        </script>
    </head>
    <body style="margin:0px;">
        <div id="map" style="width:100%; height:100%;"></div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Ser*_*gio 23

好吧,我已经找到了,并且上面提到的那是什么trafficLayer.setMap(null)trafficLayer.setMap(map)-只是开关与绘制的交通瓷砖瓷砖没有交通.此外map.setZoom(map.getZoom())(和任何其他缩放变量)不起作用,因为磁贴已经在缓存中,谷歌脚本甚至不尝试从服务器下载新的.

此外,似乎如果你只是打开谷歌地图并打开流量层它不令人耳目一新!这样的跛脚,谷歌!

所以我们必须找到一种不同的方法来解决它.

首先想到的是使用window.location.reload(true)wich将刷新图像缓存 - 我们认为它有效.不是一个好方法 - 重新加载整个页面需要太长时间.如何重新加载图片?我们试试吧!

function reloadTiles() {
    var tiles = $("#map-canvas").find("img");
    for (var i = 0; i < tiles.length; i++) {
        var src = $(tiles[i]).attr("src");
        if (/googleapis.com\/vt\?pb=/.test(src)) {              
            var new_src = src.split("&ts")[0] + '&ts=' + (new Date()).getTime();
            $(tiles[i]).attr("src", new_src);                                                   
        }               
    }
}   
Run Code Online (Sandbox Code Playgroud)

我们每N秒调用一次这个函数: setInterval(reloadTiles, 5000)

一些评论:

$("#map-canvas").find("img")- 将从您的地图容器中获取所有图像(map-canvas在我的情况下).并非所有都是瓷砖所以我们需要过滤它们 - 我注意到瓷砖是从像这样的域加载的mts(digit).googleapis.com/vt?pb=(hella long param).从中加载其他地图图像maps.gstatic.com.

所以我们得到平铺图像,添加伪造参数并更改其src.利润!

顺便说一句,我发现交通真正改变实际时间-瓷砖可能是不同的每一秒.

编辑

哦,对不起,这是工作样本.这是一个多雪的莫斯科,拥有巨大的交通:)

  • 你,先生,非常有创意!不错的开箱即用思维. (2认同)