123 lines
2.2 KiB
JavaScript
123 lines
2.2 KiB
JavaScript
goog.provide('ol3.TileCoord');
|
|
|
|
goog.require('goog.array');
|
|
goog.require('ol3.Coordinate');
|
|
|
|
|
|
/**
|
|
* @enum {number}
|
|
*/
|
|
ol3.QuadKeyCharCode = {
|
|
ZERO: '0'.charCodeAt(0),
|
|
ONE: '1'.charCodeAt(0),
|
|
TWO: '2'.charCodeAt(0),
|
|
THREE: '3'.charCodeAt(0)
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* @constructor
|
|
* @extends {ol3.Coordinate}
|
|
* @param {number} z Z.
|
|
* @param {number} x X.
|
|
* @param {number} y Y.
|
|
*/
|
|
ol3.TileCoord = function(z, x, y) {
|
|
|
|
goog.base(this, x, y);
|
|
|
|
/**
|
|
* @type {number}
|
|
*/
|
|
this.z = z;
|
|
|
|
};
|
|
goog.inherits(ol3.TileCoord, ol3.Coordinate);
|
|
|
|
|
|
/**
|
|
* @param {string} quadKey Quad key.
|
|
* @return {ol3.TileCoord} Tile coordinate.
|
|
*/
|
|
ol3.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 ol3.QuadKeyCharCode.ONE:
|
|
x += mask;
|
|
break;
|
|
case ol3.QuadKeyCharCode.TWO:
|
|
y += mask;
|
|
break;
|
|
case ol3.QuadKeyCharCode.THREE:
|
|
x += mask;
|
|
y += mask;
|
|
break;
|
|
}
|
|
mask >>= 1;
|
|
}
|
|
return new ol3.TileCoord(z, x, y);
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} str String.
|
|
* @return {ol3.TileCoord} Tile coord.
|
|
*/
|
|
ol3.TileCoord.createFromString = function(str) {
|
|
var v = str.split('/');
|
|
v = goog.array.map(v, function(e, i, a) {
|
|
return parseInt(e, 10);
|
|
});
|
|
return new ol3.TileCoord(v[0], v[1], v[2]);
|
|
};
|
|
|
|
|
|
/**
|
|
* @return {ol3.TileCoord} Clone.
|
|
*/
|
|
ol3.TileCoord.prototype.clone = function() {
|
|
return new ol3.TileCoord(this.z, this.x, this.y);
|
|
};
|
|
|
|
|
|
/**
|
|
* @return {number} Hash.
|
|
*/
|
|
ol3.TileCoord.prototype.hash = function() {
|
|
return (this.x << this.z) + this.y;
|
|
};
|
|
|
|
|
|
/**
|
|
* @return {string} Quad key.
|
|
*/
|
|
ol3.TileCoord.prototype.quadKey = function() {
|
|
var digits = new Array(this.z);
|
|
var mask = 1 << (this.z - 1);
|
|
var i, charCode;
|
|
for (i = 0; i < this.z; ++i) {
|
|
charCode = ol3.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.
|
|
*/
|
|
ol3.TileCoord.prototype.toString = function() {
|
|
return [this.z, this.x, this.y].join('/');
|
|
};
|