Обратные вызовы API Карт Google V3 (загрузка KML) - PullRequest
9 голосов
/ 29 марта 2011

Я использую Google Maps API v3 для отображения карты, загрузки некоторых KML и отображения / скрытия их методом kml.setMap().

Мне нужно отобразить окно «загрузки» во время загрузки KML до полной загрузки карты.

Я пытался использовать что-то вроде этого:

google.maps.event.addListener(map, 'tilesloaded', function() {
    var d = new Date();
    console.log('Loaded: ' + d);
});

google.maps.event.addListener(map, 'bounds_changed', function() {
    var d = new Date();
    console.log('Started: ' + d);
});

Но это не сработало, как ожидалось.

Событие «заголовки загружено» не всегда, возможно потому, что кэшированные изображения?

Вот мой журнал:

Started: Tue Mar 29 2011 16:22:03 GMT-0300 (BRT) <-- started loading map
Loaded: Tue Mar 29 2011 16:22:06 GMT-0300 (BRT) <-- done loading map
Started: Tue Mar 29 2011 16:22:30 GMT-0300 (BRT) <-- started plotting the KML
Started: Tue Mar 29 2011 16:22:30 GMT-0300 (BRT) <-- started plotting the KML (again?!)
Loaded: Tue Mar 29 2011 16:22:32 GMT-0300 (BRT) <-- done plotting the KML

И ничего не получил, прячась / снова показывая KML

Ответы [ 3 ]

18 голосов
/ 05 апреля 2011

Попробуйте зарегистрировать слушателя на kmlLayer вместо карты. Я сделал несколько простых тестов, прослушивая событие metadata_changed, и, похоже, он работает нормально.

google.maps.event.addListener(kmlLayer, "metadata_changed", function() {
    console.debug("metadata_changed");
});
4 голосов
/ 30 марта 2011

Полагаю, вы могли бы написать свой собственный загрузчик для KML. Вот простой пример, который просто проверяет возвращаемое значение объекта KMLMetaData. Вам придется адаптировать это для работы с несколькими файлами KML.

<html>
    <head>
        <script type="text/javascript" src= "http://maps.google.com/maps/api/js?sensor=false">
        </script>
        <script>
    var map;
    var cta_layer;
    var loader;
    var loaderId;

    function initialize() {
        loader = document.getElementById("loader");
        var kmlUrl = 'http://code.google.com/apis/kml/documentation/KML_Samples.kml';
        var myLatlng = new google.maps.LatLng(-25.363882,131.044922);
        var myOptions = {
            zoom: 4,
            center: myLatlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

        cta_layer = new google.maps.KmlLayer(kmlUrl, {suppressInfoWindows: true,preserveViewport:true});
        cta_layer.setMap(map);
        loaderId = setInterval("kmlLoader()", 10)
    }

    function kmlLoader() {

        if (typeof  cta_layer.getMetadata() == "object") {

            loader.style.display = "none";
            clearInterval(loaderId);
            return true;
        } else {
            return false;
        }
    }

    function show() {
        cta_layer.setMap(map)
    }

    function hide() {
        cta_layer.setMap(null)
    }
        </script>
    </head>
    <body onload="initialize()">
        <div id="loader" style="background: red; color:white;display:block;">
            Loading....
        </div>
        <div id="map_canvas"  style="height: 500px;width: 500px;">
        </div>
        <input type=button onclick="show()" value="Show">
        <input type=button onclick="hide()" value="Hide">
    </body>
</html>
2 голосов
/ 28 января 2013

Если я посмотрю на текущую ссылку (по состоянию на 18 ноября 2012 г.), вы можете просто прослушать событие status_changed. Я даже больше не могу найти событие metadata_changed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...