diff --git a/src/application/kml.py b/src/application/kml.py index 073ed8f..a93ce8d 100755 --- a/src/application/kml.py +++ b/src/application/kml.py @@ -7,9 +7,6 @@ def path_to_kml(paths): kml+="" for p in paths[0]: kml+= str(p[1]) + "," + str(p[0]) + ",0\n" - # close polygon - p = paths[0][0] - kml += str(p[1]) + "," + str(p[0]) + ",0\n" kml += "" kml+= "" kml+= "" @@ -19,9 +16,6 @@ def path_to_kml(paths): kml+="" for p in inner: kml+= str(p[1]) + "," + str(p[0]) + ",0\n" - # close polygon - p = inner[0][0] - kml += str(p[1]) + "," + str(p[0]) + ",0\n" kml += "" kml+= "" kml +="" diff --git a/src/static/js/kml.js b/src/static/js/kml.js index 0a42cee..20f7053 100755 --- a/src/static/js/kml.js +++ b/src/static/js/kml.js @@ -7,8 +7,10 @@ google.maps.Polygon.prototype.kml = function() { kml+= ""; kml+=""; this.getPath().forEach(function(p) { - kml+= p.lng() + "," + p.lat() + ",0\n"; + kml += p.lng() + "," + p.lat() + ",0\n"; }); + var p = this.getPath()[0]; + kml += p.lng() + "," + p.lat() + ",0\n"; kml += ""; kml+= ""; kml+= ""; @@ -23,11 +25,14 @@ var KML = { kml+= ""; kml+=""; _.each(path, function(p) { - kml+= p.lng() + "," + p.lat() + ",0\n"; + kml += p.lng() + "," + p.lat() + ",0\n"; }); + // close polygon + var p = path[0]; + kml += p.lng() + "," + p.lat() + ",0\n"; kml += ""; - kml+= ""; - kml+= ""; + kml += ""; + kml += ""; kml += ""; return kml; } diff --git a/src/static/js/models/polygon.js b/src/static/js/models/polygon.js index e74832f..0c77118 100755 --- a/src/static/js/models/polygon.js +++ b/src/static/js/models/polygon.js @@ -26,6 +26,35 @@ var Polygon = Backbone.Model.extend({ // we're changing the internal reference so // change signal will not be called. Call it manually this.trigger('change'); + }, + + // duplicate last vertex for each polygon before sending to + // the server as GeoJSON/kml requires + toJSON: function() { + var paths = this.get('paths'); + var geojsonPath = _.map(paths, function (path) { + var p = _.clone(path); + p.push(p[0]); + return p; + }); + return { + type: this.attributes.type, + paths: geojsonPath + }; + }, + + parse: function(resp) { + // remove duplicated points from paths + // if the first and the last one are equal to maintain compatibility + // modify resp in place + _.each(resp.paths, function(path) { + if(_.isEqual(path[0], path[path.length - 1])) { + path.splice(path.length - 1, 1); + } + }); + + return resp; + } diff --git a/src/tests/frontend/polygon.test.js b/src/tests/frontend/polygon.test.js new file mode 100644 index 0000000..e15a38b --- /dev/null +++ b/src/tests/frontend/polygon.test.js @@ -0,0 +1,45 @@ + +module("polygon") + + test('tojson', function() { + var p = new Polygon({ + type: 'test', + paths: [ + [ [0, 1], [1, 1], [1, 0] ], + [ [5, 1], [1, 1], [1, 5] ] + ] + }); + equal(_.isEqual(p.toJSON().paths, [ + [ [0, 1], [1, 1], [1, 0], [0, 1] ], + [ [5, 1], [1, 1], [1, 5], [5, 1] ] + ]), true) + }); + + test('parse', function() { + var p = new Polygon() + var res = p.parse({ + type: 'test', + paths: [ + [ [0, 1], [1, 1], [1, 0] ], + [ [5, 1], [1, 1], [1, 5] ] + ] + }); + equal(_.isEqual(res.paths, [ + [ [0, 1], [1, 1], [1, 0] ], + [ [5, 1], [1, 1], [1, 5] ] + ]), true) + + var res = p.parse({ + type: 'test', + paths: [ + [ [0, 1], [1, 1], [1, 0], [0, 1] ], + [ [5, 1], [1, 1], [1, 5], [5, 1] ] + ] + }); + + equal(_.isEqual(res.paths, [ + [ [0, 1], [1, 1], [1, 0] ], + [ [5, 1], [1, 1], [1, 5] ] + ]), true) + + }); diff --git a/src/tests/frontend/test.html b/src/tests/frontend/test.html index aca43fa..4ccac3f 100644 --- a/src/tests/frontend/test.html +++ b/src/tests/frontend/test.html @@ -3,10 +3,14 @@ - - - + + + + + + +