[OpenLayers-Users] Measure Control - get distance on mouse move - part 2

Josh Rosenthal maric423 at gmail.com
Wed Apr 22 14:18:20 EDT 2009


Hi Andreas,
Thanks a lot for the solution using callbacks.  I was wondering if you could
suggest how that might be adapted to give the measurements on a draw
feature.  It's much easier than what I was previously doing for measure and
drawFeature (passing a customized modifyFeature function in the options,
where the new function was the same as the original, but also had the
requisite getLength statements - functional, but it seems like this should
be far more version dependent than the callback solution).

When I try to use callbacks-modify on a drawFeature (as below), my modify
callback doesn't seem to get used (the console.log(this) never fires).  I
assume this is because measureControls didn't already use a modify callback,
whereas drawFeature does, and as such drawFeature overrides any modify
callback I might try to pass in?  Is there any way to append to the normal
modify callback?  Am I missing something obvious?

Thanks!

Josh

broken: uses callbacks - modify:
 selectDrawCircle = new OpenLayers.Control.DrawFeature(selectLayerPoly,
                        OpenLayers.Handler.RegularPolygon,{
                            displayClass:"olControlSelectDrawCircle",

 element:document.getElementById('SelectControl_Distance'),

 unitElement:document.getElementById('SelectControl_mapUnit'),
                            callbacks:{
                                modify: function (point,feature) {
                    console.log(this);
                                  this.element.value=this.radius.toFixed(2);

 this.unitElement.innerHTML=this.map.getUnits();

                             }
                            },
                            handlerOptions:{
                                sides:40
                                  }
                                });

functional: uses slightly customized modifyGeometry function passed in as an
option
                 selectDrawCircle = new
OpenLayers.Control.DrawFeature(selectLayerPoly,
                        OpenLayers.Handler.RegularPolygon,{
                            displayClass:"olControlSelectDrawCircle",
                            handlerOptions:{
                                sides:40,

 element:document.getElementById('SelectControl_Distance'),

 unitElement:document.getElementById('SelectControl_mapUnit'),
                                modifyGeometry: function() {
                                    var angle, dx, dy, point;
                                    var ring =
this.feature.geometry.components[0];
                                    // if the number of sides ever changes,
create a new geometry
                                    if(ring.components.length != (this.sides
+ 1)) {
                                        this.createGeometry();
                                        ring =
this.feature.geometry.components[0];
                                    }
                                    for(var i=0; i<this.sides; ++i) {
                                        point = ring.components[i];
                                        angle = this.angle + (i * 2 *
Math.PI / this.sides);
                                        point.x = this.origin.x +
(this.radius * Math.cos(angle));
                                        point.y = this.origin.y +
(this.radius * Math.sin(angle));
                                        point.clearBounds();
                                    }
                                    // note, only val b/c this is an input
field.
                                  this.element.value=this.radius.toFixed(2);

 this.unitElement.innerHTML=this.map.getUnits();
                                }
                         }});


On Wed, Apr 22, 2009 at 8:22 AM, Andreas Hocevar <ahocevar at opengeo.org>wrote:

> Hi,
>
> the solution (if you're using trunk or 2.8) is quite simple. The snippet
> below replaces the definition of measureControls in the measure example
> (starting around L65)
>
>            measureControls = {
>                line: new OpenLayers.Control.Measure(
>                    OpenLayers.Handler.Path, {
>                        callbacks: {
>                            modify: function(point, feature) {
>                                measureControls.line.measurePartial(point,
>                                        feature.geometry);
>                            }
>                        },
>                        persist: true,
>                        handlerOptions: {
>                            layerOptions: {styleMap: styleMap}
>                        }
>                    }
>                ),
>                polygon: new OpenLayers.Control.Measure(
>                    OpenLayers.Handler.Polygon, {
>                        callbacks: {
>                            modify: function(point, feature) {
>
> measureControls.polygon.measurePartial(point,
>                                        feature.geometry);
>                            }
>                        },
>                        persist: true,
>                        handlerOptions: {
>                            layerOptions: {styleMap: styleMap}
>                        }
>                    }
>                )
>            };
>
> As you can see, the trick is to add a modify callback to the handler,
> calling the control's measurePartial method.
>
> Regards,
> Andreas.
>
> pribram pribram wrote:
> > Hi,
> > Is there anything new about measuring + getting distance on mousemove?
> >
> http://n2.nabble.com/Measure-Control---get-distance-on-mouse-move-td2503580.html
> > If there is a solution, please publish it.
> >
> > Thanks,
> > Pribram
> > _______________________________________________
> > Users mailing list
> > Users at openlayers.org
> > http://openlayers.org/mailman/listinfo/users
> >
>
>
> --
> Andreas Hocevar
> OpenGeo - http://opengeo.org/
> Expert service straight from the developers.
>
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/openlayers-users/attachments/20090422/fb46fa36/attachment.html


More information about the Users mailing list