Клуб API Карт

Определение состояния карты

Пост в архиве.

Иногда во время работы с картой она становится серого цвета. Я заметил, что причиной тому бывает пропадание связи с интернетом.

 

Вопрос:

Как программно определить, что такая ситуация настала?

4 комментария
Не вариант. Хочется найти решение получше. 

вариант 2 - переопределить тайлы яндекса, так чтобы перехватывать успешные и неуспешные загрузки.

Таким образом можно знать сколько тайлов показалось, а сколько не показалось.

Если серость незагрузок начинает превышать успешные отклики - что-то делаем.

К сожалению красивого варианта это сделать я не знаю(так как нельзя влесть в ITile дефолтного слоя) - только через перегрузку дефотлных слоев "пользовательскими" настроеными на теже самые адреса(что есть немного не верно)

Вариант два - тоже не стабильный, но в "другую" строну - после сдвига карты, по некому таймауту сканировать div тайл контейнера в поисках еррорных тайлов.

Хорош тем что можно совешать чуть более хитрые операции над пустотой, плох не стабильностью опеределения

Я в свое время делал фейковое событие о серых тайлах для спутникового слоя. Для других можно сделать по аналогии.

(function () {
    // Сохраняем указатель на старый спутниковый слой
    var oldSatelliteLayer = YMaps.Layers.get("sat");

    /**
     * Свой слой спутниковых снимков
     *
     * Нужно из стандартного слоя спутников обязательно брать методы getCopyright и getZoomRange.
     * В противном случае копирайты отображаться не будут.
     */
    function SatelliteLayer (tileDataSource, options) {
        YMaps.Layer.call(this, tileDataSource, options);

        this.getCopyright = oldSatelliteLayer.getCopyright;
        this.getZoomRange = oldSatelliteLayer.getZoomRange;
    }
    YMaps.Utils.extend(SatelliteLayer, YMaps.Layer);

    // Заменяем стандартный спутниковый слой на фейковый, который умеет сообщать о серых тайлах с помощью
    // дополнительного события ErrorTile, которого нет в официальной поставке API
    YMaps.Map.prototype.Events.ErrorTile = "load-error-tile";
    YMaps.Layers.add("sat", function () {
        var layer = new SatelliteLayer($.extend(
            new YMaps.TileDataSource(oldSatelliteLayer.getTileDataSource().getTileUrlTemplate()), {
                getErrorTileUrl : function () {
                    var map = layer.getMap();
                    YMaps.Events.notify(map, map.Events.ErrorTile, map);
                    return oldSatelliteLayer.getTileDataSource().getErrorTileUrl(); 
                }
            }
        ))

        return layer;
    });
})();