sjy-ecos/public/lib/bokeh/js/tree/models/tiles/tile_source.js

187 lines
5.3 KiB
JavaScript

var ImagePool, Model, TileSource, _, logger, p, tile_utils,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
_ = require("underscore");
ImagePool = require("./image_pool");
tile_utils = require("./tile_utils");
logger = require("../../core/logging").logger;
p = require("../../core/properties");
Model = require("../../model");
TileSource = (function(superClass) {
extend(TileSource, superClass);
TileSource.prototype.type = 'TileSource';
TileSource.define({
url: [p.String, ''],
tile_size: [p.Number, 256],
max_zoom: [p.Number, 30],
min_zoom: [p.Number, 0],
extra_url_vars: [p.Any, {}],
attribution: [p.String, ''],
x_origin_offset: [p.Number],
y_origin_offset: [p.Number],
initial_resolution: [p.Number]
});
TileSource.prototype.initialize = function(options) {
TileSource.__super__.initialize.call(this, options);
return this.normalize_case();
};
function TileSource(options) {
if (options == null) {
options = {};
}
TileSource.__super__.constructor.apply(this, arguments);
this.utils = new tile_utils.ProjectionUtils();
this.pool = new ImagePool();
this.tiles = {};
this.normalize_case();
}
TileSource.prototype.string_lookup_replace = function(str, lookup) {
var key, result_str, value;
result_str = str;
for (key in lookup) {
value = lookup[key];
result_str = result_str.replace('{' + key + '}', value.toString());
}
return result_str;
};
TileSource.prototype.normalize_case = function() {
'Note: should probably be refactored into subclasses.';
var url;
url = this.get('url');
url = url.replace('{x}', '{X}');
url = url.replace('{y}', '{Y}');
url = url.replace('{z}', '{Z}');
url = url.replace('{q}', '{Q}');
url = url.replace('{xmin}', '{XMIN}');
url = url.replace('{ymin}', '{YMIN}');
url = url.replace('{xmax}', '{XMAX}');
url = url.replace('{ymax}', '{YMAX}');
return this.set('url', url);
};
TileSource.prototype.update = function() {
var key, ref, results, tile;
logger.debug("TileSource: tile cache count: " + (Object.keys(this.tiles).length));
ref = this.tiles;
results = [];
for (key in ref) {
tile = ref[key];
tile.current = false;
results.push(tile.retain = false);
}
return results;
};
TileSource.prototype.tile_xyz_to_key = function(x, y, z) {
var key;
key = x + ":" + y + ":" + z;
return key;
};
TileSource.prototype.key_to_tile_xyz = function(key) {
var c;
return (function() {
var i, len, ref, results;
ref = key.split(':');
results = [];
for (i = 0, len = ref.length; i < len; i++) {
c = ref[i];
results.push(parseInt(c));
}
return results;
})();
};
TileSource.prototype.sort_tiles_from_center = function(tiles, tile_extent) {
var center_x, center_y, txmax, txmin, tymax, tymin;
txmin = tile_extent[0], tymin = tile_extent[1], txmax = tile_extent[2], tymax = tile_extent[3];
center_x = (txmax - txmin) / 2 + txmin;
center_y = (tymax - tymin) / 2 + tymin;
tiles.sort(function(a, b) {
var a_distance, b_distance;
a_distance = Math.sqrt(Math.pow(center_x - a[0], 2) + Math.pow(center_y - a[1], 2));
b_distance = Math.sqrt(Math.pow(center_x - b[0], 2) + Math.pow(center_y - b[1], 2));
return a_distance - b_distance;
});
return tiles;
};
TileSource.prototype.prune_tiles = function() {
var key, ref, ref1, results, tile;
ref = this.tiles;
for (key in ref) {
tile = ref[key];
tile.retain = tile.current || tile.tile_coords[2] < 3;
if (tile.current) {
this.retain_neighbors(tile);
this.retain_children(tile);
this.retain_parents(tile);
}
}
ref1 = this.tiles;
results = [];
for (key in ref1) {
tile = ref1[key];
if (!tile.retain) {
results.push(this.remove_tile(key));
} else {
results.push(void 0);
}
}
return results;
};
TileSource.prototype.remove_tile = function(key) {
var tile;
tile = this.tiles[key];
if (tile != null) {
this.pool.push(tile.img);
return delete this.tiles[key];
}
};
TileSource.prototype.get_image_url = function(x, y, z) {
var image_url;
image_url = this.string_lookup_replace(this.get('url'), this.get('extra_url_vars'));
return image_url.replace("{X}", x).replace('{Y}', y).replace("{Z}", z);
};
TileSource.prototype.retain_neighbors = function(reference_tile) {
throw Error("Not Implemented");
};
TileSource.prototype.retain_parents = function(reference_tile) {
throw Error("Not Implemented");
};
TileSource.prototype.retain_children = function(reference_tile) {
throw Error("Not Implemented");
};
TileSource.prototype.tile_xyz_to_quadkey = function(x, y, z) {
throw Error("Not Implemented");
};
TileSource.prototype.quadkey_to_tile_xyz = function(quadkey) {
throw Error("Not Implemented");
};
return TileSource;
})(Model);
module.exports = TileSource;