// Alter default OpenLayers options
|
// --------------------------------
|
|
// Allow testing of specific renderers via "?renderer=Canvas", etc
|
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
|
OpenLayers.Layer.Vector.prototype.renderers = renderer ?
|
[renderer] :
|
OpenLayers.Layer.Vector.prototype.renderers;
|
|
// Create Objects
|
// --------------
|
|
// To report draw modify and delete events
|
var reportEvent;
|
if (window.console && window.console.log) {
|
reportEvent = function(event) {
|
console.log(event.type,
|
event.feature ? event.feature.id : event.components);
|
};
|
} else {
|
reportEvent = function() {};
|
}
|
|
// Create the vectorial layer
|
var vectorLayer = new OpenLayers.Layer.Vector('Vector Layer', {
|
styleMap: new OpenLayers.StyleMap({
|
'default': OpenLayers.Util.applyDefaults({
|
strokeWidth: 3,
|
graphicName: 'triangle',
|
pointRadius: '${radius}'||6,
|
rotation: '${angle}'
|
}, OpenLayers.Feature.Vector.style['default']
|
),
|
'select': OpenLayers.Util.applyDefaults({
|
pointRadius: '${radius}'
|
}, OpenLayers.Feature.Vector.style['select']
|
)
|
})
|
});
|
vectorLayer.events.on({
|
'beforefeaturemodified': reportEvent,
|
'featuremodified': reportEvent,
|
'afterfeaturemodified': reportEvent,
|
'beforefeatureremoved': reportEvent,
|
'featureremoved': reportEvent,
|
'vertexmodified': reportEvent,
|
'sketchmodified': reportEvent,
|
'sketchstarted': reportEvent,
|
'sketchcomplete': reportEvent
|
});
|
// to ensure that the points have radius
|
vectorLayer.events.on({
|
'beforefeatureadded': function(e) {
|
e.feature.attributes.radius = 2;
|
}
|
});
|
|
// Create and show the map
|
var map = new OpenLayers.Map({
|
div: 'map',
|
layers: [
|
new OpenLayers.Layer.WMS('osgeo WMS',
|
'http://vmap0.tiles.osgeo.org/wms/vmap0?', {layers: 'basic'}),
|
vectorLayer
|
]
|
});
|
map.setCenter(new OpenLayers.LonLat(0, 0), 3);
|
|
// Create the control collection to draw vectorial features.
|
var controls = {
|
point: new OpenLayers.Control.DrawFeature(vectorLayer,
|
OpenLayers.Handler.Point),
|
multiPoint: new OpenLayers.Control.DrawFeature(vectorLayer,
|
OpenLayers.Handler.Point, {handlerOptions: {multi: true}}),
|
line: new OpenLayers.Control.DrawFeature(vectorLayer,
|
OpenLayers.Handler.Path),
|
polygon: new OpenLayers.Control.DrawFeature(vectorLayer,
|
OpenLayers.Handler.Polygon),
|
modify: new OpenLayers.Control.ModifyFeature(vectorLayer, {
|
deferDelete: true,
|
eventListeners: {
|
'beforefeaturedeleted': reportEvent,
|
'featuredeleted': reportEvent
|
},
|
tools: [ // custom tools
|
{
|
// to rotate the "angle" attribute of a ponit by steps of 15 degrees
|
geometryTypes: ['OpenLayers.Geometry.Point',
|
'OpenLayers.Geometry.MultiPoint'],
|
dragAction: function(feature, initialAtt, escale, rotation) {
|
var angle = ((initialAtt.angle || 0) - rotation) % 360;
|
// force steps of 15 degrres
|
angle = Math.floor(angle / 15) * 15;
|
feature.attributes.angle = angle;
|
},
|
style: OpenLayers.Control.ModifyFeature_styles.rotate
|
}, {
|
// to resize the pointRadius.
|
geometryTypes: ['OpenLayers.Geometry.Point',
|
'OpenLayers.Geometry.MultiPoint'],
|
dragAction: function(feature, initialAtt, escale, rotation) {
|
var radius = (initialAtt.radius || 6) * escale;
|
feature.attributes.radius = Math.max(6, radius);
|
},
|
style: OpenLayers.Control.ModifyFeature_styles.resize
|
}, {
|
// to close a lineString as a ring
|
geometryTypes: ['OpenLayers.Geometry.LineString'],
|
pressingAction: function(feature) {
|
var geometry = feature.geometry;
|
geometry.addComponent(geometry.components[0].clone());
|
},
|
style: {
|
label:'ring',
|
title: 'press to close as a ring',
|
cursor: "pointer",
|
fontSize: '8px',
|
fontColor: '#222',
|
pointRadius: 10,
|
fillColor: '#cccccc',
|
strokeColor: '#444444'
|
}
|
}]
|
})
|
};
|
// add this controls to the map
|
for (var key in controls) {
|
map.addControl(controls[key]);
|
}
|
//updateModifyControl();
|
|
// Functions called from the form fields to choose the desired control to test.
|
// ----------------------------------------------------------------------------
|
|
// Function to toggle the active control
|
function toggleControl(element) {
|
for (key in controls) {
|
var control = controls[key];
|
if (element.value === key && element.checked) {
|
control.activate();
|
} else {
|
control.deactivate();
|
}
|
}
|
}
|
|
// Functions to change the behavior of modify control
|
function updateModifyControl() {
|
var vertices = document.getElementById('vertices').checked;
|
var rotate = document.getElementById('rotate').checked;
|
var resize = document.getElementById('resize').checked;
|
var drag = document.getElementById('drag').checked;
|
var deform = document.getElementById('deform').checked;
|
var delete_ = document.getElementById('delete').checked;
|
var reshape = document.getElementById('reshape').checked;
|
|
controls.modify.createVertices =
|
document.getElementById('createVertices').checked;
|
// reset modification mode
|
controls.modify.mode = 0;
|
if (vertices) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.VERTICES;
|
}
|
if (rotate) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.ROTATE;
|
}
|
if (resize) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.RESIZE;
|
}
|
if (deform) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.DEFORM;
|
}
|
if (drag) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.DRAG;
|
}
|
if (delete_) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.DELETE;
|
}
|
if (reshape) {
|
controls.modify.mode |= OpenLayers.Control.ModifyFeature.RESHAPE;
|
}
|
}
|