OpenLayers 2 có các sự kiện lớp này "loadstart & loadend."
Điều gì tương đương với họ trong OpenLayers 3?
Trong khi một lớp vectơ tải và được hiển thị, tôi cần hiển thị biểu tượng tải.
OpenLayers 2 có các sự kiện lớp này "loadstart & loadend."
Điều gì tương đương với họ trong OpenLayers 3?
Trong khi một lớp vectơ tải và được hiển thị, tôi cần hiển thị biểu tượng tải.
Câu trả lời:
Giả sử bạn sử dụng một ol.layer.Vector
với một ol.source.GeoJSON
bạn có thể sử dụng một cái gì đó như thế này:
var vectorSource = new ol.source.GeoJSON({
projection : 'EPSG:3857',
url: 'http://examples.org/fearures.json'
});
var vectorLayer = new ol.layer.Vector({
source: vectorSource
});
map.addLayer(vectorLayer);
// show loading icon
// ...
var listenerKey = vectorSource.on('change', function(e) {
if (vectorSource.getState() == 'ready') {
// hide loading icon
// ...
// and unregister the "change" listener
ol.Observable.unByKey(listenerKey);
// or vectorSource.unByKey(listenerKey) if
// you don't use the current master branch
// of ol3
}
});
Điều này cho thấy làm thế nào để có được một thông báo khi nguồn vector được tải. Nó chỉ hoạt động với các nguồn kế thừa từ ol.source.StaticVector
. Ví dụ bao gồm ol.source.GeoJSON
và ol.source.KML
.
Ngoài ra, lưu ý rằng mã này có thể không còn hoạt động trong tương lai khi ol3 sẽ cung cấp một cách nhất quán để biết nếu / khi một nguồn được tải.
vectorSource.once('change', function(e){...}
?
Trong phiên bản ol3 3.10.0 mọi thứ đã thay đổi. Như vậy là rõ ràng hơn các phiên bản cũ nhưng vẫn phức tạp hơn ol2.
Vì vậy, đối với các lớp TILE (ol.layer.Tile), mã snip của bạn sẽ trông như sau:
//declare the layer
var osmLayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
//asign the listeners on the source of tile layer
osmLayer.getSource().on('tileloadstart', function(event) {
//replace with your custom action
document.getElementById('tilesloaderindicatorimg').src = 'css/images/tree_loading.gif';
});
osmLayer.getSource().on('tileloadend', function(event) {
//replace with your custom action
document.getElementById('tilesloaderindicatorimg').src = 'css/images/ok.png';
});
osmLayer.getSource().on('tileloaderror', function(event) {
//replace with your custom action
document.getElementById('tilesloaderindicatorimg').src = 'css/images/no.png';
});
trong khi đối với các lớp WMS thì cách tiếp cận hơi khác một chút:
//declare the layer
var wmsLayer = new ol.layer.Image({
source: new ol.source.ImageWMS({
attributions: [new ol.Attribution({
html: '© ' +
'<a href="http://www.geo.admin.ch/internet/geoportal/' +
'en/home.html">' +
'National parks / geo.admin.ch</a>'
})],
crossOrigin: 'anonymous',
params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
serverType: 'mapserver',
url: 'http://wms.geo.admin.ch/'
})
});
//and now asign the listeners on the source of it
var lyrSource = wmsLayer.getSource();
lyrSource.on('imageloadstart', function(event) {
console.log('imageloadstart event',event);
//replace with your custom action
var elemId = event.target.params_.ELEMENTID;
document.getElementById(elemId).src = 'css/images/tree_loading.gif';
});
lyrSource.on('imageloadend', function(event) {
console.log('imageloadend event',event);
//replace with your custom action
var elemId = event.target.params_.ELEMENTID;
document.getElementById(elemId).src = 'css/images/ok.png';
});
lyrSource.on('imageloaderror', function(event) {
console.log('imageloaderror event',event);
//replace with your custom action
var elemId = event.target.params_.ELEMENTID;
document.getElementById(elemId).src = 'css/images/no.png';
});
Đối với các lớp Vector WFS, mọi thứ thậm chí còn phức tạp hơn:
//declare the vector source
sourceVector = new ol.source.Vector({
loader: function (extent) {
//START LOADING
//place here any actions on start loading layer
document.getElementById('laodingcont').innerHTML = "<font color='orange'>start loading.....</font>";
$.ajax('http://demo.opengeo.org/geoserver/wfs', {
type: 'GET',
data: {
service: 'WFS',
version: '1.1.0',
request: 'GetFeature',
typename: 'water_areas',
srsname: 'EPSG:3857',
bbox: extent.join(',') + ',EPSG:3857'
}
}).done(loadFeatures)
.fail(function () {
//FAIL LOADING
//place here any actions on fail loading layer
document.getElementById('laodingcont').innerHTML = "<font color='red'>error loading vector layer.</font>";
});
},
strategy: ol.loadingstrategy.bbox
});
//once we have a success responce, we need to parse it and add fetaures on map
function loadFeatures(response) {
formatWFS = new ol.format.WFS(),
sourceVector.addFeatures(formatWFS.readFeatures(response));
//FINISH LOADING
document.getElementById('laodingcont').innerHTML = "<font color='green'>finish loading vector layer.</font>";
}
kiểm tra bài này nó có tất cả những điều trên + một câu đố cho các lớp vectơ WFS
Tôi đã không tìm thấy lớp học ol.source.GeoJSON
, và không thể tìm thấy một trường hợp vectorSource.getState() != 'ready'
. Vì vậy, tôi đã kết thúc việc làm như thế này:
function spin(active) {
if (active) {
// start spinning the spinner
} else {
// stop spinning the spinner
}
}
// Toggle spinner on layer loading
layer.on('change', function() {
spin();
});
layer.getSource().on('change', function() {
spin(false);
});
bạn cũng có thể sử dụng getState () chức năng
if (source instanceof ol.source.Vector) {
source.on("change", function () {
//console.log("Vector change, state: " + source.getState());
switch (source.getState()) {
case "loading":
$("#ajaxSpinnerImage").show();
break;
default:
$("#ajaxSpinnerImage").hide();
}
});
}
source.getState()
luôn luôn trả về 'sẵn sàng'
Trên OL 4.5.0, đối với các lớp vectơ tôi chưa tìm được cách xử lý nguồn, thay vào đó tôi sử dụng các cách sau trên các sự kiện của lớp:
if (layer instanceof ol.layer.Vector) {
layer.on("precompose", function () {
$("#ajaxSpinnerImage").show();
});
layer.on("render", function () {
$("#ajaxSpinnerImage").hide();
});
}
Hy vọng nó có thể giúp đỡ.