[OpenLayers-Users] Features Not Added to Vector Layer
Jerome A. Wendell
jawendell at digitalmapping.com
Wed Mar 13 19:31:56 PDT 2013
Phil,
Thanks for your detailed answer. I will review it in detail and try to
apply your methodology to my case. I will post again with the results.
Thanks,
Jerome
-----Original Message-----
From: openlayers-users-bounces at lists.osgeo.org
[mailto:openlayers-users-bounces at lists.osgeo.org] On Behalf Of Phil Scadden
Sent: Wednesday, March 13, 2013 9:46 PM
To: openlayers-users at lists.osgeo.org
Subject: Re: [OpenLayers-Users] Features Not Added to Vector Layer
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.
_______________________________________________
Users mailing list
Users at lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/openlayers-users
More information about the Users
mailing list