/* * Developed by The Di Lab * www.the-di-lab.com * 22.06.2010 */ function PolygonCreator(map) { this.map = map; this.pen = new Pen(this.map); var thisOjb = this; proj4.defs("EPSG:31467", "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0" + " +ellps=bessel +datum=potsdam +units=m +no_defs"); // http://spatialreference.org/ref/epsg/31467/proj4js/ this.event = google.maps.event.addListener(thisOjb.map, 'click', function(event) { thisOjb.pen.draw(event.latLng); }); this.destroy = function() { this.pen.deleteMis(); $('#dataPanel').empty(); if (null != this.pen.polygon) { this.pen.polygon.remove(); } google.maps.event.removeListener(this.event); } } function Pen(map) { this.map = map; this.listOfDots = new Array(); this.polyline = null; this.polygon = null; this.currentDot = null; this.i = 0; this.draw = function(latLng) { if (null != this.polygon) { alert('Click Reset to draw another'); } else { if (this.currentDot != null && this.listOfDots.length > 1 && this.currentDot == this.listOfDots[0]) { this.drawPolygon(this.listOfDots); this.refreshInfo(); } else { if (null != this.polyline) { this.polyline.remove(); } var dot = new Dot(latLng, this.i, this.map, this); this.i += 1; this.listOfDots.push(dot); this.refreshInfo(); if (this.listOfDots.length > 1) { this.polyline = new Line(this.listOfDots, this.map); } } } } this.drawPolygon = function(listOfDots, color, des, id) { this.polygon = new Polygon(listOfDots, this.map, this, color, des, id); } this.deleteMis = function() { $.each(this.listOfDots, function(index, value) { value.remove(); }); this.listOfDots.length = 0; if (null != this.polyline) { this.polyline.remove(); this.polyline = null; } } this.setCurrentDot = function(dot) { this.currentDot = dot; } this.getListOfDots = function() { return this.listOfDots; } this.getWGS84Data = function() { var data = ""; for (var i = 0; i < this.getListOfDots().length; i++) { data += this.getListOfDots()[i].latLng + "
"; } return data; } this.refreshInfo = function() { $('#dataPanel').empty(); $('#dataPanel').append("WGS84 Coordinates
"); $('#dataPanel').append(this.getWGS84Data() + "
\n"); $('#dataPanel').append("GSK3 Coordinates
"); $('#dataPanel').append(this.getGSK3DataAndArea()); } this.getGSK3DataAndArea = function(referenceSystem) { var data = ""; var fromProjection = proj4('EPSG:4326'); var toProjection = proj4('EPSG:31467'); var xs = []; var ys = []; var listOfDots = this.getListOfDots(); var n = listOfDots.length; for (var i = 0; i < n; i++) { var latLng = listOfDots[i].latLng; var gk3_coords = proj4(fromProjection, toProjection, [ latLng.lng(), latLng.lat() ]); xs.push(gk3_coords[0] - 3500000); ys.push(gk3_coords[1] - 5000000); data += "(" + (gk3_coords.toString() + ")
"); } if (n > 2) { data += "
\nArea : " + (Math.round(polygonArea(xs, ys) / 1000) / 10).toString() + " ha
"; } return data; } this.updateDot = function(marker) { var old_dot = this.listOfDots[marker.zIndex]; old_dot.setLatLng(marker.getPosition()); if (null != this.polygon) { (this.polygon.remove()); this.polygon = null; this.drawPolygon(this.listOfDots); } this.polyline.remove(); this.polyline = new Line(this.listOfDots, this.map); this.refreshInfo(); } } function Dot(latLng, i, map, pen) { this.latLng = latLng; this.parent = pen; this.markerObj = new google.maps.Marker({ position : this.latLng, draggable : true, map : map, zIndex : i }); this.addListener = function() { var parent = this.parent; var thisMarker = this.markerObj; var thisDot = this; google.maps.event.addListener(thisMarker, 'click', function() { // console.log("CLICKED"); parent.setCurrentDot(thisDot); parent.draw(thisMarker.getPosition()); }); } this.addListener(); this.addListener = function() { var parent = this.parent; var thisMarker = this.markerObj; var thisDot = this; google.maps.event.addListener(thisMarker, 'drag', function() { // console.log("DRAGGED"); parent.updateDot(thisMarker); }); } this.addListener(); this.getLatLng = function() { return this.latLng; } this.getMarkerObj = function() { return this.markerObj; } this.remove = function() { this.markerObj.setMap(null); } this.setLatLng = function(latLng) { this.latLng = latLng; } } function Line(listOfDots, map) { this.listOfDots = listOfDots; this.map = map; this.coords = new Array(); this.polylineObj = null; if (this.listOfDots.length > 1) { var thisObj = this; $.each(this.listOfDots, function(index, value) { thisObj.coords.push(value.getLatLng()); }); this.polylineObj = new google.maps.Polyline({ path : this.coords, strokeColor : "#FF0000", strokeOpacity : 1.0, strokeWeight : 2, map : this.map }); } this.remove = function() { this.polylineObj.setMap(null); } } function Polygon(listOfDots, map, pen, color) { this.listOfDots = listOfDots; this.map = map; this.coords = new Array(); this.parent = pen; this.des = 'Hello'; var thisObj = this; $.each(this.listOfDots, function(index, value) { thisObj.coords.push(value.getLatLng()); }); this.polygonObj = new google.maps.Polygon({ paths : this.coords, strokeColor : "#FF0000", strokeOpacity : 0.8, strokeWeight : 2, fillColor : "#FF0000", fillOpacity : 0.35, map : this.map }); this.remove = function() { this.polygonObj.setMap(null); } this.getContent = function() { return this.des; } this.getPolygonObj = function() { return this.polygonObj; } this.getListOfDots = function() { return this.listOfDots; } this.getPlots = function() { return this.polygonObj.getPaths(); } this.addListener = function() { var thisPolygon = this.polygonObj; google.maps.event.addListener(thisPolygon, 'rightclick', function(event) { return false; }); } this.addListener(); } function polygonArea(X, Y, numPoints) { area = 0; // Accumulates area in the loop j = X.length - 1; // The last vertex is the 'previous' one to the first for (i = 0; i < X.length; i++) { area = area + (X[j] + X[i]) * (Y[j] - Y[i]); j = i; // j is previous vertex to i } return Math.abs(area / 2); }