LonLat.initialize() to 14 significant figures. Added an OpenLayers.Util.toFloat() function, and changed the LonLat constructor and the Bounds constructor to truncate all float parameters to 14 significant figures to avoid numeric comparison errors caused by floating point precision loss. See the comments around the definition of OpenLayers.Util.DEFAULT_PRECISION for how it works. Also refactored Bounds.intersectBounds() for readability, and added a Bounds.touchesBounds() in the process. After tweaking the tests for Layer.SphericalMercator and Format.WKT (because they were expecting too many significant figures), all tests pass. git-svn-id: http://svn.openlayers.org/trunk/openlayers@9022 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
245 lines
10 KiB
HTML
245 lines
10 KiB
HTML
<html>
|
|
<head>
|
|
<script src="../../lib/OpenLayers.js"></script>
|
|
<script type="text/javascript">
|
|
|
|
var points = [];
|
|
for(var i=0; i<12; ++i) {
|
|
points.push(new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.Point(Math.random() * 100,
|
|
Math.random() * 100))
|
|
);
|
|
}
|
|
var multipoint = new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.MultiPoint([
|
|
points[0].geometry,
|
|
points[1].geometry,
|
|
points[2].geometry
|
|
])
|
|
);
|
|
|
|
var linestrings = [
|
|
new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.LineString([
|
|
points[0].geometry,
|
|
points[1].geometry,
|
|
points[2].geometry
|
|
])
|
|
),
|
|
new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.LineString([
|
|
points[3].geometry,
|
|
points[4].geometry,
|
|
points[5].geometry
|
|
])
|
|
)
|
|
];
|
|
|
|
var multilinestring = new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.MultiLineString([
|
|
linestrings[0].geometry,
|
|
linestrings[1].geometry
|
|
])
|
|
);
|
|
|
|
var rings = [
|
|
new OpenLayers.Geometry.LinearRing([
|
|
points[0].geometry,
|
|
points[1].geometry,
|
|
points[2].geometry
|
|
]),
|
|
new OpenLayers.Geometry.LinearRing([
|
|
points[3].geometry,
|
|
points[4].geometry,
|
|
points[5].geometry
|
|
]),
|
|
new OpenLayers.Geometry.LinearRing([
|
|
points[6].geometry,
|
|
points[7].geometry,
|
|
points[8].geometry
|
|
]),
|
|
new OpenLayers.Geometry.LinearRing([
|
|
points[9].geometry,
|
|
points[10].geometry,
|
|
points[11].geometry
|
|
])
|
|
];
|
|
|
|
var polygons = [
|
|
new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.Polygon([rings[0], rings[1]])
|
|
),
|
|
new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.Polygon([rings[2], rings[3]])
|
|
)
|
|
];
|
|
|
|
var multipolygon = new OpenLayers.Feature.Vector(
|
|
new OpenLayers.Geometry.MultiPolygon([
|
|
polygons[0].geometry,
|
|
polygons[1].geometry
|
|
])
|
|
);
|
|
|
|
var collection = [points[0], linestrings[0]];
|
|
|
|
function test_Format_WKT_constructor(t) {
|
|
t.plan(4);
|
|
|
|
var options = {'foo': 'bar'};
|
|
var format = new OpenLayers.Format.WKT(options);
|
|
t.ok(format instanceof OpenLayers.Format.WKT,
|
|
"new OpenLayers.Format.WKT returns object" );
|
|
t.eq(format.foo, "bar", "constructor sets options correctly");
|
|
t.eq(typeof format.read, "function", "format has a read function");
|
|
t.eq(typeof format.write, "function", "format has a write function");
|
|
}
|
|
|
|
function test_Format_WKT_write(t) {
|
|
t.plan(7);
|
|
|
|
var format = new OpenLayers.Format.WKT();
|
|
|
|
// test a point
|
|
|
|
t.eq(format.write(points[0]),
|
|
"POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")",
|
|
"format correctly writes Point WKT");
|
|
|
|
// test a multipoint
|
|
t.eq(format.write(multipoint),
|
|
"MULTIPOINT(" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + ")",
|
|
"format correctly writes MultiPoint WKT");
|
|
|
|
// test a linestring
|
|
t.eq(format.write(linestrings[0]),
|
|
"LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + ")",
|
|
"format correctly writes LineString WKT");
|
|
|
|
// test a multilinestring
|
|
t.eq(format.write(multilinestring),
|
|
"MULTILINESTRING((" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + ")," +
|
|
"(" + points[3].geometry.x + " " + points[3].geometry.y + "," +
|
|
points[4].geometry.x + " " + points[4].geometry.y + "," +
|
|
points[5].geometry.x + " " + points[5].geometry.y + "))",
|
|
"format correctly writes MultiLineString WKT");
|
|
|
|
// test a polygon
|
|
t.eq(format.write(polygons[0]),
|
|
"POLYGON((" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + "," +
|
|
points[0].geometry.x + " " + points[0].geometry.y + ")," +
|
|
"(" + points[3].geometry.x + " " + points[3].geometry.y + "," +
|
|
points[4].geometry.x + " " + points[4].geometry.y + "," +
|
|
points[5].geometry.x + " " + points[5].geometry.y + "," +
|
|
points[3].geometry.x + " " + points[3].geometry.y + "))",
|
|
"format correctly writes Polygon WKT");
|
|
|
|
// test a multipolygon
|
|
t.eq(format.write(multipolygon),
|
|
"MULTIPOLYGON(((" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + "," +
|
|
points[0].geometry.x + " " + points[0].geometry.y + ")," +
|
|
"(" + points[3].geometry.x + " " + points[3].geometry.y + "," +
|
|
points[4].geometry.x + " " + points[4].geometry.y + "," +
|
|
points[5].geometry.x + " " + points[5].geometry.y + "," +
|
|
points[3].geometry.x + " " + points[3].geometry.y + "))," +
|
|
"((" + points[6].geometry.x + " " + points[6].geometry.y + "," +
|
|
points[7].geometry.x + " " + points[7].geometry.y + "," +
|
|
points[8].geometry.x + " " + points[8].geometry.y + "," +
|
|
points[6].geometry.x + " " + points[6].geometry.y + ")," +
|
|
"(" + points[9].geometry.x + " " + points[9].geometry.y + "," +
|
|
points[10].geometry.x + " " + points[10].geometry.y + "," +
|
|
points[11].geometry.x + " " + points[11].geometry.y + "," +
|
|
points[9].geometry.x + " " + points[9].geometry.y + ")))",
|
|
"format correctly writes MultiPolygon WKT");
|
|
|
|
// test a geometrycollection
|
|
t.eq(format.write(collection),
|
|
"GEOMETRYCOLLECTION(POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")," +
|
|
"LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + "))",
|
|
"format correctly writes GeometryCollection WKT");
|
|
|
|
}
|
|
|
|
function test_Format_WKT_read(t) {
|
|
t.plan(7);
|
|
|
|
var format = new OpenLayers.Format.WKT();
|
|
|
|
/**
|
|
* Since we're explicitly testing calls to write, the read tests
|
|
* just make sure that geometry can make a round trip from read to write.
|
|
*/
|
|
|
|
// test a point
|
|
t.ok(points[0].geometry.equals(format.read(format.write(points[0])).geometry),
|
|
"format correctly reads Point WKT");
|
|
|
|
// test a multipoint
|
|
t.ok(multipoint.geometry.equals(format.read(format.write(multipoint)).geometry),
|
|
"format correctly reads MultiPoint WKT");
|
|
|
|
// test a linestring
|
|
t.ok(linestrings[0].geometry.equals(format.read(format.write(linestrings[0])).geometry),
|
|
"format correctly reads LineString WKT");
|
|
|
|
// test a multilinestring
|
|
t.ok(multilinestring.geometry.equals(format.read(format.write(multilinestring)).geometry),
|
|
"format correctly reads MultiLineString WKT");
|
|
|
|
// test a polygon
|
|
t.ok(polygons[0].geometry.equals(format.read(format.write(polygons[0])).geometry),
|
|
"format correctly reads Polygon WKT");
|
|
|
|
// test a multipolygon
|
|
t.ok(multipolygon.geometry.equals(format.read(format.write(multipolygon)).geometry),
|
|
"format correctly reads MultiPolygon WKT");
|
|
|
|
// test a geometrycollection
|
|
t.eq(format.write(collection),
|
|
"GEOMETRYCOLLECTION(POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")," +
|
|
"LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," +
|
|
points[1].geometry.x + " " + points[1].geometry.y + "," +
|
|
points[2].geometry.x + " " + points[2].geometry.y + "))",
|
|
"format correctly writes GeometryCollection WKT");
|
|
|
|
}
|
|
|
|
function test_Format_WKT_read_projection(t) {
|
|
t.plan(1);
|
|
|
|
var projections = {
|
|
src: new OpenLayers.Projection("EPSG:4326"),
|
|
dest: new OpenLayers.Projection("EPSG:900913")
|
|
};
|
|
|
|
var points = {
|
|
src: new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-87.9, 41.9)),
|
|
dest: new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-9784983.2393667, 5146011.6785665))
|
|
};
|
|
|
|
var format = new OpenLayers.Format.WKT({
|
|
externalProjection: projections["src"],
|
|
internalProjection: projections["dest"]
|
|
});
|
|
var feature = format.read("GEOMETRYCOLLECTION(POINT(" + points["src"].geometry.x + " " + points["src"].geometry.y + "))")[0];
|
|
t.eq(feature.geometry.toString(), points["dest"].geometry.toString(),
|
|
"Geometry collections aren't transformed twice when reprojection.");
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
</body>
|
|
</html>
|