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 @@
-
-
-
+
+
+
+
+
+
+