[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