1

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

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

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

Google Earth 的 API 具有以下显示 KMZ/KML的方法:

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

获取Kml()

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

http://localhost/somefile.kmz

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

解析Kml()

按下 undeterred,我创建了另一个 API 方法来解压缩服务器端的 KMZ 并返回 KML 字符串:

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

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

KmlNetworkLink

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

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

4

1 回答 1

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 地球插件的企业版

于 2013-04-06T16:40:08.203 回答