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

Josh Rosenthal maric423 at gmail.com
Wed Apr 22 19:49:17 EDT 2009


D'oh!  Yes, that should have been obvious.  Either use whatever is being
triggered by the modify callback, or set a custom one if the control isn't
already using one.
Much obliged,

Josh


On Wed, Apr 22, 2009 at 4:35 PM, Andreas Hocevar <ahocevar at opengeo.org>wrote:

> Josh Rosenthal wrote:
>
>> 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?
>>
>
> The best way to achieve this would be to listen for the sketchmodified
> event of the DrawFeature control. this is what actually gets triggered in
> the modify callback of the handler that is configured with DrawFeature.
>
> Regards,
> Andreas.
>
>
>> 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<mailto:
>> 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 <mailto: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 <mailto:Users at openlayers.org>
>>    http://openlayers.org/mailman/listinfo/users
>>
>>
>>
>
> --
> Andreas Hocevar
> OpenGeo - http://opengeo.org/
> Expert service straight from the developers.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/openlayers-users/attachments/20090422/57623d64/attachment.html


More information about the Users mailing list