在受保护的网络后面显示KMZ文件

时间:2013-04-05 11:22:22

标签: google-earth-plugin kmz

我正在尝试显示一个KMZ文件,该文件位于受密码保护且端口不同于80的文件夹中。它看起来像这样:

http://localhost:8080/assets/data/3641

这将返回具有有效MIME类型的KMZ文件,如果我在浏览器中访问此链接,我可以在Google地球中保存并打开它。

Google地球的API为displaying KMZ/KML提供了以下方法:

  • KmlNetworkLink - 您提供KMZ / KML的URL,然后将此对象附加到GE实例
  • parseKml() - 你提供了一个KML字符串,它为你提供了一个KmlFeature来附加
  • fetchKml() - 你为它提供了一个KML / KMZ的URL,它会为你附上它
  • 另一个方便的方法是来自Google Earth API Utility library的displayKml(),它使用fetchKml()

fetchKml()

我的第一次尝试是使用fetchKml,但这没有给出任何响应 - 它无声地失败。我很惊讶这被认为是插件的正常行为(为什么不抛出异常,或者提供第二个回调来处理错误?)。如果我以下列形式提供样本kmz,此方法可以正常工作:

http://localhost/somefile.kmz

我认为问题在于我的第一个网址受密码保护 - 如果没有登录会话,它会重定向到登录屏幕,我怀疑Google地球插件不会共享相同的浏览器会话浏览器 - 因此它会运行到登录屏幕并因为收到HTML文件而不是KMZ / KML而失败。

parseKml会()

按下未取消,我做了另一个API方法解压缩服务器端的KMZ并返回KML字符串:

http://localhost:8080/assets/data/unzip/3641

这种方法的优点在于我编写自己的JavaScript来执行GET请求 - 它不通过Google Earth,因此我使用了已打开的登录会话并可以下载KMZ。缺点是KMZ可以包含KML文件可以引用的图像和音乐。就documentation而言,这些不能与KML字符串一起传递。

KmlNetworkLink

我的最后一次尝试是使用KmlNetworkLinkKmlLink。这与fetchKml具有相同的效果 - 没有任何反应。

更新:此外,在没有有效证书的情况下使用“https”时会失败。

1 个答案:

答案 0 :(得分: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旨在成为一种免费的开放格式 - 如果您希望在安全系统上私下使用它,那么您应该使用enterprise version of the Google Earth Plugin