Отображение файлов KMZ за защищенными сетями
Я пытаюсь отобразить файл KMZ, который находится в папке, защищенной паролем и имеет порт, отличный от 80. Он выглядит так:
http://localhost:8080/assets/data/3641
Это вернет файл KMZ с допустимым типом MIME, и я смогу сохранить и открыть его в Google Планета Земля, если получу доступ к этой ссылке в браузере.
API Google Планета Земля имеет следующие способы отображения KMZ/KML:
- KmlNetworkLink - вы указываете URL KMZ/KML, а затем присоединяете этот объект к экземпляру GE
- parseKml() - вы предоставляете ей строку KML, она возвращает вам KmlFeature для присоединения
- fetchKml() - вы предоставляете ему URL для KML/KMZ, он прикрепляет его для вас
- Еще один удобный метод - displayKml() из библиотеки служебных программ Google Earth API, который использует fetchKml ()
fetchKml ()
Моя первая попытка состояла в том, чтобы использовать fetchKml, но это не дает ответа - молча происходит сбой. Я удивлен, что плагин считает это нормальным поведением (почему он не генерирует исключение или не предоставляет второй обратный вызов для обработки ошибок?). Этот метод работает нормально, если я приведу пример кмз в виде:
http://localhost/somefile.kmz
Я считаю, что проблема заключается в том, что мой первый URL-адрес защищен паролем - он будет перенаправлен на экран входа в систему, если сеанс входа в систему отсутствует, и я подозреваю, что плагин Google Планета Земля не использует тот же сеанс браузера, что и браузер, поэтому он выходит на экран входа в систему и дает сбой, потому что он получает файл HTML вместо KMZ/KML.
parseKml ()
Нажав на undeterred, я создал другой метод API, чтобы разархивировать KMZ на стороне сервера и вернуть строку KML:
http://localhost:8080/assets/data/unzip/3641
Прелесть этого метода в том, что я пишу свой собственный JavaScript для выполнения запроса GET - он не проходит через Google Планета Земля, поэтому открываемый сеанс входа в систему используется и KMZ можно загрузить. Недостатком является то, что KMZ могут содержать изображения и музыку, на которые может ссылаться файл KML. Они не могут быть переданы вместе со строкой KML, что касается документации.
KmlNetworkLink
Моей последней попыткой было использовать KmlNetworkLink и KmlLink. Это имеет тот же эффект, что и fetchKml - ничего не происходит.
ОБНОВЛЕНИЕ: Кроме того, он не будет работать при использовании "https" без действительного сертификата.
1 ответ
Да, проблема в том, что URL защищен паролем. Ты можешь получить fetchKml()
дать некоторое указание на ошибку, если вы используете ее так:
google.earth.fetchKml(ge, 'http://localhost:8080/assets/data/3641
', finishFetchKml);
function finishFetchKml(kmlObject) {
// check if the KML was fetched properly
if (kmlObject) {
// add the fetched KML to Earth
currentKmlObject = kmlObject;
} else {
// setTimeout prevents a deadlock in some browsers
setTimeout(function() {
alert('Bad or null KML.');
}, 0);
}
}
Kml предназначен для свободного открытого формата - если вы хотите использовать его в защищенной системе для частного использования, вам следует рассмотреть возможность использования корпоративной версии плагина Google Планета Земля.