Wednesday, 5 October 2016

OpenLayers WFS protocol: work with filters if the protocol is defined out of layer constructor


follow question:wfs-load-feature-check


the scenario is: i am trying to load a WFS layer, since it takes a while to load all features, I want to give user a notice while waiting for response. the process employs spatial filter (BBOX strategy) and attribute filters. I am wondering whether there is a good way to make WFS protocol work with these filters, in other words, only request the filtered features.


thanks a lot!


code sample:


 var wfsLayer = new OpenLayers.Layer.Vector("WFS", {
strategies: [new OpenLayers.Strategy.BBOX()],

styleMap: new OpenLayers.StyleMap({
strokeWidth: 3,
strokeColor: "#333333"
})
});

var filt = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.OR,
filters: [
new OpenLayers.Filter.Comparison({

type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "TYPE",
value: "highway"
}),
new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "TYPE",
value: "road"
})
]

});

var prot = new OpenLayers.Protocol.WFS({
url: "http://demo.opengeo.org/geoserver/wfs",
featureType: "tasmania_roads",
featureNS: "http://www.openplans.org/topp"
});

var _CallBack = function(resp) {
if(resp.error) {

console.log('error');
return -1;
}
wfsLayer.addFeatures(resp.features);
console.log('success');
return 1;
};

var response = prot.read({
callback: _CallBack

});

Answer



If your goal is to know WHEN all features have been added to your wfsLayer so you can hide your "please wait" message, then you could do as neil says and add it all in the vector layer constructor. Then just register the featuresadded event which will be triggered when the features have been added.


Example:


   wfsLayer.events.on({
featuresadded: function(event){
//hide loading notification
alert("I'm done getting features");
}
});


The only down side is what if there is an error? how will or your user know without the callback that has this as a response?


From your previous question, it sounded like you were more interested in the errors it might throw. If this is the case, you can add the filter to your protocol constructor like so:


var prot = new OpenLayers.Protocol.WFS({
url: "http://demo.opengeo.org/geoserver/wfs",
featureType: "tasmania_roads",
featureNS: "http://www.openplans.org/topp",
defaultFilter: filt
});



Here's the working example. Notice how as you pan and zoom the number of features returned are different. This is essentially the same as the strategies: [new OpenLayers.Strategy.BBOX()] but in this case i used map.events.register("moveend", map, QueryWFSService); to do the same thing. Viewsource to view the code.


enter image description here



Working example #2 which does not trigger WFS request on zoom in.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...