Файл Google Maps KMZ не отображается в IE8 и IE7

У меня есть веб-приложение с картой. Я добавил приятный небольшой элемент управления картой, чтобы включать и выключать различные слои на карте. В настоящее время существует только два слоя, и все они отлично работают в большинстве браузеров.

За исключением IE8+7. Ни один из слоев не отображается на карте при включении. Насколько я могу судить, карта загружает файлы kmz/kml (когда для параметра saveViewport установлено значение false, карта перемещается в нужное место), но они просто не отображаются. Один слой содержит полилинии, а другой — маркеры. Код, который я использую, приведен ниже:

function someFunction() {
    //code to initialise map etc goes here...
    var layers = [];

    //Create 1st layer
    var exchangeslayer = new google.maps.KmlLayer('http://link.to.file/exchanges.kmz'
        suppressInfoWindows: true,
        preserveViewport: true
    });
    layers.push({name: "Exchanges", layer: exchangeslayer});

    //Code to create second layer
    var nyclayer = new google.maps.KmlLayer('http://www.nyc.gov/html/dot/downloads/misc/cityracks.kml'
        suppressInfoWindows: true,
        preserveViewport: false
    });
    layers.push({name: "NY City Tracks", layer: nyclayer});

    addCustomLayerControls(layers);
}

function addCustomLayerControls(layers) {
    //there is code here that would generate the divs for the custom map control
    var container; //container is a div element created via javascript

    for (var i = 0; i < layers.length; i++) {
        this.addLayerLabelToContainer(layers[i], container);
    }

    //some more code
}

function addLayerLabelToContainer(layer, container) {
    var map; //Assume I get a reference to the map

    //some code here to make pretty labels for the map controls...
    var layerLabel; // layerLabel is a div element created via javascript

    google.maps.event.addDomListener(layerLabel, 'click', function() {
        if(layer.layer.map == null) {
            layer.layer.setMap(map);
        } else {
            layer.layer.setMap(null);
        }
    });
}

person gordon    schedule 31.10.2012    source источник
comment
Отредактировал мой первоначальный вопрос после того, как обнаружил, что эта ошибка возникает с любым файлом kml/kmz.   -  person gordon    schedule 31.10.2012
comment
KmlLayer.getStatus() сообщает вам что-нибудь полезное?   -  person geocodezip    schedule 31.10.2012
comment
@geocodezip getStatus() каждый раз возвращает «ОК», но на карте по-прежнему ничего не отображается.   -  person gordon    schedule 31.10.2012
comment
Итак, я только что заметил, что курсор меняется, когда я навожу курсор на область, которую должны отображать слои kml. Для меня это означало бы, что они добавлены на карту, но просто не видны. Есть ли способ изменить видимость?   -  person gordon    schedule 31.10.2012
comment
Вы используете представление совместимости? Из часто задаваемых вопросов * Режим совместимости Internet Explorer не поддерживается.   -  person geocodezip    schedule 31.10.2012
comment
@geocodezip Нет, я так не думаю. Я использую IE9 и меняю «Режим браузера» на IE8 или IE7.   -  person gordon    schedule 31.10.2012
comment
У вас есть живая версия или вы уже пробовали настоящий IE8 или IE7?   -  person geocodezip    schedule 31.10.2012
comment
@geocodezip У меня нет доступа к реальному IE8 или IE7 (поэтому я использую режим браузера в IE9). Не уверен, что вы подразумеваете под «живой версией». Если вы имеете в виду мое веб-приложение, оно работает на локальном хосте, но файлы kml/kmz поступают с действующих серверов.   -  person gordon    schedule 31.10.2012
comment
Если у вас есть общедоступная версия, кто-то (например, я), у которого есть IE8 (но уже не IE7), может попробовать ее.   -  person geocodezip    schedule 31.10.2012
comment
Это работает для меня в IE8 (по крайней мере KmlLayer работает)   -  person geocodezip    schedule 31.10.2012
comment
@geocodezip К сожалению, тогда я не могу предоставить доступ к живой версии, но если я найду время собрать пример проекта, я оставлю ссылку здесь.   -  person gordon    schedule 31.10.2012
comment
@geocodezip Этот пример, который вы привели, работает в IE9 в режиме браузера IE8, так что какая бы ни была моя проблема, она заключается в моем коде. Нужен ли geoxml3 для просмотра файлов kml?   -  person gordon    schedule 31.10.2012
comment
geoxml3 не требуется для просмотра файлов KML, это сторонний синтаксический анализатор KML, который я поддерживаю.   -  person geocodezip    schedule 31.10.2012
comment
Оказывается, это была проблема с CSS. Теги img получили максимальную ширину: 100%. В любом случае спасибо за помощь @geocodezip   -  person gordon    schedule 31.10.2012
comment
Вы не публиковали никаких css, так что мы никак не могли помочь с этим.   -  person geocodezip    schedule 31.10.2012


Ответы (2)


Итак, как оказалось, моя проблема связана с CSS. Одна из моих таблиц стилей применяла max-width: 100% ко всем тегам img. Это приводило к хаосу с маркерами/полилиниями карты.

Теперь, когда я это вижу, это очевидно, но когда вы думаете, что проблема связана с javascript, это не так очевидно. Поэтому я оставлю этот ответ здесь для всех, кто совершит ту же ошибку, что и я.

person gordon    schedule 31.10.2012

Если вы измените addLayerLabelToContainer() таким образом, он будет работать в IE, как и ожидалось. Проверено, он правильно загружает KMZ в IE 8 и 9.

function addLayerLabelToContainer(layer, container) {
    // var map; //Assume I get a reference to the map
    //some code here to make pretty labels for the map controls...
    var layerLabel; // layerLabel is a div element created via javascript                       

    if(layer.layer.map == null) {               
        layer.layer.setMap(map);
    } else {
        layer.layer.setMap(null);
    }
}

Не нужно вызывать addDomListener(). Также обратите внимание на синтаксис API:

addDomListener(instance:Object, eventName:string, handler:Function)

Также незначительное исправление синтаксических ошибок в someFunction:

function someFunction() {
    // var map; //assume map is initialised, I've just removed that code
    var layers = [];

    // see https://developers.google.com/maps/documentation/javascript/layers
    //Create 1st layer
    var exchangeslayer = new google.maps.KmlLayer(
    'http://kml-samples.googlecode.com/svn/trunk/kml/kmz/simple/big.kmz',
        { suppressInfoWindows: true, preserveViewport: true
        });
    layers.push( {name: "Exchanges", layer: exchangeslayer} );

    // ...
    addCustomLayerControls(layers); 
}
person JasonM1    schedule 31.10.2012
comment
addLayerLabelToContainer() используется для простого добавления div на экран, который при нажатии будет добавлять/удалять слой. Теперь я понимаю, что когда я копировал код, он немного испортился. Я исправил это в своем вопросе. - person gordon; 31.10.2012