From 7902803063ad9b5de29d46ed8188bbcff48df969 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 25 Jul 2012 17:39:38 +0200 Subject: [PATCH] Add ol.TileCoord.toQuadKey and createFromQuadKey --- src/ol/tile/tilecoord.js | 60 +++++++++++++++++++++++++++++++++++ src/ol/tile/tilecoord_test.js | 13 ++++++++ 2 files changed, 73 insertions(+) diff --git a/src/ol/tile/tilecoord.js b/src/ol/tile/tilecoord.js index 693fa8b870..63431965df 100644 --- a/src/ol/tile/tilecoord.js +++ b/src/ol/tile/tilecoord.js @@ -4,6 +4,17 @@ goog.require('goog.array'); goog.require('ol.Coordinate'); +/** + * @enum {number} + */ +ol.QuadKeyCharCode = { + ZERO: '0'.charCodeAt(0), + ONE: '1'.charCodeAt(0), + TWO: '2'.charCodeAt(0), + THREE: '3'.charCodeAt(0) +}; + + /** * @constructor @@ -25,6 +36,33 @@ ol.TileCoord = function(z, x, y) { goog.inherits(ol.TileCoord, ol.Coordinate); +/** + * @param {string} quadKey Quad key. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileCoord.createFromQuadKey = function(quadKey) { + var z = quadKey.length, x = 0, y = 0; + var mask = 1 << (z - 1); + var i; + for (i = 0; i < z; ++i) { + switch (quadKey.charCodeAt(i)) { + case ol.QuadKeyCharCode.ONE: + x += mask; + break; + case ol.QuadKeyCharCode.TWO: + y += mask; + break; + case ol.QuadKeyCharCode.THREE: + x += mask; + y += mask; + break; + } + mask >>= 1; + } + return new ol.TileCoord(z, x, y); +}; + + /** * @return {ol.TileCoord} Clone. */ @@ -41,6 +79,28 @@ ol.TileCoord.prototype.hash = function() { }; +/** + * @return {string} Quad key. + */ +ol.TileCoord.prototype.toQuadKey = function() { + var digits = new Array(this.z); + var mask = 1 << (this.z - 1); + var i, charCode; + for (i = 0; i < this.z; ++i) { + charCode = ol.QuadKeyCharCode.ZERO; + if (this.x & mask) { + charCode += 1; + } + if (this.y & mask) { + charCode += 2; + } + digits[i] = String.fromCharCode(charCode); + mask >>= 1; + } + return digits.join(''); +}; + + /** * @return {string} String. */ diff --git a/src/ol/tile/tilecoord_test.js b/src/ol/tile/tilecoord_test.js index b106a60a81..815e90a90c 100644 --- a/src/ol/tile/tilecoord_test.js +++ b/src/ol/tile/tilecoord_test.js @@ -2,6 +2,14 @@ goog.require('goog.testing.jsunit'); goog.require('ol.TileCoord'); +function testCreateFromQuadKey() { + var tileCoord = ol.TileCoord.createFromQuadKey('213'); + assertEquals(3, tileCoord.z); + assertEquals(3, tileCoord.x); + assertEquals(5, tileCoord.y); +} + + function testConstructorOrderZXY() { var tc1 = new ol.TileCoord(1, 2, 3); assertEquals(1, tc1.z); @@ -24,3 +32,8 @@ function testFromString() { assertEquals(2, tc.x); assertEquals(3, tc.y); } + + +function testToQuadKey() { + assertEquals('213', (new ol.TileCoord(3, 3, 5)).toQuadKey()); +}