leaflet-geojson-vt
Version:
This is the package for vector-tile.
126 lines (116 loc) • 3.77 kB
JavaScript
L.GeoJSON.VT = L.GridLayer.extend({
options: {
async: false,
},
initialize: function (geojson, options) {
L.setOptions(this, options);
L.GridLayer.prototype.initialize.call(this, options);
this.tileIndex = geojsonvt(geojson, this.options);
},
createTile: function (coords) {
// create a <canvas> element for drawing
var tile = L.DomUtil.create("canvas", "leaflet-tile");
// setup tile width and height according to the options
var size = this.getTileSize();
tile.width = size.x;
tile.height = size.y;
// get a canvas context and draw something on it using coords.x, coords.y and coords.z
var ctx = tile.getContext("2d");
// return the tile so it can be rendered on screen
var tileInfo = this.tileIndex.getTile(coords.z, coords.x, coords.y);
var features = tileInfo ? tileInfo.features : [];
for (var i = 0; i < features.length; i++) {
var feature = features[i];
this.drawFeature(ctx, feature);
}
return tile;
},
drawFeature: function (ctx, feature) {
var typeChanged = type !== feature.type,
type = feature.type;
ctx.beginPath();
if (this.options.style) this.options.style instanceof Function ? this.setStyle(ctx, this.options.style(feature.tags)) : this.setStyle(ctx, this.options.style);
if (type === 2 || type === 3) {
for (var j = 0; j < feature.geometry.length; j++) {
var ring = feature.geometry[j];
for (var k = 0; k < ring.length; k++) {
var p = ring[k];
if (k) ctx.lineTo(p[0] / 16.0, p[1] / 16.0);
else ctx.moveTo(p[0] / 16.0, p[1] / 16.0);
}
}
} else if (type === 1) {
for (var j = 0; j < feature.geometry.length; j++) {
var p = feature.geometry[j];
ctx.arc(p[0] / 16.0, p[1] / 16.0, 2, 0, Math.PI * 2, true);
}
}
if (type === 3) ctx.fill(this.options.style.fillRule || "evenodd");
ctx.stroke();
},
setStyle: function (ctx, style) {
var stroke = style.stroke || true;
if (stroke) {
ctx.lineWidth = style.weight || 5;
var color = this.setOpacity(style.color, style.opacity);
ctx.strokeStyle = color;
} else {
ctx.lineWidth = 0;
ctx.strokeStyle = {};
}
var fill = style.fill || true;
if (fill) {
ctx.fillStyle = style.fillColor || "#03f";
var color = this.setOpacity(style.fillColor, style.fillOpacity);
ctx.fillStyle = color;
} else {
ctx.fillStyle = {};
}
},
setOpacity: function (color, opacity) {
if (opacity) {
var color = color || "#03f";
if (color.iscolorHex()) {
var colorRgb = color.colorRgb();
return (
"rgba(" +
colorRgb[0] +
"," +
colorRgb[1] +
"," +
colorRgb[2] +
"," +
opacity +
")"
);
} else {
return color;
}
} else {
return color;
}
},
});
L.geoJson.vt = function (geojson, options) {
return new L.GeoJSON.VT(geojson, options);
};
String.prototype.iscolorHex = function () {
var sColor = this.toLowerCase();
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
return reg.test(sColor);
};
String.prototype.colorRgb = function () {
var sColor = this.toLowerCase();
if (sColor.length === 4) {
var sColorNew = "#";
for (var i = 1; i < 4; i += 1) {
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
}
sColor = sColorNew;
}
var sColorChange = [];
for (var i = 1; i < 7; i += 2) {
sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
}
return sColorChange;
};