Added Douglas-Peucker linestring simplification to OpenLayers.Geometry.LineString. Thanks chrismayer for this excellent patch. p=chrismayer, r=me (closes #2869)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@10969 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
ahocevar
2010-12-15 13:38:52 +00:00
parent b61cec71a1
commit e9e2aec77d
4 changed files with 838 additions and 1 deletions

View File

@@ -374,7 +374,67 @@
t.eq(Math.round(got), Math.round(cases[i].exp), "[case " + i + "] length calculated");
}
}
}
function test_LineString_simplify(t){
t.plan(8);
var ls1 = new OpenLayers.Geometry.LineString([
new OpenLayers.Geometry.Point(0,0),
new OpenLayers.Geometry.Point(1,2.1),
new OpenLayers.Geometry.Point(1.8,3.8),
new OpenLayers.Geometry.Point(2,4),
new OpenLayers.Geometry.Point(3,4),
new OpenLayers.Geometry.Point(4,4.5),
new OpenLayers.Geometry.Point(5,5)
]);
var ls2 = new OpenLayers.Geometry.LineString([
new OpenLayers.Geometry.Point(0,0),
new OpenLayers.Geometry.Point(1,2.1),
new OpenLayers.Geometry.Point(1.8,3.8),
new OpenLayers.Geometry.Point(2,4),
new OpenLayers.Geometry.Point(3,4),
new OpenLayers.Geometry.Point(4,4.5),
new OpenLayers.Geometry.Point(5,5),
new OpenLayers.Geometry.Point(0,0)
]);
var ls3 = new OpenLayers.Geometry.LineString([
new OpenLayers.Geometry.Point(0,0),
new OpenLayers.Geometry.Point(1,1)
]);
var ls5 = new OpenLayers.Geometry.LineString([
new OpenLayers.Geometry.Point(0,0),
new OpenLayers.Geometry.Point(1,1),
new OpenLayers.Geometry.Point(2,2),
new OpenLayers.Geometry.Point(3,3),
new OpenLayers.Geometry.Point(4,4),
new OpenLayers.Geometry.Point(5,5)
]);
var ls6 = new OpenLayers.Geometry.LineString([
new OpenLayers.Geometry.Point(0,0),
new OpenLayers.Geometry.Point(1,1),
new OpenLayers.Geometry.Point(1,1),
new OpenLayers.Geometry.Point(3,2)
]);
t.ok(ls1 instanceof OpenLayers.Geometry.LineString, 'LineString is instance of OpenLayers.Geometry.LineString');
var simplified1 = ls1.simplify(0.5);
t.ok(simplified1 instanceof OpenLayers.Geometry.LineString, 'Simplified LineString is instance of OpenLayers.Geometry.LineString');
t.ok(simplified1.getVertices().length <= ls1.getVertices().length, 'Simplified LineString has less or equal number of vertices');
// The simplified version is derived from PostGIS function ST_SIMPLIFY()
t.ok(simplified1.toString() === 'LINESTRING(0 0,1.8 3.8,5 5)', 'LineString 1 was simplified correctly');
var simplified2 = ls2.simplify(0.5);
// The simplified version is derived from PostGIS function ST_SIMPLIFY()
t.ok(simplified2.toString() === 'LINESTRING(0 0,1.8 3.8,5 5,0 0)', 'LineString 2 was simplified correctly');
var simplified3 = ls3.simplify(0.5);
t.ok(simplified3.toString() === ls3.toString(), 'LineString with 2 vertices is left untouched');
var simplified5 = ls5.simplify(0.0);
t.ok(simplified5.toString() === 'LINESTRING(0 0,5 5)', 'A tolerance of 0 returns the optimized version needless vertices');
var simplified6 = ls6.simplify(0.0);
t.ok(simplified6.toString() === 'LINESTRING(0 0,1 1,3 2)', 'A tolerance of 0 returns the optimized version without doubled vertices');
}
</script>
</head>