dhy
parent
4a4cc57bbc
commit
8def26f474
After Width: | Height: | Size: 3.3 KiB |
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* L.TileLayer.Colorizr is a regular tilelayer with mapped colors.
|
||||
*/
|
||||
(function () {
|
||||
// L.TileLayer.Colorizr =
|
||||
var Colorizr = L.TileLayer.extend({
|
||||
initialize: function (url, options) {
|
||||
options = L.extend(
|
||||
{},
|
||||
L.TileLayer.prototype.options,
|
||||
{
|
||||
colorize: function (pixel) {
|
||||
return pixel;
|
||||
},
|
||||
crossOrigin: "Anonymous",
|
||||
},
|
||||
options
|
||||
);
|
||||
L.TileLayer.prototype.initialize.call(this, url, options);
|
||||
L.setOptions(this, options);
|
||||
this.setColorizr(this.options.colorize);
|
||||
this.on("tileload", function (e) {
|
||||
this._colorize(e.tile);
|
||||
});
|
||||
},
|
||||
setColorizr: function (colorizrFactory) {
|
||||
if (!colorizrFactory || typeof colorizrFactory !== "function") {
|
||||
throw (
|
||||
'The colorize option should be a function and return an object with at least one of "r", "g", "b", or "a" properties. Got:' +
|
||||
typeof colorizrFactory
|
||||
);
|
||||
} else {
|
||||
this.options.colorize = colorizrFactory;
|
||||
}
|
||||
this.redraw(false);
|
||||
},
|
||||
_createTile: function () {
|
||||
var tile = L.TileLayer.prototype._createTile.call(this);
|
||||
tile.crossOrigin = "Anonymous";
|
||||
return tile;
|
||||
},
|
||||
_colorize: function (img) {
|
||||
if (img.getAttribute("data-colorized")) {
|
||||
img.hidden = false;
|
||||
return;
|
||||
} else {
|
||||
img.hidden = true;
|
||||
}
|
||||
var _img = img;
|
||||
var img = new Image();
|
||||
img.crossOrigin = "Anonymous";
|
||||
img.src = _img.src;
|
||||
var _this = this;
|
||||
img.onload = function () {
|
||||
var canvas = document.createElement("canvas");
|
||||
canvas.width = img.width;
|
||||
canvas.height = img.height;
|
||||
var ctx = canvas.getContext("2d");
|
||||
ctx.drawImage(img, 0, 0);
|
||||
var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
var pix = imgd.data;
|
||||
for (var i = 0, n = pix.length; i < n; i += 4) {
|
||||
var pixel = _this.options.colorize({
|
||||
r: pix[i],
|
||||
g: pix[i + 1],
|
||||
b: pix[i + 2],
|
||||
a: pix[i + 3],
|
||||
});
|
||||
if (
|
||||
!!!pixel ||
|
||||
pixel !== Object(pixel) ||
|
||||
Object.prototype.toString.call(pixel) === "[object Array]"
|
||||
) {
|
||||
if (i === 0) {
|
||||
throw 'The colorize option should return an object with at least one of "r", "g", "b", or "a" properties.';
|
||||
}
|
||||
} else {
|
||||
if (pixel.hasOwnProperty("r") && typeof pixel.r === "number") {
|
||||
pix[i] = pixel.r;
|
||||
}
|
||||
if (pixel.hasOwnProperty("g")) {
|
||||
pix[i + 1] = pixel.g;
|
||||
}
|
||||
if (pixel.hasOwnProperty("b")) {
|
||||
pix[i + 2] = pixel.b;
|
||||
}
|
||||
if (pixel.hasOwnProperty("a")) {
|
||||
pix[i + 3] = pixel.a;
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.putImageData(imgd, 0, 0);
|
||||
_img.setAttribute("data-colorized", true);
|
||||
_img.src = canvas.toDataURL();
|
||||
};
|
||||
},
|
||||
});
|
||||
(function (factory, window) {
|
||||
// define an AMD module that relies on 'leaflet'
|
||||
if (typeof define === "function" && define.amd) {
|
||||
define(["leaflet"], factory);
|
||||
// define a Common JS module that relies on 'leaflet'
|
||||
} else if (typeof exports === "object") {
|
||||
module.exports = factory(require("leaflet"));
|
||||
}
|
||||
// attach your plugin to the global 'L' variable
|
||||
if (typeof window !== "undefined" && window.L) {
|
||||
window.L.tileLayer.colorizr = factory(L);
|
||||
}
|
||||
})(function (L) {
|
||||
return function (url, options) {
|
||||
return new Colorizr(url, options);
|
||||
};
|
||||
}, window);
|
||||
})();
|
Loading…
Reference in new issue