[OpenLayers-Users] Features Not Added to Vector Layer

Phil Scadden p.scadden at gns.cri.nz
Wed Mar 13 18:46:03 PDT 2013


I'm not convinced you have anything that would cause the 
beforefeatureadded to be triggered? I would have to say that while I 
dont know your application strategy, it seems counterintuitive to me. 
Maybe my way of doing lacks elegance, but here is my strategy for doing 
what I think you want to do:

1/ Create a general purpose vector layer.
selectedLayer = new OpenLayers.Layer.Vector("Selected Layer", {
     wrapDateLine: true,
     displayOutsideMaxExtent: true,
     displayInLayerSwitcher: false,
     attribution: "<a  href='http://www.gns.cri.nz' 
target='metadata'><img src='images/GNS_logo_mini.png'></a>"
});
map.addLayer(selectedLayer);

2/ Add in my other layers.

3/ create wfsprotocols for WFS query layers
                 lay.wfsProtocol = new OpenLayers.Protocol.WFS.v1_1_0({
                     url: spatialQueryNode.url,
                     featurePrefix: spatialQueryNode.featurePrefix,
                     featureType: spatialQueryNode.featureType,
                     srsName: "EPSG:900913"
                 });
4/ Now set up query strategies. To query by polygon, I do
             polySelCtrl = new 
OpenLayers.Control.DrawFeature(selectedLayer, OpenLayers.Handler.Polygon, {
                 geodesic: true,
                 handlerOptions: {
                     citeCompliant: false
                 }
             });
(the citecompliant stuff is about crossing 180 line). It draws onto the 
general purpose vector layer.
Actually do the query with this.
             polySelCtrl.events.register("featureadded", this, function 
(e) {
                 clearData(); // clean up popups etc, clear the 
selectLayer of features
wrapDateline(e.feature.geometry,map.baseLayer.maxExtent); // deals with 
dateline issues
                 var pfilter = new OpenLayers.Filter.Spatial({
                     type: OpenLayers.Filter.Spatial.INTERSECTS,
                     value: e.feature.geometry
                 });
                  map.div.style.cursor = 'wait';
                  loadingPanel.maximizeControl();

                 wfsProtocol.read({
                     filter:  pfilter,
                     propertyNames:propNames,
                     callback: processSpatialQuery,
                     scope: strategy
                 });
             });

processSpatialQuery deals with the returned values.
I do something very similar for mouse-click event creating a BBOX or 
DWithin filter
(            ptSelCtrl = new 
OpenLayers.Control.DrawFeature(selectedLayer, OpenLayers.Handler.Point,{
                 handlerOptions: {
                     citeCompliant: true
                 }
             });
) but you can use getFeature or similar instead.

If you want query based on filter of feature values, then you create the 
filter (eg
             var filter = new OpenLayers.Filter.Comparison({
                 type: OpenLayers.Filter.Comparison.LIKE,
                 matchCase:false,
                 property: fld.name,
                 value: "*" + searchText + "*"
             });
)
and action it with:
wfsProtocol.read({
        filter: new OpenLayers.Filter.Logical({
                 type: OpenLayers.Filter.Logical.OR,
                 filters: filter
         }),
         callback: processSpatialQuery,
         scope: strategy
      });
(Same callback!)

processSpatialQuery can be rather complex, but in skeleton:
     selectedLayer.destroyFeatures();
     map.div.style.cursor = 'default';
     loadingPanel.minimizeControl();
    ....
and
   selectedLayer.addFeatures(request.features)

In summary have a general purpose selectedLayer for drawing and 
highlighting; centralised request handlers (processSpatialQuery) used 
for point, polygon and text queries, and used the wfsprotocol handler 
throughout.

Not shown, but I actually add the wfsprotocol and point/poly controls to 
the layer object.

I hope that might help.


Notice: This email and any attachments are confidential.
If received in error please destroy and immediately notify us.
Do not copy or disclose the contents.



More information about the Users mailing list