Files
openlayers/tests/Geometry/Polygon.html

359 lines
16 KiB
HTML

<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
var polygon;
var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
var components2 = [new OpenLayers.Geometry.Point(12,15), new OpenLayers.Geometry.Point(2,3), new OpenLayers.Geometry.Point(10,0), new OpenLayers.Geometry.Point(10,10)];
var linearRing = new OpenLayers.Geometry.LinearRing(components);
var linearRing2 = new OpenLayers.Geometry.LinearRing(components2);
function test_Polygon_constructor (t) {
t.plan( 3 );
polygon = new OpenLayers.Geometry.Polygon();
t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
t.eq( polygon.components.length, 0, "polygon.components is set correctly");
}
function test_Polygon_constructor (t) {
t.plan( 3 );
polygon = new OpenLayers.Geometry.Polygon([linearRing]);
t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
t.eq( polygon.components.length, 1, "polygon.components.length is set correctly");
}
function test_Polygon_constructor (t) {
t.plan( 3 );
polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
t.eq( polygon.components.length, 2, "polygon.components.length is set correctly");
}
function test_Polygon_transform_getBounds (t) {
t.plan(3);
var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
var linearRing = new OpenLayers.Geometry.LinearRing(components);
polygon = new OpenLayers.Geometry.Polygon([linearRing.clone()]);
polygon.calculateBounds();
t.ok( polygon.bounds != null, "bounds calculated by calcBounds" );
polygon.transform(new OpenLayers.Projection("EPSG:4326"),
new OpenLayers.Projection("EPSG:900913"));
t.eq(polygon.bounds, null, "Point bounds cleared after transform");
t.eq(polygon.getBounds().toBBOX(), "556597.453889,334111.171355,1113194.907778,1574216.547942", "Bounds are correct")
}
function test_Polygon_getArea(t) {
t.plan( 5 );
//no components
var polygon = new OpenLayers.Geometry.Polygon();
t.eq(polygon.getArea(), 0, "getArea empty polygon is 0");
var createSquareRing = function(area) {
var points = [
new OpenLayers.Geometry.Point(0, 0),
new OpenLayers.Geometry.Point(0, area),
new OpenLayers.Geometry.Point(area, area),
new OpenLayers.Geometry.Point(area, 0)
];
var ring = new OpenLayers.Geometry.LinearRing(points);
return ring;
};
//simple polygon
var comps = [ createSquareRing(2) ];
var polygon = new OpenLayers.Geometry.Polygon(comps);
t.eq(polygon.getArea(), 4, "getArea simple polygon works lovely");
//polygon with holes
comps = [ createSquareRing(10),
createSquareRing(2),
createSquareRing(3),
createSquareRing(4)
];
var polygon = new OpenLayers.Geometry.Polygon(comps);
t.eq(polygon.getArea(), 71, "getArea polygon with holes works lovely");
//simple polygon negative
comps = [ createSquareRing(-2) ];
var polygon = new OpenLayers.Geometry.Polygon(comps);
t.eq(polygon.getArea(), 4, "getArea simple polygon negative works lovely");
//polygon with holes negative
comps = [ createSquareRing(-10),
createSquareRing(-2),
createSquareRing(-3),
createSquareRing(-4)
];
var polygon = new OpenLayers.Geometry.Polygon(comps);
t.eq(polygon.getArea(), 71, "getArea negative polygon with holes works lovely");
}
function test_Polygon_move(t) {
t.plan(4);
polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
var x = linearRing.components[0].x;
var y = linearRing.components[0].y;
var x2 = linearRing2.components[0].x;
var y2 = linearRing2.components[0].y;
var dx = 10 * Math.random();
var dy = 10 * Math.random();
polygon.move(dx, dy);
t.eq(polygon.components[0].components[0].x, x + dx, "move() correctly modifies first x");
t.eq(polygon.components[0].components[0].y, y + dy, "move() correctly modifies first y");
t.eq(polygon.components[1].components[0].x, x2 + dx, "move() correctly modifies second x");
t.eq(polygon.components[1].components[0].y, y2 + dy, "move() correctly modifies second y");
}
function test_Polygon_rotate(t) {
t.plan(6);
var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
var originals = [];
var comp;
var angle = 2 * Math.PI * Math.random();
var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
10 * Math.random());
for(var i=0; i<geometry.components.length; ++i) {
comp = geometry.components[i];
originals[i] = comp.rotate;
comp.rotate = function(a, o) {
t.ok(true, "rotate called for component " + i);
t.ok(a == angle, "rotate called with correct angle");
t.ok(o == origin, "rotate called with correct origin");
}
}
geometry.rotate(angle, origin);
// restore the original rotate defs
for(var i=0; i<geometry.components.length; ++i) {
comp.rotate = originals[i];
}
}
function test_Polygon_resize(t) {
t.plan(8);
var tolerance = 1e-10;
var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
10 * Math.random());
var scale = 10 * Math.random();
var oldArea = geometry.getArea();
var oldPerimeter = geometry.getLength();
geometry.resize(scale, origin);
var newArea = geometry.getArea();
var newPerimeter = geometry.getLength();
t.ok((((newArea / oldArea) - (scale * scale)) / (scale * scale)) < tolerance,
"resize correctly changes the area of a polygon")
t.ok((((newPerimeter / oldPerimeter) - scale) / scale) < tolerance,
"resize correctly changes the perimeter of a polygon")
var originals = [];
var comp;
for(var i=0; i<geometry.components.length; ++i) {
comp = geometry.components[i];
originals[i] = comp.resize;
comp.resize = function(s, o) {
t.ok(true, "resize called for component " + i);
t.ok(s == scale, "resize called with correct scale");
t.ok(o == origin, "resize called with correct origin");
}
}
geometry.resize(scale, origin);
// restore the original resize defs
for(var i=0; i<geometry.components.length; ++i) {
comp.resize = originals[i];
}
}
function test_Polygon_createRegular(t) {
t.plan(22);
var sides = 40;
var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
var polyBounds = poly.getBounds();
t.eq(polyBounds.toBBOX(), "-0.981504,-5.981504,10.981504,5.981504", sides + " sided figure generates correct bbox.");
t.eq(poly.components.length, 1, "Poly has one linear ring");
t.eq(poly.components[0].components.length, sides + 1, "ring has 41 components");
t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
t.eq(Math.round(poly.getArea()), Math.round(Math.PI * 36), "area of "+sides+" sided poly rounds to same area as a circle.");
var sides = 3;
var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
var polyBounds = poly.getBounds();
t.eq(polyBounds.toBBOX(), "-0.196152,-3,10.196152,6", sides + " sided figure generates correct bbox.");
t.eq(poly.components.length, 1, "Poly has one linear ring");
t.eq(poly.components[0].components.length, sides + 1, "ring has correct count of components");
t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
t.eq(Math.round(poly.getArea()), 47, "area of 3 sided poly is correct");
var sides = 3;
var poly3 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
var polyBounds = poly3.getBounds();
t.eq(polyBounds.toBBOX(), "-2.990381,-7.5,22.990381,15", sides + " sided figure generates correct bbox.");
t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
t.eq(poly3.components.length, 1, "Poly has one linear ring");
t.eq(poly3.components[0].components.length, sides + 1, "ring has correct count of components");
t.eq(poly3.components[0].components[0].id, poly3.components[0].components[sides].id, "ring starts and ends with same geom");
t.ok(poly3.getArea() > poly.getArea(), "area with radius 15 > poly with radius 6");
var sides = 4;
var poly4 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
var polyBounds = poly4.getBounds();
t.eq(polyBounds.toBBOX(), "-0.606602,-10.606602,20.606602,10.606602", sides + " sided figure generates correct bbox.");
t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
t.eq(poly4.components.length, 1, "Poly has one linear ring");
t.eq(poly4.components[0].components.length, sides + 1, "ring has correct count of components");
t.eq(poly4.components[0].components[0].id, poly4.components[0].components[sides].id, "ring starts and ends with same geom");
t.ok(poly4.getArea() > poly3.getArea(), "square with radius 15 > triangle with radius 15");
}
function test_Polygon_equals(t) {
t.plan(3);
var x0 = Math.random() * 100;
var y0 = Math.random() * 100;
var x1 = Math.random() * 100;
var y1 = Math.random() * 100;
var x2 = Math.random() * 100;
var y2 = Math.random() * 100;
var point0 = new OpenLayers.Geometry.Point(x0, y0);
var point1 = new OpenLayers.Geometry.Point(x1, y1);
var point2 = new OpenLayers.Geometry.Point(x2, y2);
var pointX = new OpenLayers.Geometry.Point(x0 + 1, y0);
var pointY = new OpenLayers.Geometry.Point(x0, y0 + 1);
var geometry = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
var equal = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
var offX = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing([pointX, point1, point2])]);
var offY = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing([pointY, point1, point2])]);
t.ok(geometry.equals(equal),
"equals() returns true for a geometry with equivalent coordinates");
t.ok(!geometry.equals(offX),
"equals() returns false for a geometry with offset x");
t.ok(!geometry.equals(offY),
"equals() returns false for a geometry with offset y");
}
function test_distanceTo(t) {
var wkt = OpenLayers.Geometry.fromWKT;
var geoms = [
wkt("POLYGON((0 3, 1 4, 2 3, 1 2, 0 3))"),
wkt("POINT(0 0)"),
wkt("LINESTRING(-2 0, 0 -2, 2 -1, 2 0)"),
wkt("LINESTRING(0 2, 1 3)"),
wkt("POINT(1 3)")
];
var cases = [{
got: geoms[0].distanceTo(geoms[1]),
expected: Math.sqrt(5)
}, {
got: geoms[0].distanceTo(geoms[1], {details: true}),
expected: {
distance: Math.sqrt(5),
x0: 1, y0: 2,
x1: 0, y1: 0
}
}, {
got: geoms[0].distanceTo(geoms[2], {details: true}),
expected: {
distance: Math.sqrt(5),
x0: 1, y0: 2,
x1: 2, y1: 0
}
}, {
got: geoms[0].distanceTo(geoms[3], {details: true}),
expected: {
distance: 0,
x0: 0.5, y0: 2.5,
x1: 0.5, y1: 2.5
}
}, {
got: geoms[0].distanceTo(geoms[4]),
expected: Math.sqrt(0.5)
}, {
got: geoms[0].distanceTo(geoms[4], {edge: false}),
expected: 0
}];
t.plan(cases.length);
for(var i=0; i<cases.length; ++i) {
t.eq(cases[i].got, cases[i].expected, "case " + i);
}
}
function test_getVertices(t) {
t.plan(6);
var points = [
new OpenLayers.Geometry.Point(10, 20),
new OpenLayers.Geometry.Point(20, 30),
new OpenLayers.Geometry.Point(30, 40),
new OpenLayers.Geometry.Point(40, 50)
];
var polygon = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing(points)
]);
var verts = polygon.getVertices();
t.ok(verts instanceof Array, "got back an array");
t.eq(verts.length, points.length, "of correct length length");
t.geom_eq(verts[0], points[0], "0: correct geometry");
t.geom_eq(verts[1], points[1], "1: correct geometry");
t.geom_eq(verts[2], points[2], "2: correct geometry");
t.geom_eq(verts[3], points[3], "3: correct geometry");
}
function test_Polygon_clone(t) {
t.plan(2);
var x0 = Math.random() * 100;
var y0 = Math.random() * 100;
var x1 = Math.random() * 100;
var y1 = Math.random() * 100;
var x2 = Math.random() * 100;
var y2 = Math.random() * 100;
var point0 = new OpenLayers.Geometry.Point(x0, y0);
var point1 = new OpenLayers.Geometry.Point(x1, y1);
var point2 = new OpenLayers.Geometry.Point(x2, y2);
var geometry = new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
var clone = geometry.clone();
t.ok(clone instanceof OpenLayers.Geometry.Polygon,
"clone() creates an OpenLayers.Geometry.Polygon");
t.ok(geometry.equals(clone), "clone has equivalent coordinates");
}
</script>
</head>
<body>
</body>
</html>