Google Maps API:刷新ImageMapType叠加层

时间:2015-09-03 13:51:54

标签: javascript google-maps google-maps-api-3

我使用Google Maps JavaScript API从磁贴服务器显示天气。磁贴服务器可在此处获取:http://mesonet.agron.iastate.edu/ogc/

我使用ImageMapType显示该平铺服务器并将其添加到Google地图overlayMapTypes

<!DOCTYPE html>
<html>
    <head>
        <title>Map Test</title>
        <style type="text/css">
            html, body { height: 100%; margin: 0; padding: 0; }
            #map {
                width:90%;
                height: 90%;
                display:inline-block;
            }
        </style>
    </head>
<body>
<div id="map"></div>
<script type="text/javascript">

    var map;

    function initMap() {

        var mapOptions = {
            zoom: 8,
            center: new google.maps.LatLng(42.5, -95.5),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

        map = new google.maps.Map(document.getElementById('map'), mapOptions);


        var tileNEX = new google.maps.ImageMapType({
            getTileUrl: function(tile, zoom) {
                return "http://mesonet.agron.iastate.edu/cache/tile.py/1.0.0/nexrad-n0q-900913/" + zoom + "/" + tile.x + "/" + tile.y +".png?"+ (new Date()).getTime(); 
            },
            tileSize: new google.maps.Size(256, 256),
            opacity:0.60,
            name : 'NEXRAD',
            isPng: true
        });

        map.overlayMapTypes.setAt("0",tileNEX);

        setInterval(function (){console.log("resize"); google.maps.event.trigger(map, 'resize');}, 60000);
    }
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>
</body>
</html>

这样可以正常工作(将其复制到index.html并通过浏览器打开以查看),但现在我想每隔X分钟刷新一次天气叠加。

磁贴服务器显示当前天气数据,并且每5分钟更新一次天气数据。我希望我的天气数据能够自动刷新,以便始终显示当前天气。

我试过调用google.maps.event.trigger(map, 'resize');告诉地图重绘自己(看看我的JavaScript中的最后一行),但这并没有实际重新获取瓷砖 - 它只是重新绘制它已经取得的瓷砖。

我可以删除图层,重新创建它,然后重新添加它,但是当没有显示天气时会导致恼人的秒数。

我的下一个想法是在背景中创建另一个天气层,然后从第一层淡化到第二层,但这看起来有点过分。

是不是有一个简单的ImageMapType.refetchTiles()功能?

1 个答案:

答案 0 :(得分:2)

问题在于触发调整大小事件并不会强制加载新的图块。(当你看一下网络时,你会看到没有任何内容会加载)

更改缩放将加载新的图块:

function initMap() {

    var mapOptions = {
        zoom: 8,
        center: new google.maps.LatLng(42.5, -95.5),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById('map'), mapOptions);


    var tileNEX = new google.maps.ImageMapType({
        getTileUrl: function(tile, zoom) {
            //return if zoom is not an integer
            if(zoom%1)return null;

            return "http://mesonet.agron.iastate.edu/cache/tile.py/1.0.0/nexrad-n0q-900913/" + zoom + "/" + tile.x + "/" + tile.y +".png?"+ (new Date()).getTime(); 
        },
        tileSize: new google.maps.Size(256, 256),
        opacity:0.60,
        name : 'NEXRAD',
        isPng: true
    });

    map.overlayMapTypes.setAt("0",tileNEX);

    setInterval(function (){
      //this will change the zoom of the map  
      map.setZoom(map.getZoom()+.000000000000001);
      //this will change the zoom again and load fresh tiles
      map.setZoom(Math.round(map.getZoom()));

      }, 60000);
}

但是,无论您尝试什么,这个: 会在没有显示天气的情况下导致恼人的秒数 将永远是您的问题,因为它需要一些时间加载瓷砖。