[Mapbender-commits] r8057 - in trunk/mapbender/http:
img/button_blue_red plugins
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Thu Aug 4 05:56:34 EDT 2011
Author: verenadiewald
Date: 2011-08-04 02:56:34 -0700 (Thu, 04 Aug 2011)
New Revision: 8057
Added:
trunk/mapbender/http/img/button_blue_red/select_circle_off.png
trunk/mapbender/http/img/button_blue_red/select_circle_on.png
trunk/mapbender/http/img/button_blue_red/select_circle_over.png
Modified:
trunk/mapbender/http/plugins/mb_digitize_geometry.js
Log:
added digitize option for circle
Added: trunk/mapbender/http/img/button_blue_red/select_circle_off.png
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/img/button_blue_red/select_circle_off.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/img/button_blue_red/select_circle_on.png
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/img/button_blue_red/select_circle_on.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/mapbender/http/img/button_blue_red/select_circle_over.png
===================================================================
(Binary files differ)
Property changes on: trunk/mapbender/http/img/button_blue_red/select_circle_over.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: trunk/mapbender/http/plugins/mb_digitize_geometry.js
===================================================================
--- trunk/mapbender/http/plugins/mb_digitize_geometry.js 2011-08-04 09:55:16 UTC (rev 8056)
+++ trunk/mapbender/http/plugins/mb_digitize_geometry.js 2011-08-04 09:56:34 UTC (rev 8057)
@@ -3,25 +3,25 @@
*
* Description:
* A button that allows to draw a geometry on maps, for example polygons.
- *
+ *
* For other geometries, change the element variable "geometryType", and
* of course select another button image.
- *
+ *
* Files:
* - http/plugins/mb_digitize_geometry.js
*
* SQL:
- * > INSERT INTO gui_element(fkey_gui_id, e_id, e_pos, e_public, e_comment,
- * > e_title, e_element, e_src, e_attributes, e_left, e_top, e_width,
- * > e_height, e_z_index, e_more_styles, e_content, e_closetag, e_js_file,
+ * > INSERT INTO gui_element(fkey_gui_id, e_id, e_pos, e_public, e_comment,
+ * > e_title, e_element, e_src, e_attributes, e_left, e_top, e_width,
+ * > e_height, e_z_index, e_more_styles, e_content, e_closetag, e_js_file,
* > e_mb_mod, e_target, e_requires, e_url) VALUES ('<appId>',
* > 'mb_digitize_polygon',1,1,'Digitize a polygon geometry',
* > 'Digitize a polygon geometry','img',
* > '../img/button_digitize/polygon_off.png','',NULL ,NULL ,24,24,NULL ,'',
* > '','','../plugins/mb_digitize_geometry.js','','mapframe1','','');
- * >
- * > INSERT INTO gui_element_vars(fkey_gui_id, fkey_e_id, var_name,
- * > var_value, context, var_type) VALUES('<appId>', 'mb_digitize_polygon',
+ * >
+ * > INSERT INTO gui_element_vars(fkey_gui_id, fkey_e_id, var_name,
+ * > var_value, context, var_type) VALUES('<appId>', 'mb_digitize_polygon',
* > 'geometryType', 'polygon', '' ,'var');
*
* Help:
@@ -29,15 +29,15 @@
*
* Maintainer:
* http://www.mapbender.org/User:Christoph_Baudson
- *
+ *
* Parameters:
- * geometryType - (String) "polygon", "line", "point" (default)
+ * geometryType - (String) "polygon", "line", "point" (default)
* or "rectangle"
*
* License:
* Copyright (c) 2009, Open Source Geospatial Foundation
- * This program is dual licensed under the GNU General Public License
- * and Simplified BSD license.
+ * This program is dual licensed under the GNU General Public License
+ * and Simplified BSD license.
* http://svn.osgeo.org/mapbender/trunk/mapbender/license/license.txt
*/
@@ -54,7 +54,7 @@
this.events = {
/**
* Property: events.finished
- *
+ *
* Description:
* Triggered after the geometry has been completed.
* obj.featureCollection contains the GeoJSON
@@ -62,14 +62,14 @@
finished: new Mapbender.Event(),
/**
* Property: events.aborted
- *
+ *
* Description:
* Triggered if the geometry could not be created.
*/
aborted: new Mapbender.Event(),
/**
* Property: events.added
- *
+ *
* Description:
* Triggered after a point has been added to the geometry.
* obj.featureCollection contains the feature collection as GeoJSON
@@ -78,7 +78,7 @@
added: new Mapbender.Event(),
/**
* Property: events.mousemove
- *
+ *
* Description:
* Triggered whenever a new point can be added to the geometry.
* obj.featureCollection contains the feature collection as GeoJSON
@@ -88,23 +88,23 @@
};
var mousemove = function (e) {
- var map = $(this).mapbender();
+ var map = $(this).mapbender();
var pt = map.getPos(e);
var coord = map.convertPixelToReal(pt);
-
+
// compute feature collection to be delegated
var collection = new GeometryArray();
collection.importGeoJSON(featureCollection.toString(), false);
if (settings.geometryType === "point") {
- // if a point is digitized, we discard it, as we will
+ // if a point is digitized, we discard it, as we will
// display the current position anyway
collection = new GeometryArray();
}
else if (settings.geometryType === "rectangle") {
var lastPoint = collection.getPoint(-1, -1, -1);
if (lastPoint) {
- // if the second point of the rectangle is set, add
+ // if the second point of the rectangle is set, add
// other points to complete the polygon
var points = calculateRectanglePoints(lastPoint, coord);
if(points === undefined) {
@@ -116,8 +116,22 @@
collection.getGeometry(-1, -1).addPoint(points[3]);
}
}
+ else if (settings.geometryType === "circle") {
+ var lastPoint = collection.getPoint(-1, -1, -1);
+ if (lastPoint) {
+ // if the second point of the circle is set, add
+ // other points to complete the circle
+ var points = calculateCirclePoints(lastPoint, coord);
+ if(points === undefined) {
+ return;
+ }
+ for (var i = 0; i < points.length; i++) {
+ collection.getGeometry(-1, -1).addPoint(points[i]);
+ }
+ }
+ }
else if (
- settings.geometryType === "polygon"
+ settings.geometryType === "polygon"
|| settings.geometryType === "line"
) {
var numCollections = collection.count();
@@ -127,7 +141,7 @@
var feature = collection.getGeometry(-1, -1);
var ps = feature.count();
// if geometry is a polygon, reopen it
- if (ps > 1 &&
+ if (ps > 1 &&
feature.geomType === Mapbender.geometryType.polygon
) {
collection.delPoint(-1, -1, -1);
@@ -137,6 +151,7 @@
}
}
}
+
// display current mouse position as point
collection.addMember(Mapbender.geometryType.point);
collection.get(-1).addGeometry();
@@ -152,7 +167,7 @@
var q2;
var q3;
var q4;
-
+
//box in northeast direction
if(p1.x < p3.x && p1.y < p3.y) {
q1 = p1;
@@ -184,7 +199,7 @@
else {
return;
}
-
+
return [
q1,
q2,
@@ -193,27 +208,48 @@
];
};
+ var calculateCirclePoints = function (p1, p2) {
+ var centerPoint = p1;
+ var secondPoint = p2;
+ var radius = Math.sqrt(Math.pow(Math.abs(centerPoint.x - secondPoint.x),2)+Math.pow(Math.abs(centerPoint.y - secondPoint.y),2));
+
+ var center = [centerPoint.x, centerPoint.y];
+ var steps = 32;
+
+ var circlePoints = [];
+ for (var i = 0; i < steps + 1; i++) {
+ var newX = (center[0] + radius * Math.cos(2 * Math.PI * i / steps));
+ var newY = (center[1] + radius * Math.sin(2 * Math.PI * i / steps));
+ circlePoints[i] = new Mapbender.Point(newX, newY);
+ }
+ return circlePoints;
+ };
+
var setPoint = function (e) {
- var map = $(this).mapbender();
+ var map = $(this).mapbender();
var pt = map.getPos(e);
var coord = map.convertPixelToReal(pt);
-
+
// do not add same point twice
var lastPoint = featureCollection.getPoint(-1,-1,-1);
if (lastPoint && coord.equals(featureCollection.getPoint(-1,-1,-1))) {
// abort if rectangle
- if (settings.geometryType === "rectangle") {
+ if (
+ settings.geometryType === "rectangle"
+ || settings.geometryType === "circle"
+ ) {
featureCollection = new GeometryArray();
- button.stop();
+ button.stop();
}
return false;
}
// add point(s)
if (settings.geometryType === "rectangle" && lastPoint) {
- // if the second point of the rectangle is set, add
+ // if the second point of the rectangle is set, add
// other points to complete the polygon
var points = calculateRectanglePoints(lastPoint, coord);
+
if(points === undefined) {
return;
}
@@ -222,6 +258,19 @@
featureCollection.getGeometry(-1, -1).addPoint(points[2]);
featureCollection.getGeometry(-1, -1).addPoint(points[3]);
}
+ else if (settings.geometryType === "circle" && lastPoint) {
+ // if the second point of the circle is set, add
+ // other points to complete the circle polygon
+ var points = calculateCirclePoints(lastPoint, coord);
+
+ if(points === undefined) {
+ return;
+ }
+
+ for (var i = 0; i < points.length; i++) {
+ featureCollection.getGeometry(-1, -1).addPoint(points[i]);
+ }
+ }
else {
featureCollection.getGeometry(-1, -1).addPoint(coord);
}
@@ -233,27 +282,28 @@
point: coord,
featureCollection: featureCollection.toString()
});
-
+
if (settings.geometryType === Mapbender.geometryType.point) {
return button.stop();
}
};
-
+
var finishFeature = function () {
- if (featureCollection.count() > 0 &&
+ if (featureCollection.count() > 0 &&
featureCollection.getGeometry(-1, -1).close()
) {
- button.stop();
- }
+ button.stop();
+ }
+
};
-
+
var correctGeometryType = function (str) {
- if (str === "rectangle" || str === "extent") {
+ if (str === "rectangle" || str === "extent" || str === "circle") {
return Mapbender.geometryType.polygon;
}
return str;
};
-
+
var prevent = function(e){ e.preventDefault(); };
var button = new Mapbender.Button({
@@ -268,8 +318,8 @@
correctGeometryType(settings.geometryType)
);
featureCollection.get(-1).addGeometry();
-
- if (settings.geometryType === "rectangle") {
+
+ if (settings.geometryType === "rectangle" || settings.geometryType === "circle") {
o.$target.bind("mousedown", setPoint);
o.$target.bind("mouseup", setPoint);
o.$target.bind("mouseup", finishFeature);
@@ -286,7 +336,7 @@
featureCollection.getGeometry(-1, -1).addPoint(points[3]);
featureCollection.getGeometry(-1, -1).addPoint(points[0]);
button.stop();
-
+
}
else {
o.$target.bind("click", setPoint);
@@ -310,10 +360,10 @@
featureCollection.empty();
}
else {
- new Mapbender.Exception("Geometry could not be created.");
+ new Mapbender.Exception("Geometry could not be created.");
that.events.aborted.trigger();
}
- if (settings.geometryType === "rectangle") {
+ if (settings.geometryType === "rectangle" || settings.geometryType === "circle") {
o.$target.unbind("mousedown", setPoint);
o.$target.unbind("mouseup", setPoint);
o.$target.unbind("mouseup", finishFeature);
@@ -324,7 +374,7 @@
}
o.$target.unbind("mousemove", mousemove);
$("body").unbind("mousedown", prevent).unbind("mouseover", prevent).unbind("mousemove", prevent);
-
+
}
});
};
More information about the Mapbender_commits
mailing list