Veel

OpenLayers 3: Kuidas kontrollida, kas vektorallikas on valmis?

OpenLayers 3: Kuidas kontrollida, kas vektorallikas on valmis?


ol.source.getState ()ei tundu usaldusväärne. Kui nimetan seda vektorallikaks, naaseb see valmis, kuid funktsioonid pole veel saadaval. Kood näeb välja selline:

var vectorSource = uus ol.source.Vector ({url: 'world.topo.json', formaat: uus ol.format.TopoJSON ()}); //… algatage kaart vectorSource console.logiga (vectorSource.getState ()); // tagastab "ready" konsooli.log (vectorSource.getFeatureById ("US")); // tagastab nulli

Kas on mõni muu viis, kuidas vektorallikas valmis on?


Võite pakkuda oma laadimisfunktsiooni ja määrata mõned kohandatud kuulajad järgmiselt:

var source = uus ol.source.Vector ({loader: function () {var url = '… /andmed/json/world-110m.json'; var format = new ol.format.TopoJSON (); var source = this ; // saatke oma kohandatud sündmus this.set ('loadstart', Math.random ()); getJson (url, ", function (response) {if (Object.keys (response) .length> 0) {var features = format.readFeatures (vastus, {featureProjection: 'EPSG: 3857'}); source.addFeatures (features); // saatke teie kohandatud sündmus source.set ('loadend', Math.random ());}});} });

Määrake mõned kohandatud kuulajad:

// kohandatud allikakuulaja source.set ('loadstart', "); source.set ('loadend',"); source.on ('change: loadstart', function (evt) {console.info ('loadstart');}); source.on ('muutus: loadend', function (evt) {console.info ('loadend');});

Ja funktsioon xhr:

var getJson = function (url, data, callback) {// Peab kodeerima andmed, kui (data && typeof (data) === 'objekt') {var y = ", e = encodeURIComponent; for (x andmetes) {y + = '&' + e (x) + '=' + e (andmed [x]);} andmed = y.viil (1); URL + = (/?/.test(url)? '&' : '?') + andmed;} 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) {tagasihelistamine ("); tagasi; } tagasihelistamine (JSON.parse (xmlHttp.response)); }; xmlHttp.send (null); };

Töötav demo.


Saate oma vektoriallikale lisada kuulaja: http://openlayers.org/en/v3.7.0/apidoc/ol.source.Vector.html#once

nt.

vectorSource.once ('muutus', funktsioon (e) {if (vectorSource.getState () === 'valmis') {vectorSource.getFeatureById ("US");}});

Lõpetasin järgmise funktsiooni, et käivitada kood, kui vektorallikas on valmis:

doWhenVectorSourceReady: funktsioon (tagasihelistamine) {var map = this; if (map.vectorSource.getFeatureById ("US")) {// Kas see on usaldusväärne test? helista tagasi(); } else {var kuulaja = map.vectorSource.on ('muuda', funktsioon (e) {if (map.vectorSource.getState () == 'valmis') {ol.Observable.unByKey (kuulaja); tagasihelistus (); }}); }}

Ma pole kindel, kas ühe funktsiooni testimine on usaldusväärne, nagu see võib ka olla, et mitte kõik funktsioonid pole korraga saadaval.


Vaata videot: Openlayers 6 Tutorial #3 - First Web Map