[OpenLayers-Users] any click events in Control.DrawFeature while
drawing polygon
Saverio Rutigliano
saverio.rutigliano at gmail.com
Tue Jun 12 19:13:23 EDT 2007
Richard Duivenvoorde wrote:
> Hi,
>
> I'm using the DrawFeature control to let users define linestrings. I can
> capture the doubleclick event (for ending the line) using
> lineLayer.onFeatureInsert
>
> But I cannot find a way to check something WHILE clicking/adding the
> segments. Actually on the addition of every segment I want to be able to
> count the number of segments, because I want to be sure the will be not
> more then 20 segments in certain lines.
>
OpenLayers.Handler.Path has two callback "done" and "point". The latter
is called for every point added to the path while the user is drawing on
the map.
Here is the "draw-feature.html" example from openlayers distribution
slightly modified to show you how attach your custom defined callback
handler
(see the comment into javascript code)
Regards,
Saverio Rutigliano
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#map {
width: 512px;
height: 350px;
border: 1px solid gray;
}
#controlToggle li {
list-style: none;
}
p {
width: 512px;
}
</style>
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
<!--
var map, drawControls;
OpenLayers.Util.onImageLoadErrorColor = "transparent";
function init(){
map = new OpenLayers.Map('map');
var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
"http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'});
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");
var lineLayer = new OpenLayers.Layer.Vector("Line Layer");
var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
map.addLayers([wmsLayer, pointLayer, lineLayer, polygonLayer]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
var options = {handlerOptions: {freehand: true}};
// HERE YOU SPECIFY THE ADDITIONAL callbacks PROPERTY WITH CALLBACK
HANDLER AVAILABLE FOR THE OpenLayers.Handler.Path (i.e. done and point)
var pathDrawFeatureOptions = {
callbacks : {"done": doneHandler, "point":
pointHandler},
handlerOptions: {freehand: true}};
drawControls = {
point: new OpenLayers.Control.DrawFeature(pointLayer,
OpenLayers.Handler.Point),
line: new OpenLayers.Control.DrawFeature(lineLayer,
OpenLayers.Handler.Path,
pathDrawFeatureOptions), // specify the custom "pathDrawFeatureOptions"
polygon: new OpenLayers.Control.DrawFeature(polygonLayer,
OpenLayers.Handler.Polygon, options)
};
for(var key in drawControls) {
map.addControl(drawControls[key]);
}
map.setCenter(new OpenLayers.LonLat(0, 0), 3);
document.getElementById('noneToggle').checked = true;
}
// HERE YOU SPECIFY THE CALLBACK HANDLERS: doneHandler() CALLED WHEN
USER FINISHES THE PATH AND pointHandler() CALLED FOR EVERY POINT ADDED
// BTW: console.log IS THE FIREBUG METHOD TO WRITE DIRECTILY TO THE
CONSOLE... JUST FOR DEBUG
function doneHandler(lineGeom) {
console.log("doneHandler:" + lineGeom.getComponentsString());
}
var gPointCount = 0;
function pointHandler(aPoint) {
gPointCount++;
console.log("pointHandler:point n." + gPointCount + " geom =
" + aPoint.toShortString());
}
function toggleControl(element) {
for(key in drawControls) {
var control = drawControls[key];
if(element.value == key && element.checked) {
control.activate();
} else {
control.deactivate();
}
}
}
// -->
</script>
</head>
<body onload="init()">
<h1>OpenLayers Draw Feature Example</h1>
<div id="map"></div>
<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle"
onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point"
id="pointToggle" onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
<li>
<input type="radio" name="type" value="line" id="lineToggle"
onclick="toggleControl(this);" />
<label for="lineToggle">draw line</label>
</li>
<li>
<input type="radio" name="type" value="polygon"
id="polygonToggle" onclick="toggleControl(this);" />
<label for="polygonToggle">draw polygon</label>
</li>
</ul>
<p>Feature digitizing is in freehand mode by default. In freehand
mode, the mouse is treated as a pen.
Drawing begins on mouse down, continues with every mouse move, and
ends with mouse up.</p>
<p>To turn freehand mode off, hold down the shift key while
digitizing. With freehand mode off, one
vertex is added with each click and double-clicks finish drawing.
Freehand mode can be toggled on and off
at any time while drawing.</p>
</body>
</html>
More information about the Users
mailing list