[Mapbender-commits] r3141 - in trunk/mapbender/http: javascripts php

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Tue Oct 7 11:19:11 EDT 2008


Author: christoph
Date: 2008-10-07 11:19:10 -0400 (Tue, 07 Oct 2008)
New Revision: 3141

Added:
   trunk/mapbender/http/php/mod_digitize_differencePolygon.php
Modified:
   trunk/mapbender/http/javascripts/geometry.js
   trunk/mapbender/http/javascripts/mod_digitize_tab.php
   trunk/mapbender/http/php/mod_digitize_messages.php
Log:
added support for polygons with holes

Modified: trunk/mapbender/http/javascripts/geometry.js
===================================================================
--- trunk/mapbender/http/javascripts/geometry.js	2008-10-07 15:17:33 UTC (rev 3140)
+++ trunk/mapbender/http/javascripts/geometry.js	2008-10-07 15:19:10 UTC (rev 3141)
@@ -102,8 +102,11 @@
  * @type Point
  * @returns the Point object at the given indices
  */
-GeometryArray.prototype.getPoint = function(i,j,k){
-	return this.get(i).get(j).get(k);
+GeometryArray.prototype.getPoint = function(i, j, k, l){
+	if (l == undefined) {
+		return this.get(i).get(j).get(k);
+	}
+	return this.get(i).get(j).innerRings.get(k).get(l);
 };
 
 /**
@@ -128,7 +131,9 @@
  * @param {Integer} j index of the Geometry
  */
 GeometryArray.prototype.delGeometry = function(i,j){
-	if (this.get(i).del(j) === false) {this.del(i);}
+	if (this.get(i).del(j) === false) {
+		this.del(i);
+	}
 };
 	
 /**
@@ -138,9 +143,11 @@
  * @param {Integer} j index of the Geometry
  * @param {Integer} k index of the Point
  */
-GeometryArray.prototype.delPoint = function (i,j,k){
-	var res = this.get(i).delPoint(j,k);
-	if (res === false) {this.del(i);}
+GeometryArray.prototype.delPoint = function (i, j, k, l) {
+	var res = this.get(i).delPoint(j, k, l);
+	if (res === false) {
+		this.del(i);
+	}
 };
 	
 /**
@@ -152,8 +159,12 @@
 		this.delGeometry(-1, -1);
 	}
 	else {
-		if (this.get(-1).get(-1).count() === 0) {this.get(-1).del(-1);}
-		if (this.get(-1).count() === 0) {this.del(-1);}
+		if (this.get(-1).get(-1).count() === 0) {
+			this.get(-1).del(-1);
+		}
+		if (this.get(-1).count() === 0) {
+			this.del(-1);
+		}
 	}
 	
 };
@@ -169,6 +180,22 @@
 		finished = true;
 		for (var i = 0 ; finished === true && i < this.count() ; i++){
 			for (var j = 0 ; finished === true && j < this.get(i).count() ; j++){
+
+				var currentGeometry = this.get(i).get(j);
+				if (currentGeometry.geomType == geomType.polygon && currentGeometry.innerRings) {
+					for (var k = 0; finished === true && k < currentGeometry.innerRings.count(); k++) {
+						for (var l = 0; finished === true && l < currentGeometry.innerRings.get(k).count(); l++) {
+							if (this.getPoint(i, j, k, l).equals(point)) {
+								this.delPoint(i, j, k, l);
+								finished = false;
+							}
+						}
+					}
+				}
+				if (!finished) {
+					break;
+				}
+
 				for (var k = 0 ; finished === true && k < this.get(i).get(j).count() ; k++){
 					if (this.getPoint(i,j,k).equals(point)){
 						this.delPoint(i,j,k);
@@ -247,36 +274,37 @@
 	var geometryType = tmpArray[0];
 
 	switch (geometryType) {
-		case "POLYGON":
-			var text = text.replace(/\)/, "");
-			text = text.replace(/\(\(/, "(");
-			var tmpArray = text.split("(");
-
-			var coordinatesArray = tmpArray[1].split(",");
-
-			this.addMember(geomType.polygon);
-			this.get(-1).addGeometry();
-			for (var m = 0; m < -1 + coordinatesArray.length; m++) {
-				var currentPoint = coordinatesArray[m].split(" ");
-				this.getGeometry(-1, -1).addPointByCoordinates(parseFloat(currentPoint[0]), parseFloat(currentPoint[1]));
-			}
-			this.close();
-			break;
 		case "MULTIPOLYGON":
-			var text = text.replace(/\)/, "");
-			text = text.replace(/\(\(\(/, "(");
-
-			var tmpArray = text.split("(");
-
-			var coordinatesArray = tmpArray[1].split(",");
-
+			var text = text.replace(/\)/g, "");
+			var sepArray = text.split("(((");
+			var polyArray = sepArray[1].split(",((");
+			
 			this.addMember(geomType.polygon);
-			this.get(-1).addGeometry();
-			for (var m = 0; m < -1 + coordinatesArray.length; m++) {
-				var currentPoint = coordinatesArray[m].split(" ");
-				this.getGeometry(-1, -1).addPointByCoordinates(parseFloat(currentPoint[0]), parseFloat(currentPoint[1]));
+			for (var i = 0; i < polyArray.length; i++) {
+				var ringArray = polyArray[i].split(",(");
+				for (var j = 0; j < ringArray.length; j++) {
+					var coordinatesArray = ringArray[j].split(",");
+					if (j === 0) {
+						// add outer ring
+						this.get(-1).addGeometry();
+						for (var m = 0; m < -1 + coordinatesArray.length; m++) {
+							var currentPoint = coordinatesArray[m].split(" ");
+							this.getGeometry(-1, -1).addPointByCoordinates(parseFloat(currentPoint[0]), parseFloat(currentPoint[1]));
+						}
+						this.close();
+					}		
+					else {
+						// add inner ring
+						var ring = new Geometry(geomType.polygon);
+						for (var m = 0; m < -1 + coordinatesArray.length; m++) {
+							var currentPoint = coordinatesArray[m].split(" ");
+							ring.addPointByCoordinates(parseFloat(currentPoint[0]), parseFloat(currentPoint[1]));
+						}
+						ring.close();
+						this.getGeometry(-1,-1).addInnerRing(ring);				
+					}
+				}
 			}
-			this.close();
 			break;
 	}
 };
@@ -533,7 +561,6 @@
 			var tmpLength = this.count() - 1;
 			for (var z = i; z < tmpLength ; z ++){
 				this.list[z] = this.list[z+1];
-				e[z] = e[z+1];
 			}
 			this.list.length -= 1;
 			if (this.list.length === 0) {return false;}
@@ -661,9 +688,20 @@
  * @return true if the deletion succeded; else false.
  * @type Boolean
  */
-MultiGeometry.prototype.delPoint = function(i,j){
-	var res = this.get(i).del(j);
-	if (res === false) {return this.del(i);}
+MultiGeometry.prototype.delPoint = function(i, j, k){
+	var res;
+	if (k == undefined) {
+		res = this.get(i).del(j);
+		if (res === false) {
+			return this.del(i);
+		}
+	}
+	else {
+		res = this.get(i).innerRings.get(j).del(k);
+		if (res === false) {
+			this.get(i).innerRings.del(j);
+		}
+	}
 	return true;
 };
 
@@ -679,27 +717,20 @@
 	var numOfGeom = this.count();
 	if (numOfGeom >= 1) {
 		if (this.geomType == geomType.polygon) {
-			text += "POLYGON (";
-
-			for (var i = 0; i < this.count(); i++) {
-				if (i > 0) {
-					text += ", ";
-				}
-				text += "(";
-
-				var currentPolygon = this.get(i);
-				for (var j = 0; j < currentPolygon.count(); j++) {
-					if (j > 0) {
+			if (numOfGeom > 1) {
+				text += "MULTIPOLYGON (";
+				for (var i = 0; i < numOfGeom; i++) {
+					if (i > 0) {
 						text += ", ";
 					}
-	
-					var currentPoint = currentPolygon.get(j);
-					text += currentPoint.x + " " + currentPoint.y
+					var currentPolygon = this.get(i);
+					text += "(" + currentPolygon.toText() + ")";
 				}
-
 				text += ")";
 			}
-			text += ")";
+			else {
+				text += "POLYGON (" + this.get(0).toText() + ")";
+			}
 		}
 		else if (this.geomType == geomType.line) {
 			text += "LINESTRING (";
@@ -780,6 +811,13 @@
 	return false;
 };
 
+
+function InnerRings () {
+	this.list = [];	
+};
+
+InnerRings.prototype = new List();
+
 /**
  * @class a Geometry is a List of Point objects. If it is a polygon, the last point has 
  * to equal the first point.
@@ -988,10 +1026,44 @@
 
 	this.geomType = aGeomtype;
 	this.name = nameGeometry;
+
+	// add these members if the geometry is a polygon
+	if (this.geomType == geomType.polygon) {
+		this.innerRings = new InnerRings();
+		this.addInnerRing = function (somePolygon) {
+			this.innerRings.add(somePolygon);
+		};
+		this.delInnerRing = function (index) {
+			this.innerRings.del(index);
+		};
+	}
 }
 
 Geometry.prototype = new List();
 
+Geometry.prototype.toText = function () {
+	var text = "";
+	switch (this.geomType) {
+		case geomType.polygon:
+			text += "(";
+			for (var j = 0; j < this.count(); j++) {
+				if (j > 0) {
+					text += ", ";
+				}
+				var currentPoint = this.get(j);
+				text += currentPoint.x + " " + currentPoint.y
+			}
+			text += ")";
+			if (this.innerRings && this.innerRings.count() > 0) {
+				for (var k = 0; k < this.innerRings.count(); k++) {
+					text += ", ";
+					text += this.innerRings.get(k).toText();
+				}				
+			}
+			break;
+	}
+	return text;
+};
 /**
  * gets the bounding box of this {@link Geometry}
  *
@@ -1010,6 +1082,19 @@
 		if (pos.y < min.y) {min.y = pos.y;}
 		else if (pos.y > max.y) {max.y = pos.y;}
 	}
+	if (this.geomType == geomType.polygon) {
+		for (var i = 0; i < this.innerRings.count(); i++) {
+			var currentRing = this.innerRings.get(i);
+			for (var j=0; j<currentRing.count(); j++){
+				var pos = currentRing.get(j);
+				if (pos.x < min.x) {min.x = pos.x;}
+				else if (pos.x > max.x) {max.x = pos.x;}
+				if (pos.y < min.y) {min.y = pos.y;}
+				else if (pos.y > max.y) {max.y = pos.y;}
+			}
+		}
+	}
+	
 	return [min, max];
 };
 
@@ -1031,6 +1116,22 @@
 			else {this.updatePointAtIndex(newP, i);}
 		}
 	}
+	if (this.geomType == geomType.polygon) {
+		for (var j = 0; j < this.innerRings.count(); j++) {
+			var len = this.innerRings.get(j).count();
+			for (var i = 0; i < len ; i++){
+				if (oldP.equals(this.innerRings.get(j).get(i))){
+					if (i>0 && newP.equals(this.innerRings.get(j).get(i-1))){
+						this.innerRings.get(j).del(i);
+						len--;
+						i--;
+					}
+					else {this.innerRings.get(j).updatePointAtIndex(newP, i);}
+				}
+			}
+			
+		}
+	}
 };
 
 /**
@@ -1046,6 +1147,23 @@
 	for (var i=0; i < this.count(); i++) {
 		if (!this.get(i).equals(geom.get(i))) {return false;}
 	}
+	if (!this.innerRings && !geom.innerRings) {
+		// no inner rings; fine
+	}
+	else if (this.innerRings && geom.innerRings) {
+		if (this.innerRings.count() != geom.innerRings.count()) {
+			return false;
+		}
+		for (var j = 0; j < this.innerRings.count(); j++) {
+			if (!this.innerRings.get(j).equals(geom.innerRings.get(j))) {
+				return false;
+			}
+		}
+	}
+	else {
+		// inner ring mismatch
+		return false;
+	}	
 	return true;
 };
 
@@ -1105,7 +1223,6 @@
 		//ensure that angle is -180<=angle<=180
 		if(angle<-Math.PI)angle=2*Math.PI+angle;
 		if(angle>+Math.PI)angle=2*Math.PI-angle;
-		console.log(angle);
 		
 		//calculate the distance between the next points on boundary
 		//and the line point
@@ -1171,6 +1288,20 @@
 			}
 			str += this.get(i).toString();
 		}
+
+		if (typeof(this.innerRings) == "object" && this.innerRings.count() > 0) {
+			for (var j = 0; j < this.innerRings.count(); j++) {
+				var currentRing = this.innerRings.get(j);
+
+				str += "],[";
+				for (var i = 0; i < currentRing.count(); i++) {
+					if (i > 0) {
+						str += ", ";
+					}
+					str += currentRing.get(i).toString();
+				}
+			}
+		}
 		str += "]]}";
 	}
 	else if (this.geomType == geomType.line) {
@@ -1192,6 +1323,8 @@
 	return str;
 };
 
+
+
 /**
  * @class an array of elements, each consisting of a name/value pair
  *
@@ -1375,6 +1508,26 @@
 		else if(t == geomType.line || t==geomType.polygon) {
 			for(var i=0, ilen = g.count(); i < ilen; i++){
 				var currentGeom = g.get(i);
+				// paint inner rings
+				if (t==geomType.polygon && currentGeom.innerRings.count() > 0) {
+					for (var k = 0; k < currentGeom.innerRings.count(); k++) {
+						var currentRing = currentGeom.innerRings.get(k);
+						var previousPoint = realToMap(mapframe, currentRing.get(0));
+						for (var j=1, jlen = currentRing.count(); j < jlen; j++) {
+							(function () {
+								var currentPoint = realToMap(mapframe, currentRing.get(j));
+								
+								var pq = calculateVisibleDash(previousPoint, currentPoint, mapframeWidth, mapframeHeight);
+								if (pq) {
+									drawLine([pq[0].x-1, pq[1].x-1], [pq[0].y-1, pq[1].y-1], col);
+								}
+								previousPoint = currentPoint;
+							})();
+						}
+						
+					}					
+				}
+				// paint line or outer ring
 				var previousPoint = realToMap(mapframe, currentGeom.get(0));
 				for (var j=1, jlen = currentGeom.count(); j < jlen; j++) {
 					(function () {
@@ -1571,7 +1724,16 @@
 	 * @param {String} color a color
 	 */	
 	this.del = function(m, color) {
-		var a = gA.findMultiGeometry(m);
+		var newMultiGeom;
+		if (m.name == nameMultiGeometry) {
+			newMultiGeom = m;
+		}
+		else if (m.name == nameGeometry) {
+			var newMultiGeom = new MultiGeometry(m.geomType);
+			newMultiGeom.add(m);
+		}
+
+		var a = gA.findMultiGeometry(newMultiGeom);
 		var del = false;
 		for (var i=0; i<a.length && del === false; i++) {
 			if (gA.get(a[i]).color == color) {
@@ -1588,7 +1750,15 @@
 	 * @param {String} color the color of the highlight
 	 */	
 	this.add = function(m, color) {
-		gA.addCopy(m);
+
+		if (m.name == nameMultiGeometry) {
+			gA.addCopy(m);
+		}
+		else if (m.name == nameGeometry) {
+			var newMultiGeom = new MultiGeometry(m.geomType);
+			newMultiGeom.add(m);
+			gA.addCopy(newMultiGeom);
+		}
 		if (typeof(color) != 'undefined') {gA.get(-1).color = color;} 
 		else {gA.get(-1).color = lineColor;}
 	};
@@ -1820,6 +1990,19 @@
 		if (geom.name == nameGeometryArray || geom.name == nameMultiGeometry){
 			for (var j = 0 ; j < geom.get(i).count() ; j++){
 				if (geom.get(i).name == nameMultiGeometry){
+					// inner rings
+					if (geom.get(i).get(j).geomType == geomType.polygon && geom.get(i).get(j).innerRings && geom.get(i).get(j).innerRings.count() > 0) {
+						for (var l = 0; l < geom.get(i).get(j).innerRings.count(); l++) {
+							var currentRing = geom.get(i).get(j).innerRings.get(l);
+							for (var k = 0 ; k < currentRing.count() ; k++){
+								if ((currentRing.isComplete() === true && typeof(point) == 'undefined') || (typeof(point) != 'undefined' && !currentRing.get(k).equals(point))){
+									this.add(currentRing.get(k));
+								}
+							}
+							
+						}
+					}
+					// lines, points, outer rings
 					for (var k = 0 ; k < geom.get(i).get(j).count() ; k++){
 						if ((geom.get(i).get(j).isComplete() === true && typeof(point) == 'undefined') || (typeof(point) != 'undefined' && !geom.get(i).get(j).get(k).equals(point))){
 							this.add(geom.getPoint(i, j, k));

Modified: trunk/mapbender/http/javascripts/mod_digitize_tab.php
===================================================================
--- trunk/mapbender/http/javascripts/mod_digitize_tab.php	2008-10-07 15:17:33 UTC (rev 3140)
+++ trunk/mapbender/http/javascripts/mod_digitize_tab.php	2008-10-07 15:19:10 UTC (rev 3141)
@@ -86,6 +86,7 @@
 var button_clear = "clear";
 var button_split = "digitizeSplit";
 var button_merge = "digitizeMerge";
+var button_difference = "digitizeDifference";
 
 var digitizeDivTag;
 
@@ -232,15 +233,30 @@
 var basepointObject = false;
 var basepointMemberIndex = null;
 var basepointGeometryIndex = null;
+var basepointRingIndex = null;
 var basepointPointIndex = null;
 var basepointDragActive = false;
 
-function handleBasepoint(obj,memberIndex,geometryIndex,pointIndex){
-	if(!(mod_digitizeEvent == button_move || mod_digitizeEvent == button_insert || mod_digitizeEvent == button_delete)){ return false; }
+function handleBasepoint(obj,memberIndex, geometryIndex, ringIndex, pointIndex){
+	if (!(
+		mod_digitizeEvent == button_move || 
+		mod_digitizeEvent == button_insert || 
+		mod_digitizeEvent == button_delete)
+	) { 
+		return false; 
+	}
 	
 	basepointObject = obj;
 	basepointMemberIndex = memberIndex;
 	basepointGeometryIndex = geometryIndex;
+
+	if (pointIndex == undefined) {
+		pointIndex = ringIndex;
+		basepointRingIndex = undefined;
+	}
+	else {
+		basepointRingIndex = ringIndex;
+	}
 	basepointPointIndex = pointIndex;
 	
 	if(mod_digitizeEvent == button_move){
@@ -256,7 +272,7 @@
 	}
 }
 
-function convertLinepointToBasepoint(obj, memberIndex, geomIndex, pointIndex){
+function convertLinepointToBasepoint(obj, memberIndex, geomIndex, ringIndex, pointIndex){
 	if(!(mod_digitizeEvent == button_insert)){ return false; }
 	
 	if(mod_digitizeEvent == button_insert){
@@ -267,6 +283,7 @@
 		basepointObject = obj;
 		basepointMemberIndex = memberIndex;
 		basepointGeometryIndex = geomIndex;
+		basepointRingIndex = ringIndex;
 		basepointPointIndex = pointIndex;
 	}
 }
@@ -274,12 +291,18 @@
 function insertBasepoint(e){
 	var i = basepointMemberIndex;
 	var j = basepointGeometryIndex;
-	var k = basepointPointIndex;
+	var k = basepointRingIndex;
+	var l = basepointPointIndex;
 	
 	parent.mb_getMousePos(e, mod_digitize_target);
 	var pos = parent.makeClickPos2RealWorldPos(mod_digitize_target,parent.clickX, parent.clickY);
 	var p = new parent.Point(pos[0], pos[1]);
-	d.getGeometry(i,j).addPointAtIndex(p, k);
+	if (k == undefined) {
+		d.getGeometry(i,j).addPointAtIndex(p, l);
+	}
+	else {
+		d.getGeometry(i,j).innerRings.get(k).addPointAtIndex(p, l);
+	}
 
 	executeDigitizeSubFunctions();
 }
@@ -287,9 +310,16 @@
 function deleteBasepoint(){
 	var i = basepointMemberIndex;
 	var j = basepointGeometryIndex;
-	var k = basepointPointIndex;
-	d.delAllPointsLike(d.getPoint(i,j,k));
+	var k = basepointRingIndex;
+	var l = basepointPointIndex;
 
+	if (k != undefined) {
+		d.delAllPointsLike(d.getPoint(i, j, k, l));
+	}
+	else {
+		d.delAllPointsLike(d.getPoint(i, j, l));
+	}
+
 	executeDigitizeSubFunctions();
 }
 
@@ -338,7 +368,8 @@
 	
 	var i = basepointMemberIndex;
 	var j = basepointGeometryIndex;
-	var k = basepointPointIndex;
+	var k = basepointRingIndex;
+	var l = basepointPointIndex;
 	basepointDragActive = false;
 	
 	parent.mb_getMousePos(e, mod_digitize_target);
@@ -346,7 +377,13 @@
 	basepointObject.onmousedown = null;
 	var p = parent.makeClickPos2RealWorldPos(mod_digitize_target, basepointDragEnd.x, basepointDragEnd.y);
 
-	var oldPoint = parent.cloneObject(d.getPoint(i,j,k));
+	var oldPoint;
+	if (k == undefined) {
+		oldPoint = parent.cloneObject(d.getPoint(i,j,l));
+	} 
+	else {
+		oldPoint = parent.cloneObject(d.getPoint(i,j,k,l));
+	}
 	if (s.isSnapped()) {
 		var snappedPoint = parent.cloneObject(s.getSnappedPoint());
 		if (!nonTransactionalEditable) {
@@ -586,7 +623,8 @@
 	}
 	else if (obj.id == button_point || obj.id == button_line || 
 				obj.id == button_polygon || obj.id == button_clear || 
-				obj.id == button_split || obj.id == button_merge){
+				obj.id == button_split || obj.id == button_merge ||
+				obj.id == button_difference){
 					
 		var el = parent.frames[mod_digitize_target].document;
 		el.onmousemove = mod_digitize_go;
@@ -747,6 +785,28 @@
 				parent.mb_disableThisButton(button_split);
 			});
 		}
+		else if (obj.id == button_difference) {
+			var applicable = (d.count() == 2) && 
+							(d.get(0).geomType == parent.geomType.polygon) &&
+							(d.get(1).geomType == parent.geomType.polygon);
+			if (!applicable) {
+				alert(msgObj.messageErrorDifferenceNotApplicable);
+				parent.mb_disableThisButton(button_difference);
+				return false;
+			}
+			
+			var polygon1Text = d.get(0).toText();
+			var polygon2Text = d.get(1).toText();
+			
+			parent.mb_ajax_post("../php/mod_digitize_differencePolygon.php", {polygon1: polygon1Text, polygon2: polygon2Text}, function(json, status) {
+				var response = eval('(' + json + ')');
+				var polygonArray = response.polygons;
+				for (var i in polygonArray) {
+					d.importGeometryFromText(polygonArray[i]);
+				}
+				parent.mb_disableThisButton(button_difference);
+			});
+		}
 	}
 }
 
@@ -771,6 +831,10 @@
 		mod_digitize_timeout();
 		executeDigitizeSubFunctions();
 	}
+	else if (obj.id == button_difference) {
+		mod_digitize_timeout();
+		executeDigitizeSubFunctions();
+	}
 	mod_digitizeEvent = false;
 }
 // --- button handling (end) ----------------------------------------------------------------------------------------------
@@ -879,14 +943,67 @@
 //					}
 					var previousPointMap = currentPointMap;
 				}
+				if (isPolygon && currentGeometry.innerRings.count() > 0) {
+					// draw inner rings
+
+					for (var l = 0, lenRings = currentGeometry.innerRings.count(); l < lenRings; l++) {
+						var currentRing = currentGeometry.innerRings.get(l);
+						var lastPaintedPoint = false;
+						
+						for (var m = 0, lenPoint = currentRing.count(); m < lenPoint; m++) {
+							var currentPoint = currentRing.get(m);
+							var currentPointMap = new Point(Math.round((currentPoint.x - minX) * cx), Math.round((maxY - currentPoint.y) * cy));
+							
+							//					var isTooCloseToPrevious = lastPaintedPoint && (k > 0) && Math.abs(currentPointMap.x-lastPaintedPoint.x) <= minDist && Math.abs(currentPointMap.y-lastPaintedPoint.y) <= minDist;
+							//					if (!isTooCloseToPrevious) {
+							var currentPointIsVisible = currentPointMap.x > 0 && currentPointMap.x < width && currentPointMap.y > 0 && currentPointMap.y < height;
+							if (currentPointIsVisible) {
+								if (!isComplete && ((k == 0 && isPolygon) || (k == lenPoint - 1 && isLine))) {
+									smPArray[smPArray.length] = "<div class='bp' style='top:" +
+									(currentPointMap.y - 2) +
+									"px;left:" +
+									(currentPointMap.x - 2) +
+									"px;z-index:" +
+									digitizeTransactionalZIndex +
+									";background-color:" +
+									linepointColor +
+									"'";
+								}
+								else {
+									smPArray[smPArray.length] = "<div class='bp' style='top:" + (currentPointMap.y - 2) + "px;left:" + (currentPointMap.x - 2) + "px;z-index:" + digitizeTransactionalZIndex + ";'";
+								}
+								if (m == 0 && isPolygon && !isComplete) {
+									smPArray[smPArray.length] = " title='" + msgObj.closePolygon_title + "' ";
+								}
+								if (isMoveOrInsertOrDelete) {
+									smPArray[smPArray.length] = " onmouseover='parent.window.frames[\"" + mod_digitize_elName + "\"].handleBasepoint(this," + i + "," + j + "," + l + "," + m + ")' ;";
+								}
+								smPArray[smPArray.length] = "></div>";
+								lastPaintedPoint = currentPointMap;
+							}
+							if (m > 0) {
+								points = parent.calculateVisibleDash(currentPointMap, previousPointMap, width, height);
+								if (points != false) {
+									smPArray[smPArray.length] = evaluateDashes(points[0], points[1], i, j, l, m);
+								}
+							}
+							//					}
+							var previousPointMap = currentPointMap;
+						}
+					}
+				}
 			}
 		}
 	}
 	digitizeDivTag.write(smPArray.join(""));
 }
 
-
-function evaluateDashes(start, end, memberIndex, geomIndex, pointIndex){
+function evaluateDashes(start, end, memberIndex, geomIndex, ringIndex, pointIndex){
+	if (pointIndex == undefined) {
+		pointIndex = ringIndex;
+		ringIndex = undefined;
+	}
+	
 	var strArray = [];
 	var delta = new parent.Point(end.x - start.x, end.y - start.y);
 	var lastGeomIsComplete = d.getGeometry(-1,-1).isComplete(); 
@@ -907,7 +1024,7 @@
 				strArray[strArray.length] = "<div class='lp' style='top:"+y+"px;left:"+x+"px;z-index:"+digitizeTransactionalZIndex+";' ";
 			}
 			if(mod_digitizeEvent == button_insert) {
-				strArray[strArray.length] = "onmouseover='parent.window.frames[\""+mod_digitize_elName+"\"].convertLinepointToBasepoint(this,"+memberIndex+","+geomIndex+","+pointIndex+")'";
+				strArray[strArray.length] = "onmouseover='parent.window.frames[\""+mod_digitize_elName+"\"].convertLinepointToBasepoint(this,"+memberIndex+","+geomIndex+","+ringIndex+","+pointIndex+")'";
 			}
 			strArray[strArray.length] = "></div>";
 		}
@@ -961,7 +1078,7 @@
 }
 
 function updateListOfGeometries(){
-	var listOfGeom = "<table id='geometryTable' style='position:absolute; top:"+geomList_y+"px; left:"+geomList_x+"px;'>\n";
+	var listOfGeom = "<div id='geometryTable' style='position:absolute; top:"+geomList_y+"px; left:"+geomList_x+"px;'><ul>";
 	if (d.count() > 0) {
 		wfsConf = parent.get_complete_wfs_conf();
 		for (var i = 0 ; i < d.count(); i ++) {
@@ -973,41 +1090,82 @@
 					// if the kml is in the db (id = id in database)
 					if (d.get(i).e.getElementValueByName("Mapbender:id")) {
 						// button: geometry information, update kml
-						listOfGeom += "\t<tr>\n\t\t<td>\n";
-						listOfGeom += "\t\t\t<img src = '"+buttonDig_imgdir+buttonDig_wfs_src+"' title='"+msgObj.buttonDig_wfs_title+"' onclick='showWfsKml("+i+")'>\n";
+						listOfGeom += "<li>";
+						listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_wfs_src+"' title='"+msgObj.buttonDig_wfs_title+"' onclick='showWfsKml("+i+")'>";
 					}
 				}
 				else {
 					// button: geometry information, save, update, delete
-					listOfGeom += "\t<tr>\n\t\t<td>\n";
+					listOfGeom += "<li>";
 					if (wfsExistsForGeom(d.get(i), wfsConf)) {
-						listOfGeom += "\t\t\t<img src = '"+buttonDig_imgdir+buttonDig_wfs_src+"' title='"+msgObj.buttonDig_wfs_title+"' onclick='showWfs("+i+")'>\n";
+						listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_wfs_src+"' title='"+msgObj.buttonDig_wfs_title+"' onclick='showWfs("+i+")'>";
 					}
-					listOfGeom += "\t\t</td>\n\t\t<td>\n";
 
 					// button: remove this geometry
-					listOfGeom += "\t\t\t<img src = '"+buttonDig_imgdir+buttonDig_remove_src+"' title='"+msgObj.buttonDig_remove_title+"' onclick='parent.mb_disableThisButton(mod_digitizeEvent);d.del("+i+");executeDigitizeSubFunctions();'>\n";
+					listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_remove_src+"' title='"+msgObj.buttonDig_remove_title+"' onclick='parent.mb_disableThisButton(mod_digitizeEvent);d.del("+i+");executeDigitizeSubFunctions();'>";
 				}
-				listOfGeom += "\t\t</td>\n\t\t<td>\n";
 					
 				// button: remove geometry from database
 				if (isValidWfsConfIndex(wfsConf, d.get(i).wfs_conf)) {
-					listOfGeom += "\t\t\t<img src = '"+buttonDig_imgdir+buttonDig_removeDb_src+"' title='"+msgObj.buttonDig_removeDb_title+"' onclick=\"var deltrans = confirm('"+msgObj.messageConfirmDeleteGeomFromDb+"');if (deltrans) dbGeom('delete', "+i+")\">\n";
+					listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_removeDb_src+"' title='"+msgObj.buttonDig_removeDb_title+"' onclick=\"var deltrans = confirm('"+msgObj.messageConfirmDeleteGeomFromDb+"');if (deltrans) dbGeom('delete', "+i+")\">";
 				}
-				listOfGeom += "\t\t</td>\n\t\t<td class='searchResults'>\n";
-				listOfGeom += "\t\t\t<div onmouseover='parent.mb_wfs_perform(\"over\",d.get("+i+"));' ";
+				listOfGeom += "<div class='searchResults' onmouseover='parent.mb_wfs_perform(\"over\",d.get("+i+"));' ";
 				listOfGeom += " onmouseout='parent.mb_wfs_perform(\"out\",d.get("+i+"))' ";
 				listOfGeom += " onclick='parent.mb_wfs_perform(\"click\",d.get("+i+"));' ";
 				var geomName = getName(d.get(i)); 
-				if (d.get(i).geomType == parent.geomType.polygon) {geomName += " ("+msgObj.messageDescriptionPolygon+")";}
-				else if (d.get(i).geomType == parent.geomType.line) {geomName += " ("+msgObj.messageDescriptionLine+")";}
-				else if (d.get(i).geomType == parent.geomType.point) {geomName += " ("+msgObj.messageDescriptionPoint+")";}
+				var currentGeomType;
+				if (d.get(i).geomType == parent.geomType.polygon) {
+					currentGeomType = msgObj.messageDescriptionPolygon;
+				}
+				else if (d.get(i).geomType == parent.geomType.line) {
+					currentGeomType = msgObj.messageDescriptionLine;
+				}
+				else if (d.get(i).geomType == parent.geomType.point) {
+					currentGeomType = msgObj.messageDescriptionPoint;
+				}
+				var multi = "";
+				if (d.get(i).count() > 1) {
+					multi = "multi";
+				}
+				listOfGeom += ">" + geomName +" (" + multi + currentGeomType + ")</div>";
 				
-				listOfGeom += ">" + geomName +"</div>\t\t</td>\n\t</tr>\n";
+				// multigeometries
+				listOfGeom += "<ul>";
+				for (var j = 0; j < d.get(i).count(); j++) {
+					var currentGeom = d.get(i).get(j);
+					if (d.get(i).count() > 1 || (d.get(i).geomType == geomType.polygon && 
+						d.get(i).get(j).innerRings && 
+						d.get(i).get(j).innerRings.count() > 0)) {
+						listOfGeom += "<li>";
+						listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_remove_src+"' title='"+msgObj.buttonDig_remove_title+"' onclick='parent.mb_disableThisButton(mod_digitizeEvent);d.get("+i+").del(" + j + ");executeDigitizeSubFunctions();'>";
+						listOfGeom += "<div class='searchResults' onmouseover='parent.mb_wfs_perform(\"over\",d.get("+i+").get("+j+"));' ";
+						listOfGeom += " onmouseout='parent.mb_wfs_perform(\"out\",d.get("+i+").get("+j+"))' ";
+						listOfGeom += " onclick='parent.mb_wfs_perform(\"click\",d.get("+i+").get("+j+"));' ";
+						listOfGeom += ">" + currentGeomType + "#" + (j+1) +"</div></li>";
+					}
+					if (d.get(i).geomType == geomType.polygon && 
+						d.get(i).get(j).innerRings && 
+						d.get(i).get(j).innerRings.count() > 0) {
+						listOfGeom += "<ul>";
+						for (var k = 0; k < d.get(i).get(j).innerRings.count(); k++) {
+							var currentRing = d.get(i).get(j).innerRings.get(k);
+							listOfGeom += "<li>";
+							listOfGeom += "<img src = '"+buttonDig_imgdir+buttonDig_remove_src+"' title='"+msgObj.buttonDig_remove_title+"' onclick='parent.mb_disableThisButton(mod_digitizeEvent);d.get("+i+").get(" + j + ").innerRings.del(" + k + ");executeDigitizeSubFunctions();'>";
+							listOfGeom += "<div class='searchResults' onmouseover='parent.mb_wfs_perform(\"over\",d.getGeometry("+i+","+j+").innerRings.get(" + k + "));' ";
+							listOfGeom += " onmouseout='parent.mb_wfs_perform(\"out\",d.getGeometry("+i+","+j+").innerRings.get(" + k + "))' ";
+							listOfGeom += " onclick='parent.mb_wfs_perform(\"click\",d.getGeometry("+i+","+j+").innerRings.get(" + k + "));' ";
+							listOfGeom += ">inner ring #" + (k+1) +"</div></li>";
+							
+						}
+						listOfGeom += "</ul>";
+					}
+				}
+				listOfGeom += "</ul>";
+				listOfGeom += "</li>";
 			}
 		}
 	}
-	listOfGeom += "</table>\n";
+	listOfGeom += "<ul></div>";
 	parent.writeTag(mod_digitize_elName,"listOfGeometries",listOfGeom);
 }
 // --- display (end) -----------------------------------------------------------------------------------------

Added: trunk/mapbender/http/php/mod_digitize_differencePolygon.php
===================================================================
--- trunk/mapbender/http/php/mod_digitize_differencePolygon.php	                        (rev 0)
+++ trunk/mapbender/http/php/mod_digitize_differencePolygon.php	2008-10-07 15:19:10 UTC (rev 3141)
@@ -0,0 +1,99 @@
+<?php
+# $Id: mod_digitize_splitPolygon.php 2905 2008-09-03 12:40:37Z christoph $
+# http://www.mapbender.org/index.php/DeleteWMS
+# Copyright (C) 2002 CCGIS 
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+require_once(dirname(__FILE__) . "/../../core/globalSettings.php");
+require_once(dirname(__FILE__) . "/../classes/class_json.php");
+
+$json = new Mapbender_JSON();
+
+$polygon1Text = $_REQUEST["polygon1"];
+$polygon2Text = $_REQUEST["polygon2"];
+
+
+$floatPattern = "-?\d+(\.\d+)?";
+$pointPattern = $floatPattern . " " . $floatPattern;
+$polygonPattern = "\(" . $pointPattern . "(, " . $pointPattern . ")*\)";
+$multiPolygonPattern = "(MULTI)?POLYGON \(" . $polygonPattern . "(, " . $polygonPattern . ")*\)";
+
+$pattern = "/" . $polygonPattern . "/";
+if (!preg_match($pattern, $polygon1Text)) {
+	echo "Polygon 1 not a polygon.";
+	die();
+}
+
+if (!preg_match($pattern, $polygon2Text)) {
+	echo "Polygon 2 not a polygon.";
+	die();
+}
+
+
+$sql = "SELECT " . 
+	"overlaps(" . 
+	"'" . $polygon1Text . "'::geometry," . 
+	"'" . $polygon2Text . "'::geometry" . 
+	") AS o," . 
+	"intersects(" . 
+	"'" . $polygon1Text . "'::geometry," . 
+	"'" . $polygon2Text . "'::geometry" . 
+	") AS i," . 
+	"contains(" . 
+	"'" . $polygon1Text . "'::geometry," . 
+	"'" . $polygon2Text . "'::geometry" . 
+	") AS c," . 
+	"touches(" . 
+	"'" . $polygon1Text . "'::geometry," . 
+	"'" . $polygon2Text . "'::geometry" . 
+	") AS t," . 
+	"within(" . 
+	"'" . $polygon1Text . "'::geometry," . 
+	"'" . $polygon2Text . "'::geometry" . 
+	") AS w"; 
+$res = db_query($sql);    
+
+$row = db_fetch_array($res);
+
+if ($row["i"] == "t") {
+	// calculate difference
+	$sql = "SELECT astext(multi(difference(" . 
+		"'" . $polygon1Text . "'::geometry," . 
+		"'" . $polygon2Text . "'::geometry" . 
+		")))";
+		
+}
+else {
+	// calculate union
+	$sql = "SELECT astext(multi(st_union(" . 
+		"'" . $polygon1Text . "'::geometry," . 
+		"'" . $polygon2Text . "'::geometry" . 
+		")))";
+}
+$res = db_query($sql);    
+
+$polygonArray = array();
+while ($row = db_fetch_array($res)) {
+	array_push($polygonArray, $row[0]);
+}
+
+$data = array("polygons" => $polygonArray);
+
+$output = $json->encode($data);
+
+header("Content-type:application/x-json; charset=utf-8");
+echo $output;
+?>
\ No newline at end of file

Modified: trunk/mapbender/http/php/mod_digitize_messages.php
===================================================================
--- trunk/mapbender/http/php/mod_digitize_messages.php	2008-10-07 15:17:33 UTC (rev 3140)
+++ trunk/mapbender/http/php/mod_digitize_messages.php	2008-10-07 15:19:10 UTC (rev 3141)
@@ -37,6 +37,7 @@
 $msg_obj["messageErrorWfsWrite"] = _mb("An error occured.");
 $msg_obj["messageErrorMergeNotApplicable"] = _mb("At least two geometries must be available. Only polygons are allowed in the geometry list.");
 $msg_obj["messageErrorSplitNotApplicable"] = _mb("Exactly two geometries must be available. The first geometry shall be a polygon, the second geometry shall be a line.");
+$msg_obj["messageErrorDifferenceNotApplicable"] = _mb("Exactly two polygons must be available.");
 $msg_obj["messageSuccessWfsWrite"] = _mb("Success.");
 $msg_obj["messageConfirmDeleteGeomFromDb"] = _mb("Delete geometry from database?");
 $msg_obj["messageConfirmDeleteAllGeomFromList"] = _mb("Clear list of geometries?");



More information about the Mapbender_commits mailing list