[OpenLayers-Dev] DrawFeature.featureAdded() - called in wrong
place?
Tim Schaub
noreply at geocartic.com
Fri Apr 6 12:04:26 EDT 2007
Jeff Dege wrote:
> I'm trying to create two controls on a tool bar, both of which draw
> polygons, but where what happens after the polygon is drawn would be
> different. I had noticed that in EditingToolBar.js, each control is
> assigned a featureAdded() function that sets the state of the feature to
> OpenLayers.State.INSERT. I'd thought that I could use this function to
> set a different state, or to add my own status attribute to the feature,
> and then check on the value of that state in
> Layer.Vector.onFeatureInsert().
>
> But in Control\DrawFeature.js, the drawFeature() function calls
> this.featureAdded() after it calls this.layer.addFeatures(), so there's
> no way in onFeatureInsert() to distinguish which control created the
> feature.
You have 3 or 4 dozen options here.
First, the layer calls onFeatureInsert - so you're right, you have no
way of knowing what did the feature adding by the time that gets called.
The DrawFeature control calls featureAdded (past tense) after the
feature has been added to the layer - so here also, you're too late if
you want to do something with the feature before it gets added to the
layer. It wouldn't make any sense to call featureAdded before the
feature gets added to the layer.
If you look at the DrawFeature control, you'll see that it sets its own
drawFeature method as the "done" callback for the handler that actually
does the drawing. So, you're drawing polygons. The DrawFeature control
is using the PolygonHandler in this case. The DrawFeature control is
constructing the PolygonHandler with callbacks that look like {done:
this.drawFeature} (where this is the DrawFeature control).
So, while the DrawFeature control is not really meant to be used to do
anything custom with features *before* they are added to a layer (more
on this below) - you could customize this control to do what you want.
If you construct your DrawFeature control with something like:
var options = {drawFeature: myDrawFeature};
var control = new OpenLayers.Control.DrawFeature(
layer, OpenLayers.Handler.Polygon, options);
and myDrawFeature is something like:
function myDrawFeature(geometry) {
var feature = new OpenLayers.Feature.Vector(geometry);
// do something with feature before it is added to the layer
// at this point you know which control did the drawing
layer.addFeatures([feature]);
control.featureAdded(feature);
}
All that said, I wonder if you really need to be using the DrawFeature
control at all. If you want users to digitize polygons, and then you
want to do a lot of custom stuff *before* adding the features to a
layer, then it sounds to me like you should make a custom control that
uses the polygon handler.
I recognize that this is too much for one email already. If you want to
create your own control that uses the polygon handler (i.e. if the above
solution doesn't look good to you), write back and I can show a quick
example of an alternative.
Hope that helps,
Tim
More information about the Dev
mailing list