2016-11-03 3 views
0

Ich arbeite daran, eine aktualisierbare Vektorschicht in meinen Phonegap Build mit OpenLayers 3 einzubauen. Es prüft den Server auf Updates und lädt bei Bedarf eine neue Datei herunter.Phonegap - Ich kann nicht auf GeoJson zugreifen, das im Datenverzeichnis gespeichert ist

Ich kann die Datei herunterladen und speichern Sie kein Problem (Ich verwende den gleichen Code in anderen Anwendungen für Nicht-Geojson-Dateitypen ohne Probleme). Ich habe es die Existenz mit dem überprüft folgenden:

var resortURL = cordova.file.dataDirectory + "resorts.geojson"; 
window.resolveLocalFileSystemURL(resortURL,function(e){ 
    console.log("located"); 
},function(e){ 
    console.log("missing"); 
}); 

Wenn ich die Datei mit OL gehen zuzugreifen:

var resortSource = new ol.source.Vector({ 
    url: resortURL, 
    format: new ol.format.GeoJSON() 
}); 
var resortBoundary = new ol.layer.Vector({ 
    source: resortSource 
}); 
map.addLayer(resortBoundary); 

Die oben nicht alle Daten auf die Karte hinzuzufügen, obwohl es das nicht hinzufügen Schicht. aus dem Vermögen Standort funktioniert genau

url: "json/resorts.geojson" 

Anfordern die Datei wie erwartet: Ich habe sogar noch weiter und fügte die GeoJSON Datei direkt in dem Vermögen www Ordner Präbuildereignis und zugegriffen es mit gegangen. Das Problem ist, wenn ich versuche, darauf zuzugreifen, nachdem ich es auf Android in das Datenverzeichnis heruntergeladen habe, und dann versuche, durch dort zuzugreifen. Fehle ich etwas? Ich habe alles unter der Sonne versucht, um es zum Laufen zu bringen.

+0

Was sagt Ihre Webkonsole über die Geojson-Datei unter der Registerkarte "Netzwerk"? Zeigt es eine Anfrage für die Geojson-Datei? war es gelesen ?? Was bedeutet 'resortSource.getFeatures(). Length'? – GoinOff

+0

@GoinOff Die Länge des Arrays ist Null. Die Registerkarte Netzwerk zeigt an, dass die Anforderung mit einer Dateigröße von 0 ausgeht. Sie sieht genauso aus, wenn sie funktioniert, außer dass der Status auf der Netzwerkregisterkarte "Fertig" anstatt der typischen 200 anzeigt. Das habe ich noch nie zuvor gesehen. – MappingJordan

+0

Ich hatte zahlreiche Browser-Caching-Probleme mit 'URL'-Eigenschaft von' ol.source.Vector', wo es eine alte Version der Geojson-Datei verwendet. Haben Sie versucht, Ihren Cache in Ihrem Webbrowser zu löschen? Sind Sie sicher, dass die Geojson-Datei gültigen Geojson enthält? http://geojson.org/geojson-spec.html – GoinOff

Antwort

0

Verwenden Sie die Vektorladerfunktion, um die geojson-Dateien abzurufen. Ich hatte zahlreiche Caching-Probleme, die keine Vektorladefunktion zum Abrufen von Geojson-Dateien verwenden, und die unten beschriebene Methode beseitigte dieses Problem. Zum Beispiel:

var utils = { 
    refreshGeoJson: function(source,url) { 
     var now = Date.now(); 
     if (typeof url == 'undefined') { 
     url = source.getUrl(); 
     } 
     url += '?t=' + now; //Add current time to prevent browser caching 
     console.info('refreshGeoJson url: ' + url); 
      this.getJson(url).when({ 
     ready: function(response) { 
      var format = new ol.format.GeoJSON(); 
      var features = format.readFeatures(response, { 
      featureProjection: 'EPSG:3857' 
      }); 
      console.dir(features); 
      console.log(features.length); 
      source.addFeatures(features); 
      source.changed(); 
     } 
     }); 
}, 
    getJson: function(url) { 
      var xhr = new XMLHttpRequest(), 
      when = {}, 
      onload = function() { 
     console.log('xhr.status onload() ' + xhr.status); 
     if (xhr.status === 200) { 
     console.log('getJson() xhr: '); 
     console.dir(xhr); 
     console.log('getJson() xhr.response: '); 
     console.dir(xhr.response); 
        when.ready.call(undefined, JSON.parse(xhr.response)); 
      } 
     if (xhr.status === 404) { 
      console.log('file not found! url: ' + url); 
      alert("file not found!\n" + url); 
     } 
      }, 
      onerror = function() { 
      console.info('Cannot XHR ' + JSON.stringify(url)); 
      }; 
     //console.log('getJson() - retrieve file url: ' + url); 
      xhr.open('GET', url, true); 
      xhr.setRequestHeader('cache-control', 'no-store'); 
      xhr.onload = onload; 
      xhr.onerror = onerror; 
      xhr.send(null); 
      return { 
     when: function(obj) { when.ready = obj.ready; } 
     }; 
    } 
}; 

var vectorLoader = function(extent, resolution, projection) { 
    utils.refreshGeoJson(this); 
} 

var resortSource = new ol.source.Vector({ 
    url: /path-to/myFile.geojson', 
    format: new ol.format.GeoJSON({ 
     defaultDataProjection :'EPSG:3857' 
    }), 
    loader: vectorLoader, 
    strategy: ol.loadingstrategy.all 
    }); 

Wenn ein Syntax Problem mit Ihrer GeoJSON Datei ist, wird es hier when.ready.call(undefined, JSON.parse(xhr.response)); scheitern. Dies gibt Ihnen mehr Kontrolle über die Dinge, anstatt nur die URL-Eigenschaft ohne die Vector Loader-Funktion zu verwenden.

+0

Also hab ich das mal versucht und immer noch keine Würfel, ich schätze den eingehenden Code mit Kommentar! Es protokolliert "xhr.status onload() 0". – MappingJordan

+0

Da Sie einen 0 (Null) Rückkehrcode von XHR Anruf erhalten haben, würde ich diese Beiträge überprüfen: http://Stackoverflow.com/questions/3825581/does-an-http-status-code-of-0-have- any-meaning und http://stackoverflow.com/questions/872206/http-status-code-0-what-does-this-mean-in-ms-xmlhttp – GoinOff

+0

Überprüfen Sie auch Ihre Webserver-Protokolldatei und sehen Sie, ob Anfrage, wenn Sie es zum Server machen oder nicht ??? – GoinOff

Verwandte Themen