Ecco il mio scenario. La pagina viene caricata e la mappa viene caricata con un livello vettoriale vuoto. Quindi è lì, ma non ha caratteristiche. Quindi l'utente fa clic su un pulsante e un filtro CQL carica le funzionalità in base alle impostazioni CQL.Impossibile impostare il filtro WFS la seconda volta
La mia metodologia per implementare questo. Ho impostato un livello vettoriale vuoto, senza loader
o strategy
. Il pulsante che l'utente per la prima volta chiama una funzione "inizializzazione" (= firstTimeOnly()
) che:
fissa un
loader
estrategy
allo strato vettoreora che un
loader
esiste, chiamate un'altra funzione "filtro" (=changeFilter()
) che
azzera i filtri CQL della pala e carichi offre- ora la funzione "filtro" si attacca al pulsante e chiamato
con ogni clic. La funzione "inizializzazione" è servita allo scopo
e si stacca dal pulsante.
Ecco il mio codice
<button id= "magicButton", onclick="firstTimeOnly()">Click me</button>
//set globals to use them
var cqlFilter = "name='testpoint9'";
var urlTemplate = 'http://localhost:5550/geoserver/mymap/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=mymap:layerName&CQL_FILTER={{CQLFILTER}}&outputFormat=application/json';
var loader = function (extent) {
var url = urlTemplate.replace('{{CQLFILTER}}', cqlFilter);
$.ajax(url, {
type: 'GET',
success: function(response) {
var res = response;
var geojsonFormat = new ol.format.GeoJSON();
sourceVector.addFeatures(geojsonFormat.readFeatures(response));
}
})
};
var strategy = new ol.loadingstrategy.tile(ol.tilegrid.createXYZ({maxZoom: 20}));
//empty vector source
var sourceVector = new ol.source.Vector({});
function changeFilter() {
//remove all, set cql and reload
var featsToRemove = layerVector.getSource().getFeatures();
for (var f=0;f<featsToRemove.length;f++)
{
layerVector.getSource().removeFeature(featsToRemove[f]);
}
cqlFilter = "name LIKE 'p'";
sourceVector.clear(true);
}
layerVector = new ol.layer.Vector({
source: sourceVector,
style:styleFunction
});
function firstTimeOnly() {
sourceVector.set('loader', loader);
sourceVector.set('strategy', strategy);
changeFilter();
document.getElementById("magicButton").removeEventListener("click", firstTimeOnly, false);
document.getElementById("magicButton").addEventListener("click", changeFilter, false);
}
Questo si basa per erilem's code per il filtro CQL ripristino e se uso solo il suo codice funziona bene. Ma se voglio iniziare con un livello vuoto e modificarlo come sopra, non ottengo nulla. Il mio codice non dà errori. Ma se faccio clic sul pulsante non ottengo nulla.
Si prega di farmi come risolvere questo problema. O forse è eccessivo e tu suggerisci qualcosa di più intelligente.
Grazie
UPDATE
se metto
console.log("loader "+sourceVector.get('loader'));
alla fine del changeFilter ottengo la funzione caricatore. Quindi, credo che la prima volta che clicco il pulsante, il primo TimeOnly imposta effettivamente un loader e chiama changeFilter. Quindi, il caricatore è lì, ma non funziona? Qualsiasi aiuto?
Sì, hai ragione, ha a che fare con l'aggiunta/rimozione di ascoltatori in Javascript e non Openlayers. Scusate, sono dovuto andare per un paio di giorni e non ho avuto accesso ad un pc, quindi non ho potuto darti i punti di merito. La prima risposta suppone di prendere automaticamente i punti. Li hai presi? – slevin
Non l'ho fatto, probabilmente perché non avevo voti quando è scaduto. Nessuna preoccupazione però. – fuzetsu