EncodedPolyline: Extracted universal decode(encoded, dims) method

This commit is contained in:
Tobias Bieniek
2012-12-27 23:07:31 +01:00
parent 2c5d4c75d4
commit c118d9884d
2 changed files with 70 additions and 17 deletions

View File

@@ -61,11 +61,50 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
else if (this.geometryType != "polygon")
return null;
var points = this.decode(encoded, 2);
var pointGeometries = new Array();
for (i in points) {
var point = points[i];
pointGeometries.push(
new OpenLayers.Geometry.Point(point[1] * 1e-5, point[0] * 1e-5)
);
}
if (this.geometryType == "polygon")
return new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing(pointGeometries)
])
);
return new OpenLayers.Feature.Vector(
new geomType(pointGeometries)
);
},
/**
* Method: decode
* Deserialize an encoded string and return an array of n-dimensional
* points.
*
* Parameters:
* encoded - {String} An encoded string
* dims - {int} The dimension of the points that are returned
*
* Returns:
* {Array(Array(int))} An array containing n-dimensional arrays of
* coordinates.
*/
decode: function(encoded, dims) {
var points = new Array();
var point = new Array(0, 0);
var point = new Array(dims);
// Reset the point array
for (var i = 0; i < point.length; ++i)
point[i] = 0;
for (var i = 0; i < encoded.length;) {
for (var dim = 0; dim < 2; ++dim) {
for (var dim = 0; dim < dims; ++dim) {
var result = 0;
var shift = 0;
@@ -79,20 +118,10 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
point[dim] += ((result & 1) ? ~(result >> 1) : (result >> 1));
}
points.push(new OpenLayers.Geometry.Point(point[1] * 1e-5,
point[0] * 1e-5));
points.push(point.slice(0));
}
if (this.geometryType == "polygon")
return new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Polygon([
new OpenLayers.Geometry.LinearRing(points)
])
);
return new OpenLayers.Feature.Vector(
new geomType(points)
);
return points;
},
CLASS_NAME: "OpenLayers.Format.EncodedPolyline"

View File

@@ -3,10 +3,19 @@
<script src="../OLLoader.js"></script>
<script type="text/javascript">
var basePoints = new Array(
new Array(3850000, -12020000),
new Array(4070000, -12095000),
new Array(4325200, -12645300)
);
var points = [
new OpenLayers.Geometry.Point(-120.2, 38.5),
new OpenLayers.Geometry.Point(-120.95, 40.7),
new OpenLayers.Geometry.Point(-126.45300000000002, 43.252)
new OpenLayers.Geometry.Point(basePoints[0][1] * 1e-5,
basePoints[0][0] * 1e-5),
new OpenLayers.Geometry.Point(basePoints[1][1] * 1e-5,
basePoints[1][0] * 1e-5),
new OpenLayers.Geometry.Point(basePoints[2][1] * 1e-5,
basePoints[2][0] * 1e-5)
];
var linestring = new OpenLayers.Feature.Vector(
@@ -45,6 +54,7 @@
t.plan(4);
var format = new OpenLayers.Format.EncodedPolyline();
t.ok(linestring.geometry.equals(format.read(encoded).geometry),
"format correctly reads encoded polyline");
@@ -63,6 +73,20 @@
"format correctly reads encoded polygon");
}
function test_Format_EncodedPolyline_decode(t) {
t.plan(6);
var format = new OpenLayers.Format.EncodedPolyline();
var decodedPoints = format.decode(encoded, 2);
for (i in decodedPoints) {
var point = basePoints[i];
var decodedPoint = decodedPoints[i];
t.eq(point[0], decodedPoint[0]);
t.eq(point[1], decodedPoint[1]);
}
}
</script>
</head>
<body>