OpenLayers 3: Làm thế nào để kiểm tra xem nguồn vector đã sẵn sàng chưa?


8

ol.source.getState()dường như không đáng tin cậy Khi tôi gọi nó trên một nguồn vector, nó trả về sẵn sàng, nhưng các tính năng chưa có sẵn. Mã trông như thế này:

var vectorSource = new ol.source.Vector({
  url: 'world.topo.json',
  format: new ol.format.TopoJSON()
});

// ... init map with vectorSource

console.log(vectorSource.getState()); // returns "ready"
console.log(vectorSource.getFeatureById("US")); // returns null

Bất kỳ cách nào khác để xem nếu một nguồn vector đã sẵn sàng?


Bạn đã kiểm tra nếu ID tính năng này tồn tại?
Jonatas Walker

@JonatasWalker, vâng, nó tồn tại.
johjoh 14/07/2015

Câu trả lời:


8

Bạn có thể cung cấp chức năng trình tải của riêng mình và đặt một số trình nghe tùy chỉnh, như sau:

var source = new ol.source.Vector({
    loader: function(){
        var url = '....../data/json/world-110m.json';
        var format = new ol.format.TopoJSON();
        var source = this;

        //dispatch your custom event
        this.set('loadstart', Math.random());

        getJson(url, '', function(response){

            if(Object.keys(response).length > 0){
                var features = format.readFeatures(response, {
                    featureProjection: 'EPSG:3857'
                });
                source.addFeatures(features);
                //dispatch your custom event
                source.set('loadend', Math.random());
            }
        });
    }
});

Đặt một số trình nghe tùy chỉnh:

//custom source listener
source.set('loadstart', '');
source.set('loadend', '');

source.on('change:loadstart', function(evt){
    console.info('loadstart');
});
source.on('change:loadend', function(evt){
    console.info('loadend');
});

Và một hàm xhr:

var getJson = function(url, data, callback) {

    // Must encode data
    if(data && typeof(data) === 'object') {
        var y = '', e = encodeURIComponent;
        for (x in data) {
            y += '&' + e(x) + '=' + e(data[x]);
        }
        data = y.slice(1);
        url += (/\?/.test(url) ? '&' : '?') + data;
    }

    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", url, true);
    xmlHttp.setRequestHeader('Accept', 'application/json, text/javascript');
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState != 4){
            return;
        }
        if (xmlHttp.status != 200 && xmlHttp.status != 304){
            callback('');
            return;
        }
        callback(JSON.parse(xmlHttp.response));
    };
    xmlHttp.send(null);
};

Bản demo làm việc .


Điều này hoạt động tốt! Xin lỗi vì phê duyệt muộn. Hai năm trước tôi đã không thực sự hiểu nó và tìm ra giải pháp của riêng mình - điều không đáng tin cậy như bây giờ.
johjoh

3

Bạn có thể đính kèm một trình nghe vào vectorSource http://openlayers.org/en/v3.7.0/apidoc/ol.source.Vector.html#once

ví dụ

vectorSource.once('change',function(e){
    if (vectorSource.getState() === 'ready') {
        vectorSource.getFeatureById("US");
    }
});

Vâng, đó là những gì tôi đã làm, nhưng sự kiện sẽ không kích hoạt, nếu nguồn đã được tải trước đó. Vì vậy, tôi muốn kiểm tra xem nguồn đã sẵn sàng chưa. Nếu vậy thì làm việc ngay lập tức - nếu không, hãy liên kết nó với sự kiện thay đổi.
johjoh

0

Tôi đã kết thúc với hàm sau, để thực thi mã khi nguồn vector sẵn sàng:

doWhenVectorSourceReady : function(callback) {
  var map = this;

  if (map.vectorSource.getFeatureById("US")) { // Is this a relieable test?
    callback();
  } else {
    var listener = map.vectorSource.on('change', function(e) {
      if (map.vectorSource.getState() == 'ready') {
        ol.Observable.unByKey(listener);
        callback();
      }
    });
  }
}

Tôi không chắc việc kiểm tra một tính năng có đáng tin hay không, vì có thể, không phải tất cả các tính năng đều khả dụng cùng một lúc.


Điều này là không đáng tin cậy, vì nó bật ra bây giờ. Kiểm tra một tính năng, không cho biết các tính năng khác có ở đó không. Xem câu trả lời được chấp nhận. Nó hoạt động tốt cho tôi.
johjoh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.