EncodedPolyline: Extracted universal decode(encoded, dims) method
This commit is contained in:
@@ -61,11 +61,50 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
|
|||||||
else if (this.geometryType != "polygon")
|
else if (this.geometryType != "polygon")
|
||||||
return null;
|
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 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 i = 0; i < encoded.length;) {
|
||||||
for (var dim = 0; dim < 2; ++dim) {
|
for (var dim = 0; dim < dims; ++dim) {
|
||||||
var result = 0;
|
var result = 0;
|
||||||
var shift = 0;
|
var shift = 0;
|
||||||
|
|
||||||
@@ -79,20 +118,10 @@ OpenLayers.Format.EncodedPolyline = OpenLayers.Class(OpenLayers.Format, {
|
|||||||
point[dim] += ((result & 1) ? ~(result >> 1) : (result >> 1));
|
point[dim] += ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
points.push(new OpenLayers.Geometry.Point(point[1] * 1e-5,
|
points.push(point.slice(0));
|
||||||
point[0] * 1e-5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.geometryType == "polygon")
|
return points;
|
||||||
return new OpenLayers.Feature.Vector(
|
|
||||||
new OpenLayers.Geometry.Polygon([
|
|
||||||
new OpenLayers.Geometry.LinearRing(points)
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
return new OpenLayers.Feature.Vector(
|
|
||||||
new geomType(points)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
CLASS_NAME: "OpenLayers.Format.EncodedPolyline"
|
CLASS_NAME: "OpenLayers.Format.EncodedPolyline"
|
||||||
|
|||||||
@@ -3,10 +3,19 @@
|
|||||||
<script src="../OLLoader.js"></script>
|
<script src="../OLLoader.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
var basePoints = new Array(
|
||||||
|
new Array(3850000, -12020000),
|
||||||
|
new Array(4070000, -12095000),
|
||||||
|
new Array(4325200, -12645300)
|
||||||
|
);
|
||||||
|
|
||||||
var points = [
|
var points = [
|
||||||
new OpenLayers.Geometry.Point(-120.2, 38.5),
|
new OpenLayers.Geometry.Point(basePoints[0][1] * 1e-5,
|
||||||
new OpenLayers.Geometry.Point(-120.95, 40.7),
|
basePoints[0][0] * 1e-5),
|
||||||
new OpenLayers.Geometry.Point(-126.45300000000002, 43.252)
|
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(
|
var linestring = new OpenLayers.Feature.Vector(
|
||||||
@@ -45,6 +54,7 @@
|
|||||||
t.plan(4);
|
t.plan(4);
|
||||||
|
|
||||||
var format = new OpenLayers.Format.EncodedPolyline();
|
var format = new OpenLayers.Format.EncodedPolyline();
|
||||||
|
|
||||||
t.ok(linestring.geometry.equals(format.read(encoded).geometry),
|
t.ok(linestring.geometry.equals(format.read(encoded).geometry),
|
||||||
"format correctly reads encoded polyline");
|
"format correctly reads encoded polyline");
|
||||||
|
|
||||||
@@ -63,6 +73,20 @@
|
|||||||
"format correctly reads encoded polygon");
|
"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>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Reference in New Issue
Block a user