summaryrefslogtreecommitdiff
path: root/misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js')
-rw-r--r--misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js252
1 files changed, 252 insertions, 0 deletions
diff --git a/misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js b/misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js
new file mode 100644
index 0000000..2836ee0
--- /dev/null
+++ b/misc/openlayers/lib/OpenLayers/Tile/UTFGrid.js
@@ -0,0 +1,252 @@
+/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
+ * full list of contributors). Published under the 2-clause BSD license.
+ * See license.txt in the OpenLayers distribution or repository for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Tile.js
+ * @requires OpenLayers/Format/JSON.js
+ * @requires OpenLayers/Request.js
+ */
+
+/**
+ * Class: OpenLayers.Tile.UTFGrid
+ * Instances of OpenLayers.Tile.UTFGrid are used to manage
+ * UTFGrids. This is an unusual tile type in that it doesn't have a
+ * rendered image; only a 'hit grid' that can be used to
+ * look up feature attributes.
+ *
+ * See the <OpenLayers.Tile.UTFGrid> constructor for details on constructing a
+ * new instance.
+ *
+ * Inherits from:
+ * - <OpenLayers.Tile>
+ */
+OpenLayers.Tile.UTFGrid = OpenLayers.Class(OpenLayers.Tile, {
+
+ /**
+ * Property: url
+ * {String}
+ * The URL of the UTFGrid file being requested. Provided by the <getURL>
+ * method.
+ */
+ url: null,
+
+ /**
+ * Property: utfgridResolution
+ * {Number}
+ * Ratio of the pixel width to the width of a UTFGrid data point. If an
+ * entry in the grid represents a 4x4 block of pixels, the
+ * utfgridResolution would be 4. Default is 2.
+ */
+ utfgridResolution: 2,
+
+ /**
+ * Property: json
+ * {Object}
+ * Stores the parsed JSON tile data structure.
+ */
+ json: null,
+
+ /**
+ * Property: format
+ * {OpenLayers.Format.JSON}
+ * Parser instance used to parse JSON for cross browser support. The native
+ * JSON.parse method will be used where available (all except IE<8).
+ */
+ format: null,
+
+ /**
+ * Constructor: OpenLayers.Tile.UTFGrid
+ * Constructor for a new <OpenLayers.Tile.UTFGrid> instance.
+ *
+ * Parameters:
+ * layer - {<OpenLayers.Layer>} layer that the tile will go in.
+ * position - {<OpenLayers.Pixel>}
+ * bounds - {<OpenLayers.Bounds>}
+ * url - {<String>} Deprecated. Remove me in 3.0.
+ * size - {<OpenLayers.Size>}
+ * options - {Object}
+ */
+
+ /**
+ * APIMethod: destroy
+ * Clean up.
+ */
+ destroy: function() {
+ this.clear();
+ OpenLayers.Tile.prototype.destroy.apply(this, arguments);
+ },
+
+ /**
+ * Method: draw
+ * Check that a tile should be drawn, and draw it.
+ * In the case of UTFGrids, "drawing" it means fetching and
+ * parsing the json.
+ *
+ * Returns:
+ * {Boolean} Was a tile drawn?
+ */
+ draw: function() {
+ var drawn = OpenLayers.Tile.prototype.draw.apply(this, arguments);
+ if (drawn) {
+ if (this.isLoading) {
+ this.abortLoading();
+ //if we're already loading, send 'reload' instead of 'loadstart'.
+ this.events.triggerEvent("reload");
+ } else {
+ this.isLoading = true;
+ this.events.triggerEvent("loadstart");
+ }
+ this.url = this.layer.getURL(this.bounds);
+
+ if (this.layer.useJSONP) {
+ // Use JSONP method to avoid xbrowser policy
+ var ols = new OpenLayers.Protocol.Script({
+ url: this.url,
+ callback: function(response) {
+ this.isLoading = false;
+ this.events.triggerEvent("loadend");
+ this.json = response.data;
+ },
+ scope: this
+ });
+ ols.read();
+ this.request = ols;
+ } else {
+ // Use standard XHR
+ this.request = OpenLayers.Request.GET({
+ url: this.url,
+ callback: function(response) {
+ this.isLoading = false;
+ this.events.triggerEvent("loadend");
+ if (response.status === 200) {
+ this.parseData(response.responseText);
+ }
+ },
+ scope: this
+ });
+ }
+ } else {
+ this.unload();
+ }
+ return drawn;
+ },
+
+ /**
+ * Method: abortLoading
+ * Cancel a pending request.
+ */
+ abortLoading: function() {
+ if (this.request) {
+ this.request.abort();
+ delete this.request;
+ }
+ this.isLoading = false;
+ },
+
+ /**
+ * Method: getFeatureInfo
+ * Get feature information associated with a pixel offset. If the pixel
+ * offset corresponds to a feature, the returned object will have id
+ * and data properties. Otherwise, null will be returned.
+ *
+ *
+ * Parameters:
+ * i - {Number} X-axis pixel offset (from top left of tile)
+ * j - {Number} Y-axis pixel offset (from top left of tile)
+ *
+ * Returns:
+ * {Object} Object with feature id and data properties corresponding to the
+ * given pixel offset.
+ */
+ getFeatureInfo: function(i, j) {
+ var info = null;
+ if (this.json) {
+ var id = this.getFeatureId(i, j);
+ if (id !== null) {
+ info = {id: id, data: this.json.data[id]};
+ }
+ }
+ return info;
+ },
+
+ /**
+ * Method: getFeatureId
+ * Get the identifier for the feature associated with a pixel offset.
+ *
+ * Parameters:
+ * i - {Number} X-axis pixel offset (from top left of tile)
+ * j - {Number} Y-axis pixel offset (from top left of tile)
+ *
+ * Returns:
+ * {Object} The feature identifier corresponding to the given pixel offset.
+ * Returns null if pixel doesn't correspond to a feature.
+ */
+ getFeatureId: function(i, j) {
+ var id = null;
+ if (this.json) {
+ var resolution = this.utfgridResolution;
+ var row = Math.floor(j / resolution);
+ var col = Math.floor(i / resolution);
+ var charCode = this.json.grid[row].charCodeAt(col);
+ var index = this.indexFromCharCode(charCode);
+ var keys = this.json.keys;
+ if (!isNaN(index) && (index in keys)) {
+ id = keys[index];
+ }
+ }
+ return id;
+ },
+
+ /**
+ * Method: indexFromCharCode
+ * Given a character code for one of the UTFGrid "grid" characters,
+ * resolve the integer index for the feature id in the UTFGrid "keys"
+ * array.
+ *
+ * Parameters:
+ * charCode - {Integer}
+ *
+ * Returns:
+ * {Integer} Index for the feature id from the keys array.
+ */
+ indexFromCharCode: function(charCode) {
+ if (charCode >= 93) {
+ charCode--;
+ }
+ if (charCode >= 35) {
+ charCode --;
+ }
+ return charCode - 32;
+ },
+
+ /**
+ * Method: parseData
+ * Parse the JSON from a request
+ *
+ * Parameters:
+ * str - {String} UTFGrid as a JSON string.
+ *
+ * Returns:
+ * {Object} parsed javascript data
+ */
+ parseData: function(str) {
+ if (!this.format) {
+ this.format = new OpenLayers.Format.JSON();
+ }
+ this.json = this.format.read(str);
+ },
+
+ /**
+ * Method: clear
+ * Delete data stored with this tile.
+ */
+ clear: function() {
+ this.json = null;
+ },
+
+ CLASS_NAME: "OpenLayers.Tile.UTFGrid"
+
+});