Rich,
I've done this recently, I've attached the code. Its mixed with some
application-specific stuff and is configured to show text distances on
each segment but it does show how to do something differently on move
vs click
Cheers
Paul
OpenLayers.Control.Measure.prototype.EVENT_TYPES = ['measure',
'measurepartial', 'measuredynamic'];
measureControl = new OpenLayers.Control.Measure(
OpenLayers.Handler.Path, {
textNodes: null,
showDistances: !Browser.Engine.trident,
persist: true,
geodesic: true,
partialDelay: 300,
callbacks: {
create: function() {
this.showDistances = !Browser.Engine.trident;
this.textNodes = [];
rulerLayer.layer.removeFeatures(
rulerLayer.layer.features);
},
modify: function(point, line) {
// introduce a delay for IE browsers so they will
// draw the first segment
if (!this.showDistances) {
return;
}
var len = line.geometry.components.length;
var from = line.geometry.components[len - 2];
var to = line.geometry.components[len - 1];
var ls = new OpenLayers.Geometry.LineString([
from,to]);
var dist = this.getBestLength(ls);
if (!dist[0]) {
return;
}
var total = this.getBestLength(line.geometry);
var label;
if (dist[1] == 'm') {
label = dist[0].toFixed(0)+dist[1];
} else {
label = dist[0].toFixed(2)+dist[1];
}
var textNode = this.textNodes[len-2] || null;
if (textNode && !textNode.layer) {
this.textNodes.pop();
textNode = null;
}
if (!textNode) {
var c = ls.getCentroid();
textNode = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(c.x,c.y),
{}, {
label: '',
fontColor: "#00F",
fontSize: "14px",
fontFamily: "Arial",
fontWeight: "bold",
labelAlign: "cm"
});
this.textNodes.push(textNode);
rulerLayer.layer.addFeatures([textNode]);
}
textNode.geometry.x = (from.x+to.x)/2;
textNode.geometry.y = (from.y+to.y)/2;
textNode.style.label = label;
textNode.layer.drawFeature(textNode);
this.events.triggerEvent('measuredynamic', {
measure: dist[0],
total: total[0],
units: dist[1],
order: 1,
geometry: ls
});
}
},
handlerOptions: {
layerOptions: {
styleMap: new OpenLayers.StyleMap({'default': {
strokeColor: "#00F",
strokeOpacity: 0.3,
strokeWidth: 5,
strokeLinecap: 'square',
fillColor: "#FFF",
fillOpacity: 0,
pointRadius: 0,
pointerEvents: "visiblePainted",
label : ""
}})
}
}
}
);
var hasMeasure = false;
measureControl.events.on({
measurepartial: function(evt) {
measureControl.showDistances = true;
if (hasMeasure) {
$('RulerTotal').set('html','');
hasMeasure = false;
}
},
measuredynamic: function(evt) {
if (hasMeasure) {
$('RulerTotal').set('html','');
hasMeasure = false;
}
var measure = evt.total;
var units = evt.units;
var label;
if (units == 'm') {
label = measure.toFixed(0)+units;
} else {
label = measure.toFixed(2)+units;
}
$('RulerTotal').set('html', label);
},
measure: function(evt) {
var measure = evt.measure;
var units = evt.units;
var label;
if (units == 'm') {
label = measure.toFixed(0)+units;
} else {
label = measure.toFixed(2)+units;
}
$('RulerTotal').set('html', label);
hasMeasure = true;
var features = [];
measureControl.handler.layer.features.each(function(f){
features.push(f.clone());
});
rulerLayer.layer.addFeatures(features);
measureControl.cancel();
}
});
On 2009-09-18, at 9:39 AM, Richard Greenwood wrote:
On Fri, Sep 18, 2009 at 1:47 AM, Andreas Hocevar
<ahoce...@opengeo.org> wrote:
Hey-
Richard Greenwood wrote:
I'm trying to make sense of measure versus measurepartial event
types
in OL 2.8. Mouse moves and single clicks both report an event type
of
"measurepartial". Only a double click report a "measure" event
type. I
would like to distinguish between an mouse move (rubber band) and a
single click (which creates a new vertex in the line string). The
only
way I have figured out so far to do this is to monitor the length of
event.geometry.components but it seems like there should be a better
way, which possibly I am missing.
The Measure control does not register a callback for the handler's
modify event, which means that you normally receive a measurepartial
event on a single click and a measure event on double click. If you
also
receive measurepartial on mouse move, then you have configured your
control with a callback on the handler's modify event,
Andreas - Thanks for the reply. I did configure a callback for the
modify event as you noted. Sorry not to have mentioned that in my
original post. My problem is that I am unable to distinguish between a
mouse move and a single click. I need to do different things in
response to these two types of events.
Thanks,
Rich
--
Richard Greenwood
richard.greenw...@gmail.com
www.greenwoodmap.com
_______________________________________________
Users mailing list
Users@openlayers.org
http://openlayers.org/mailman/listinfo/users
_______________________________________________
Users mailing list
Users@openlayers.org
http://openlayers.org/mailman/listinfo/users