123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846 |
- /*
- * CesiumHeatmap.js v0.1 | Cesium Heatmap Library
- *
- * Works with heatmap.js v2.0.0: http://www.patrick-wied.at/static/heatmapjs/
- */
- (function (window) {
- 'use strict';
- function define_CesiumHeatmap() {
- var CesiumHeatmap = {
- defaults: {
- useEntitiesIfAvailable: true, //whether to use entities if a Viewer is supplied or always use an ImageryProvider
- minCanvasSize: 700, // minimum size (in pixels) for the heatmap canvas
- maxCanvasSize: 2000, // maximum size (in pixels) for the heatmap canvas
- radiusFactor: 60, // data point size factor used if no radius is given (the greater of height and width divided by this number yields the used radius)
- spacingFactor: 1.5, // extra space around the borders (point radius multiplied by this number yields the spacing)
- maxOpacity: 0.8, // the maximum opacity used if not given in the heatmap options object
- minOpacity: 0.1, // the minimum opacity used if not given in the heatmap options object
- blur: 0.85, // the blur used if not given in the heatmap options object
- gradient: { // the gradient used if not given in the heatmap options object
- '.3': 'blue',
- '.65': 'yellow',
- '.8': 'orange',
- '.95': 'red'
- },
- }
- };
- /* Create a CesiumHeatmap instance
- *
- * cesium: the CesiumWidget or Viewer instance
- * bb: the WGS84 bounding box like {north, east, south, west}
- * options: a heatmap.js options object (see http://www.patrick-wied.at/static/heatmapjs/docs.html#h337-create)
- */
- CesiumHeatmap.create = function (cesium, bb, options) {
- var instance = new CHInstance(cesium, bb, options);
- return instance;
- };
- CesiumHeatmap._getContainer = function (width, height, id) {
- var c = document.createElement("div");
- if (id) {
- c.setAttribute("id", id);
- }
- c.setAttribute("style", "width: " + width + "px; height: " + height + "px; margin: 0px; display: none;");
- document.body.appendChild(c);
- return c;
- };
- CesiumHeatmap._getImageryProvider = function (instance) {
- //var n = (new Date()).getTime();
- var d = instance._heatmap.getDataURL();
- //console.log("Create data URL: " + ((new Date()).getTime() - n));
- //var n = (new Date()).getTime();
- var imgprov = new Cesium.SingleTileImageryProvider({
- url: d,
- rectangle: instance._rectangle
- });
- //console.log("Create imageryprovider: " + ((new Date()).getTime() - n));
- imgprov._tilingScheme = new Cesium.WebMercatorTilingScheme({
- rectangleSouthwestInMeters: new Cesium.Cartesian2(instance._mbounds.west, instance._mbounds.south),
- rectangleNortheastInMeters: new Cesium.Cartesian2(instance._mbounds.east, instance._mbounds.north)
- });
- return imgprov;
- };
- CesiumHeatmap._getID = function (len) {
- var text = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for (var i = 0; i < ((len) ? len : 8); i++)
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- return text;
- };
- var WMP = new Cesium.WebMercatorProjection();
- /* Convert a WGS84 location into a mercator location
- *
- * p: the WGS84 location like {x: lon, y: lat}
- */
- CesiumHeatmap.wgs84ToMercator = function (p) {
- var mp = WMP.project(Cesium.Cartographic.fromDegrees(p.x, p.y));
- return {
- x: mp.x,
- y: mp.y
- };
- };
- /* Convert a WGS84 bounding box into a mercator bounding box
- *
- * bb: the WGS84 bounding box like {north, east, south, west}
- */
- CesiumHeatmap.wgs84ToMercatorBB = function (bb) {
- var sw = WMP.project(Cesium.Cartographic.fromDegrees(bb.west, bb.south));
- var ne = WMP.project(Cesium.Cartographic.fromDegrees(bb.east, bb.north));
- return {
- north: ne.y,
- east: ne.x,
- south: sw.y,
- west: sw.x
- };
- };
- /* Convert a mercator location into a WGS84 location
- *
- * p: the mercator lcation like {x, y}
- */
- CesiumHeatmap.mercatorToWgs84 = function (p) {
- var wp = WMP.unproject(new Cesium.Cartesian3(p.x, p.y));
- return {
- x: wp.longitude,
- y: wp.latitude
- };
- };
- /* Convert a mercator bounding box into a WGS84 bounding box
- *
- * bb: the mercator bounding box like {north, east, south, west}
- */
- CesiumHeatmap.mercatorToWgs84BB = function (bb) {
- var sw = WMP.unproject(new Cesium.Cartesian3(bb.west, bb.south));
- var ne = WMP.unproject(new Cesium.Cartesian3(bb.east, bb.north));
- return {
- north: this.rad2deg(ne.latitude),
- east: this.rad2deg(ne.longitude),
- south: this.rad2deg(sw.latitude),
- west: this.rad2deg(sw.longitude)
- };
- };
- /* Convert degrees into radians
- *
- * d: the degrees to be converted to radians
- */
- CesiumHeatmap.deg2rad = function (d) {
- var r = d * (Math.PI / 180.0);
- return r;
- };
- /* Convert radians into degrees
- *
- * r: the radians to be converted to degrees
- */
- CesiumHeatmap.rad2deg = function (r) {
- var d = r / (Math.PI / 180.0);
- return d;
- };
- return CesiumHeatmap;
- }
- if (typeof(CesiumHeatmap) === 'undefined') {
- window.CesiumHeatmap = define_CesiumHeatmap();
- } else {
- console.log("CesiumHeatmap already defined.");
- }
- })(window);
- /* Initiate a CesiumHeatmap instance
- *
- * c: CesiumWidget instance
- * bb: a WGS84 bounding box like {north, east, south, west}
- * o: a heatmap.js options object (see http://www.patrick-wied.at/static/heatmapjs/docs.html#h337-create)
- */
- function CHInstance(c, bb, o) {
- if (!bb) {
- return null;
- }
- if (!o) {
- o = {};
- }
- this._cesium = c;
- this._options = o;
- this._id = CesiumHeatmap._getID();
- this._options.gradient = ((this._options.gradient) ? this._options.gradient : CesiumHeatmap.defaults.gradient);
- this._options.maxOpacity = ((this._options.maxOpacity) ? this._options.maxOpacity : CesiumHeatmap.defaults.maxOpacity);
- this._options.minOpacity = ((this._options.minOpacity) ? this._options.minOpacity : CesiumHeatmap.defaults.minOpacity);
- this._options.blur = ((this._options.blur) ? this._options.blur : CesiumHeatmap.defaults.blur);
- this._mbounds = CesiumHeatmap.wgs84ToMercatorBB(bb);
- this._setWidthAndHeight(this._mbounds);
- this._options.radius = Math.round((this._options.radius) ? this._options.radius : ((this.width > this.height) ? this.width / CesiumHeatmap.defaults.radiusFactor : this.height / CesiumHeatmap.defaults.radiusFactor));
- this._spacing = this._options.radius * CesiumHeatmap.defaults.spacingFactor;
- this._xoffset = this._mbounds.west;
- this._yoffset = this._mbounds.south;
- this.width = Math.round(this.width + this._spacing * 2);
- this.height = Math.round(this.height + this._spacing * 2);
- this._mbounds.west -= this._spacing * this._factor;
- this._mbounds.east += this._spacing * this._factor;
- this._mbounds.south -= this._spacing * this._factor;
- this._mbounds.north += this._spacing * this._factor;
- this.bounds = CesiumHeatmap.mercatorToWgs84BB(this._mbounds);
- this._rectangle = Cesium.Rectangle.fromDegrees(this.bounds.west, this.bounds.south, this.bounds.east, this.bounds.north);
- this._container = CesiumHeatmap._getContainer(this.width, this.height, this._id);
- this._options.container = this._container;
- this._heatmap = h337.create(this._options);
- this._container.children[0].setAttribute("id", this._id + "-hm");
- }
- /* Convert a WGS84 location to the corresponding heatmap location
- *
- * p: a WGS84 location like {x:lon, y:lat}
- */
- CHInstance.prototype.wgs84PointToHeatmapPoint = function (p) {
- return this.mercatorPointToHeatmapPoint(CesiumHeatmap.wgs84ToMercator(p));
- };
- /* Convert a mercator location to the corresponding heatmap location
- *
- * p: a WGS84 location like {x: lon, y:lat}
- */
- CHInstance.prototype.mercatorPointToHeatmapPoint = function (p) {
- var pn = {};
- pn.x = Math.round((p.x - this._xoffset) / this._factor + this._spacing);
- pn.y = Math.round((p.y - this._yoffset) / this._factor + this._spacing);
- pn.y = this.height - pn.y;
- return pn;
- };
- CHInstance.prototype._setWidthAndHeight = function (mbb) {
- this.width = ((mbb.east > 0 && mbb.west < 0) ? mbb.east + Math.abs(mbb.west) : Math.abs(mbb.east - mbb.west));
- this.height = ((mbb.north > 0 && mbb.south < 0) ? mbb.north + Math.abs(mbb.south) : Math.abs(mbb.north - mbb.south));
- this._factor = 1;
- if (this.width > this.height && this.width > CesiumHeatmap.defaults.maxCanvasSize) {
- this._factor = this.width / CesiumHeatmap.defaults.maxCanvasSize;
- if (this.height / this._factor < CesiumHeatmap.defaults.minCanvasSize) {
- this._factor = this.height / CesiumHeatmap.defaults.minCanvasSize;
- }
- } else if (this.height > this.width && this.height > CesiumHeatmap.defaults.maxCanvasSize) {
- this._factor = this.height / CesiumHeatmap.defaults.maxCanvasSize;
- if (this.width / this._factor < CesiumHeatmap.defaults.minCanvasSize) {
- this._factor = this.width / CesiumHeatmap.defaults.minCanvasSize;
- }
- } else if (this.width < this.height && this.width < CesiumHeatmap.defaults.minCanvasSize) {
- this._factor = this.width / CesiumHeatmap.defaults.minCanvasSize;
- if (this.height / this._factor > CesiumHeatmap.defaults.maxCanvasSize) {
- this._factor = this.height / CesiumHeatmap.defaults.maxCanvasSize;
- }
- } else if (this.height < this.width && this.height < CesiumHeatmap.defaults.minCanvasSize) {
- this._factor = this.height / CesiumHeatmap.defaults.minCanvasSize;
- if (this.width / this._factor > CesiumHeatmap.defaults.maxCanvasSize) {
- this._factor = this.width / CesiumHeatmap.defaults.maxCanvasSize;
- }
- }
- this.width = this.width / this._factor;
- this.height = this.height / this._factor;
- };
- /* Set an array of heatmap locations
- *
- * min: the minimum allowed value for the data values
- * max: the maximum allowed value for the data values
- * data: an array of data points in heatmap coordinates and values like {x, y, value}
- */
- CHInstance.prototype.setData = function (min, max, data) {
- if (data && data.length > 0 && min !== null && min !== false && max !== null && max !== false) {
- this._heatmap.setData({
- min: min,
- max: max,
- data: data
- });
- this.updateLayer();
- return true;
- }
- return false;
- };
- /* Set an array of WGS84 locations
- *
- * min: the minimum allowed value for the data values
- * max: the maximum allowed value for the data values
- * data: an array of data points in WGS84 coordinates and values like { x:lon, y:lat, value }
- */
- CHInstance.prototype.setWGS84Data = function (min, max, data) {
- if (data && data.length > 0 && min !== null && min !== false && max !== null && max !== false) {
- var convdata = [];
- for (var i = 0; i < data.length; i++) {
- var gp = data[i];
- var hp = this.wgs84PointToHeatmapPoint(gp);
- if (gp.value || gp.value === 0) {
- hp.value = gp.value;
- }
- convdata.push(hp);
- }
- return this.setData(min, max, convdata);
- }
- return false;
- };
- /* Set whether or not the heatmap is shown on the map
- *
- * s: true means the heatmap is shown, false means the heatmap is hidden
- */
- CHInstance.prototype.show = function (s) {
- if (this._layer) {
- this._layer.show = s;
- }
- };
- /* Update/(re)draw the heatmap
- */
- CHInstance.prototype.updateLayer = function () {
- // only works with a Viewer instance since the cesiumWidget
- // instance doesn't contain an entities property
- if (CesiumHeatmap.defaults.useEntitiesIfAvailable && this._cesium.entities) {
- if (this._layer) {
- this._cesium.entities.remove(this._layer);
- }
- // Work around issue with material rendering in Cesium
- // provided by https://github.com/criis
- material = new Cesium.ImageMaterialProperty({
- image: this._heatmap._renderer.canvas,
- });
- if (Cesium.VERSION >= "1.21") {
- material.transparent = true;
- } else if (Cesium.VERSION >= "1.16") {
- material.alpha = 0.99;
- }
- this._layer = this._cesium.entities.add({
- show: true,
- rectangle: {
- coordinates: this._rectangle,
- material: material
- }
- });
- } else {
- if (this._layer) {
- this._cesium.scene.imageryLayers.remove(this._layer);
- }
- this._layer = this._cesium.scene.imageryLayers.addImageryProvider(CesiumHeatmap._getImageryProvider(this));
- }
- };
- /* DON'T TOUCH:
- *
- * heatmap.js v2.0.0 | JavaScript Heatmap Library: http://www.patrick-wied.at/static/heatmapjs/
- *
- * Copyright 2008-2014 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved.
- * Dual licensed under MIT and Beerware license
- *
- * :: 2014-10-31 21:16
- */
- (function (a, b, c) {
- if (typeof module !== "undefined" && module.exports) {
- module.exports = c()
- } else if (typeof define === "function" && define.amd) {
- define(c)
- } else {
- b[a] = c()
- }
- })("h337", this, function () {
- var a = {
- defaultRadius: 40,
- defaultRenderer: "canvas2d",
- defaultGradient: {.25: "rgb(0,0,255)", .55: "rgb(0,255,0)", .85: "yellow", 1: "rgb(255,0,0)"},
- defaultMaxOpacity: 1,
- defaultMinOpacity: 0,
- defaultBlur: .85,
- defaultXField: "x",
- defaultYField: "y",
- defaultValueField: "value",
- plugins: {}
- };
- var b = function h() {
- var b = function d(a) {
- this._coordinator = {};
- this._data = [];
- this._radi = [];
- this._min = 0;
- this._max = 1;
- this._xField = a["xField"] || a.defaultXField;
- this._yField = a["yField"] || a.defaultYField;
- this._valueField = a["valueField"] || a.defaultValueField;
- if (a["radius"]) {
- this._cfgRadius = a["radius"]
- }
- };
- var c = a.defaultRadius;
- b.prototype = {
- _organiseData: function (a, b) {
- var d = a[this._xField];
- var e = a[this._yField];
- var f = this._radi;
- var g = this._data;
- var h = this._max;
- var i = this._min;
- var j = a[this._valueField] || 1;
- var k = a.radius || this._cfgRadius || c;
- if (!g[d]) {
- g[d] = [];
- f[d] = []
- }
- if (!g[d][e]) {
- g[d][e] = j;
- f[d][e] = k
- } else {
- g[d][e] += j
- }
- if (g[d][e] > h) {
- if (!b) {
- this._max = g[d][e]
- } else {
- this.setDataMax(g[d][e])
- }
- return false
- } else {
- return {x: d, y: e, value: j, radius: k, min: i, max: h}
- }
- }, _unOrganizeData: function () {
- var a = [];
- var b = this._data;
- var c = this._radi;
- for (var d in b) {
- for (var e in b[d]) {
- a.push({x: d, y: e, radius: c[d][e], value: b[d][e]})
- }
- }
- return {min: this._min, max: this._max, data: a}
- }, _onExtremaChange: function () {
- this._coordinator.emit("extremachange", {min: this._min, max: this._max})
- }, addData: function () {
- if (arguments[0].length > 0) {
- var a = arguments[0];
- var b = a.length;
- while (b--) {
- this.addData.call(this, a[b])
- }
- } else {
- var c = this._organiseData(arguments[0], true);
- if (c) {
- this._coordinator.emit("renderpartial", {min: this._min, max: this._max, data: [c]})
- }
- }
- return this
- }, setData: function (a) {
- var b = a.data;
- var c = b.length;
- this._data = [];
- this._radi = [];
- for (var d = 0; d < c; d++) {
- this._organiseData(b[d], false)
- }
- this._max = a.max;
- this._min = a.min || 0;
- this._onExtremaChange();
- this._coordinator.emit("renderall", this._getInternalData());
- return this
- }, removeData: function () {
- }, setDataMax: function (a) {
- this._max = a;
- this._onExtremaChange();
- this._coordinator.emit("renderall", this._getInternalData());
- return this
- }, setDataMin: function (a) {
- this._min = a;
- this._onExtremaChange();
- this._coordinator.emit("renderall", this._getInternalData());
- return this
- }, setCoordinator: function (a) {
- this._coordinator = a
- }, _getInternalData: function () {
- return {max: this._max, min: this._min, data: this._data, radi: this._radi}
- }, getData: function () {
- return this._unOrganizeData()
- }
- };
- return b
- }();
- var c = function i() {
- var a = function (a) {
- var b = a.gradient || a.defaultGradient;
- var c = document.createElement("canvas");
- var d = c.getContext("2d");
- c.width = 256;
- c.height = 1;
- var e = d.createLinearGradient(0, 0, 256, 1);
- for (var f in b) {
- e.addColorStop(f, b[f])
- }
- d.fillStyle = e;
- d.fillRect(0, 0, 256, 1);
- return d.getImageData(0, 0, 256, 1).data
- };
- var b = function (a, b) {
- var c = document.createElement("canvas");
- var d = c.getContext("2d");
- var e = a;
- var f = a;
- c.width = c.height = a * 2;
- if (b == 1) {
- d.beginPath();
- d.arc(e, f, a, 0, 2 * Math.PI, false);
- d.fillStyle = "rgba(0,0,0,1)";
- d.fill()
- } else {
- var g = d.createRadialGradient(e, f, a * b, e, f, a);
- g.addColorStop(0, "rgba(0,0,0,1)");
- g.addColorStop(1, "rgba(0,0,0,0)");
- d.fillStyle = g;
- d.fillRect(0, 0, 2 * a, 2 * a)
- }
- return c
- };
- var c = function (a) {
- var b = [];
- var c = a.min;
- var d = a.max;
- var e = a.radi;
- var a = a.data;
- var f = Object.keys(a);
- var g = f.length;
- while (g--) {
- var h = f[g];
- var i = Object.keys(a[h]);
- var j = i.length;
- while (j--) {
- var k = i[j];
- var l = a[h][k];
- var m = e[h][k];
- b.push({x: h, y: k, value: l, radius: m})
- }
- }
- return {min: c, max: d, data: b}
- };
- function d(b) {
- var c = b.container;
- var d = this.shadowCanvas = document.createElement("canvas");
- var e = this.canvas = b.canvas || document.createElement("canvas");
- var f = this._renderBoundaries = [1e4, 1e4, 0, 0];
- var g = getComputedStyle(b.container) || {};
- e.className = "heatmap-canvas";
- this._width = e.width = d.width = +g.width.replace(/px/, "");
- this._height = e.height = d.height = +g.height.replace(/px/, "");
- this.shadowCtx = d.getContext("2d");
- this.ctx = e.getContext("2d");
- e.style.cssText = d.style.cssText = "position:absolute;left:0;top:0;";
- c.style.position = "relative";
- c.appendChild(e);
- this._palette = a(b);
- this._templates = {};
- this._setStyles(b)
- }
- d.prototype = {
- renderPartial: function (a) {
- this._drawAlpha(a);
- this._colorize()
- }, renderAll: function (a) {
- this._clear();
- this._drawAlpha(c(a));
- this._colorize()
- }, _updateGradient: function (b) {
- this._palette = a(b)
- }, updateConfig: function (a) {
- if (a["gradient"]) {
- this._updateGradient(a)
- }
- this._setStyles(a)
- }, setDimensions: function (a, b) {
- this._width = a;
- this._height = b;
- this.canvas.width = this.shadowCanvas.width = a;
- this.canvas.height = this.shadowCanvas.height = b
- }, _clear: function () {
- this.shadowCtx.clearRect(0, 0, this._width, this._height);
- this.ctx.clearRect(0, 0, this._width, this._height)
- }, _setStyles: function (a) {
- this._blur = a.blur == 0 ? 0 : a.blur || a.defaultBlur;
- if (a.backgroundColor) {
- this.canvas.style.backgroundColor = a.backgroundColor
- }
- this._opacity = (a.opacity || 0) * 255;
- this._maxOpacity = (a.maxOpacity || a.defaultMaxOpacity) * 255;
- this._minOpacity = (a.minOpacity || a.defaultMinOpacity) * 255;
- this._useGradientOpacity = !!a.useGradientOpacity
- }, _drawAlpha: function (a) {
- var c = this._min = a.min;
- var d = this._max = a.max;
- var a = a.data || [];
- var e = a.length;
- var f = 1 - this._blur;
- while (e--) {
- var g = a[e];
- var h = g.x;
- var i = g.y;
- var j = g.radius;
- var k = Math.min(g.value, d);
- var l = h - j;
- var m = i - j;
- var n = this.shadowCtx;
- var o;
- if (!this._templates[j]) {
- this._templates[j] = o = b(j, f)
- } else {
- o = this._templates[j]
- }
- n.globalAlpha = (k - c) / (d - c);
- n.drawImage(o, l, m);
- if (l < this._renderBoundaries[0]) {
- this._renderBoundaries[0] = l
- }
- if (m < this._renderBoundaries[1]) {
- this._renderBoundaries[1] = m
- }
- if (l + 2 * j > this._renderBoundaries[2]) {
- this._renderBoundaries[2] = l + 2 * j
- }
- if (m + 2 * j > this._renderBoundaries[3]) {
- this._renderBoundaries[3] = m + 2 * j
- }
- }
- }, _colorize: function () {
- var a = this._renderBoundaries[0];
- var b = this._renderBoundaries[1];
- var c = this._renderBoundaries[2] - a;
- var d = this._renderBoundaries[3] - b;
- var e = this._width;
- var f = this._height;
- var g = this._opacity;
- var h = this._maxOpacity;
- var i = this._minOpacity;
- var j = this._useGradientOpacity;
- if (a < 0) {
- a = 0
- }
- if (b < 0) {
- b = 0
- }
- if (a + c > e) {
- c = e - a
- }
- if (b + d > f) {
- d = f - b
- }
- var k = this.shadowCtx.getImageData(a, b, c, d);
- var l = k.data;
- var m = l.length;
- var n = this._palette;
- for (var o = 3; o < m; o += 4) {
- var p = l[o];
- var q = p * 4;
- if (!q) {
- continue
- }
- var r;
- if (g > 0) {
- r = g
- } else {
- if (p < h) {
- if (p < i) {
- r = i
- } else {
- r = p
- }
- } else {
- r = h
- }
- }
- l[o - 3] = n[q];
- l[o - 2] = n[q + 1];
- l[o - 1] = n[q + 2];
- l[o] = j ? n[q + 3] : r
- }
- k.data = l;
- this.ctx.putImageData(k, a, b);
- this._renderBoundaries = [1e3, 1e3, 0, 0]
- }, getValueAt: function (a) {
- var b;
- var c = this.shadowCtx;
- var d = c.getImageData(a.x, a.y, 1, 1);
- var e = d.data[3];
- var f = this._max;
- var g = this._min;
- b = Math.abs(f - g) * (e / 255) >> 0;
- return b
- }, getDataURL: function () {
- return this.canvas.toDataURL()
- }
- };
- return d
- }();
- var d = function j() {
- var b = false;
- if (a["defaultRenderer"] === "canvas2d") {
- b = c
- }
- return b
- }();
- var e = {
- merge: function () {
- var a = {};
- var b = arguments.length;
- for (var c = 0; c < b; c++) {
- var d = arguments[c];
- for (var e in d) {
- a[e] = d[e]
- }
- }
- return a
- }
- };
- var f = function k() {
- var c = function h() {
- function a() {
- this.cStore = {}
- }
- a.prototype = {
- on: function (a, b, c) {
- var d = this.cStore;
- if (!d[a]) {
- d[a] = []
- }
- d[a].push(function (a) {
- return b.call(c, a)
- })
- }, emit: function (a, b) {
- var c = this.cStore;
- if (c[a]) {
- var d = c[a].length;
- for (var e = 0; e < d; e++) {
- var f = c[a][e];
- f(b)
- }
- }
- }
- };
- return a
- }();
- var f = function (a) {
- var b = a._renderer;
- var c = a._coordinator;
- var d = a._store;
- c.on("renderpartial", b.renderPartial, b);
- c.on("renderall", b.renderAll, b);
- c.on("extremachange", function (b) {
- a._config.onExtremaChange && a._config.onExtremaChange({
- min: b.min,
- max: b.max,
- gradient: a._config["gradient"] || a._config["defaultGradient"]
- })
- });
- d.setCoordinator(c)
- };
- function g() {
- var g = this._config = e.merge(a, arguments[0] || {});
- this._coordinator = new c;
- if (g["plugin"]) {
- var h = g["plugin"];
- if (!a.plugins[h]) {
- throw new Error("Plugin '" + h + "' not found. Maybe it was not registered.")
- } else {
- var i = a.plugins[h];
- this._renderer = new i.renderer(g);
- this._store = new i.store(g)
- }
- } else {
- this._renderer = new d(g);
- this._store = new b(g)
- }
- f(this)
- }
- g.prototype = {
- addData: function () {
- this._store.addData.apply(this._store, arguments);
- return this
- }, removeData: function () {
- this._store.removeData && this._store.removeData.apply(this._store, arguments);
- return this
- }, setData: function () {
- this._store.setData.apply(this._store, arguments);
- return this
- }, setDataMax: function () {
- this._store.setDataMax.apply(this._store, arguments);
- return this
- }, setDataMin: function () {
- this._store.setDataMin.apply(this._store, arguments);
- return this
- }, configure: function (a) {
- this._config = e.merge(this._config, a);
- this._renderer.updateConfig(this._config);
- this._coordinator.emit("renderall", this._store._getInternalData());
- return this
- }, repaint: function () {
- this._coordinator.emit("renderall", this._store._getInternalData());
- return this
- }, getData: function () {
- return this._store.getData()
- }, getDataURL: function () {
- return this._renderer.getDataURL()
- }, getValueAt: function (a) {
- if (this._store.getValueAt) {
- return this._store.getValueAt(a)
- } else if (this._renderer.getValueAt) {
- return this._renderer.getValueAt(a)
- } else {
- return null
- }
- }
- };
- return g
- }();
- var g = {
- create: function (a) {
- return new f(a)
- }, register: function (b, c) {
- a.plugins[b] = c
- }
- };
- return g
- });
|