0

我需要通过 OpenLayers.Protocol.HTTP 在 OpenLayers 中加载一个 zip 文件。我想在 jszip 的帮助下加载并解压缩它。由于我想加载二进制数据,我必须更改 XMLHttpRequest 的 mimeType。一个 jszip 示例说它是这样工作的:

var xhr1 = new XMLHttpRequest();
  xhr1.open('GET', '../test/ref/text.zip', true);
  if (xhr1.overrideMimeType) {
    xhr1.overrideMimeType('text/plain; charset=x-user-defined');
  }

  xhr1.onreadystatechange = function(e) {
    if (this.readyState == 4 && this.status == 200) {
      var zip = new JSZip(this.responseText);
      var elt = document.getElementById('xhr1_way');
      elt.innerHTML = "<p>loaded ! (as a " + (typeof this.responseText) + ")</p>";
      elt.innerHTML += "<p>Content = " + zip.file("Hello.txt").asText();
    }
  };

不幸的是,OpenLayers 使用的 XMLHttpRequest 类 (OpenLayers.Request.XMLHttpRequest) 没有 overrideMimeType 函数。当我尝试在不设置 mime 类型的情况下解压缩加载的数据时,我收到错误消息“已到达数据结束(数据长度 = 23798955,询问索引 = 24968701)。损坏的 zip?”,所以看起来 zip 没有正确加载. 任何建议如何解决这个问题?

4

1 回答 1

1

Openlayer 中的限制很可能是故意实现的,因为并非所有浏览器都支持来自 JavaScript 的二进制请求(猜猜哪一个不适合它)。

您不需要使用 OpenLayer 的 HTTP 功能来加载数据。使用您最喜欢的 JS 框架(这里是一个示例)执行您自己的请求,然后使用您使用的任何数据类型加载您的数据。

var zip = new JSZip(this.responseText);
var jsonFormat = new OpenLayers.Format.JSON();
var jsonData = jsonFormat.read(zip.file("Hello.txt").asText());
var gson = jsonData.somewhere.is.my.gson;
var layer = new OpenLayers.Layer.Vector();
map.addLayer(layer);
layer.addFeatures(geojson_format.read(gson)); 
于 2014-01-15T23:04:52.397 回答