2016-06-20 5 views
0

Ich versuche, eine Vektorschicht in OpenLayers 3 zu zwingen, seine Daten periodisch von einer GeoJSON Quelle neu zu laden. Die GeoJSON-Quelle ändert sich von Zeit zu Zeit.OpenLayers 3: Erzwingen einer Vektorschicht, um GeoJSON Quelle neu zu laden

Nach vielen verschiedenen Versuche mit verschiedenen Methoden, ich denke, das ist die nächste, die ich habe es geschafft, so weit zu kommen:

$(document).ready(function(){ 
    map.once("postcompose", function(){ 
     //start refreshing each 3 seconds 
     window.setInterval(function(){ 
     var source = testLayer.getSource(); 
     var params = source.getParams(); 
     params.t = new Date().getMilliseconds(); 
     source.updateParams(params); 
     }, 3000); 
    }); 
}); 

Doch diese gibt mir die folgenden (alle 3 Sekunden natürlich):

Uncaught TypeError: source.getParams is not a function 

Hier ist der ganze andere Code, den ich verwende, um die GeoJSON-Datei zu laden und anzuzeigen. Die anderen Schichten in der Karte sind in der gleichen Art und Weise geladen:

var testSource = new ol.source.Vector({ 
    url: '/js/geojson/testfile.geojson', 
    format: new ol.format.GeoJSON() 
}); 

... 

window.testLayer = new ol.layer.Vector({ 
    source: testSource, 
    style: function(feature, resolution) { 
     var style = new ol.style.Style({ 
      fill: new ol.style.Fill({color: '#ffffff'}), 
      stroke: new ol.style.Stroke({color: 'black', width: 1}), 
      text: new ol.style.Text({ 
       font: '12px Verdana', 
       text: feature.get('testvalue'), 
       fill: new ol.style.Fill({ 
        color: 'rgba(255, 255, 255, 0.1)' 
       }), 
       stroke: new ol.style.Stroke({ 
        color: 'rgba(0, 0, 0, 1)', 
        width: 1 
       }) 
      }) 
     }); 

     return style 
    } 
}); 

... 

var olMapDiv = document.getElementById('olmap'); 
var map = new ol.Map({ 
    layers: [paddocksLayer,zonesLayer,structuresLayer,roadsLayer,testLayer], 
    interactions: ol.interaction.defaults({ 
     altShiftDragRotate: false, 
     dragPan: false, 
     rotate: false 
    }).extend([new ol.interaction.DragPan({kinetic: null})]), 
    target: olMapDiv, 
    view: view 
}); 
view.setZoom(1); 
view.setCenter([0,0]); 

ich woanders gelesen, dass getParams einfach nicht auf Vektorebene funktioniert, so dass dieser Fehler war nicht ganz unerwartet.

Gibt es eine alternative Methode, die eine Vektorschicht neu lädt (nicht nur neu rendert)?

Vielen Dank im Voraus. Ich muss mich auch im Voraus dafür entschuldigen, da ich wirklich eine spezifische Anleitung dazu brauche - ich bin sehr neu in JS und OpenLayers.

Gareth

+0

Sie werden zeigen müssen, wie Sie (AJAX) Ihre JSON-Datei laden. –

+0

Siehe meine Änderungen oben - Ich verwende AJAX nicht, um GeoJSON beim Initialisieren der Karte zu laden. Soll ich das tun? Der Layer wird korrekt mit dem zusätzlichen Code oben angezeigt - nur nicht aktualisiert. –

Antwort

0

(fiddle)

Sie diese mit einem benutzerdefinierten AJAX Loader erreichen können (wenn Sie passieren url-ol.source.Vector diese AJAX ist auch). Dann können Sie Ihre JSON-Datei wie gewohnt neu laden.

können Sie jede AJAX-Bibliothek verwenden Sie wollen, aber das ist so einfach wie:

var utils = { 
    refreshGeoJson: function(url, source) { 
    this.getJson(url).when({ 
     ready: function(response) { 
     var format = new ol.format.GeoJSON(); 
     var features = format.readFeatures(response, { 
      featureProjection: 'EPSG:3857' 
     }); 
     source.addFeatures(features); 
     source.refresh(); 
     } 
    }); 
    }, 
    getJson: function(url) { 
    var xhr = new XMLHttpRequest(), 
     when = {}, 
     onload = function() { 
      if (xhr.status === 200) { 
      when.ready.call(undefined, JSON.parse(xhr.response)); 
      } 
     }, 
     onerror = function() { 
      console.info('Cannot XHR ' + JSON.stringify(url)); 
     }; 
    xhr.open('GET', url, true); 
    xhr.setRequestHeader('Accept','application/json'); 
    xhr.onload = onload; 
    xhr.onerror = onerror; 
    xhr.send(null); 

    return { 
     when: function(obj) { when.ready = obj.ready; } 
    }; 
    } 
}; 
+0

Danke dafür - ich habe mir nur deine Geige angeschaut und werde es versuchen ... –

+0

Das ist fantastisch - habe ein bisschen herumgespuckt, um es in meinen bestehenden Code zu integrieren, aber es funktioniert! Danke für deine Hilfe - das hätte ich nie alleine gemacht. –

+0

@GarethJones - Ich bin froh, nützlich zu sein. –

Verwandte Themen