vizicities/src/layer/tile/MVTTile.js

102 wiersze
2.3 KiB
JavaScript
Executable File

import GeoJSONTile from './GeoJSONTile';
import extend from 'lodash.assign';
import Pbf from 'pbf';
import {VectorTile} from '@mapbox/vector-tile';
// TODO: Process raw MVT data rather than convert to GeoJSON
// TODO: Make it so full request and processing cycle occurs within a worker
class MVTTile extends GeoJSONTile {
constructor(quadcode, path, layer, options) {
var defaults = {
mvt: true,
fetch: true
};
options = extend({}, defaults, options);
super(quadcode, path, layer, options);
this._controller;
this._signal;
}
_requestTile() {
var urlParams = {
x: this._tile[0],
y: this._tile[1],
z: this._tile[2]
};
var url = this._getTileURL(urlParams);
if ('AbortController' in window) {
// Abort any previous requests
if (this._controller) {
this._controller.abort();
}
// Create a fresh abort controller so old ones don't cause problems
this._controller = new AbortController();
this._signal = this._controller.signal;
}
this._aborted = false;
fetch(url, {
signal: this._signal
}).then((response) => {
return response.arrayBuffer();
}).then((data) => {
var buffer = new Pbf(data);
var vt = new VectorTile(buffer);
var fc = {type: 'FeatureCollection', features: []};
var layers = [];
if (this._options.layers) {
layers = this._options.layers;
}
// Process defined layers (otherwise all)
for (var key in vt.layers) {
if (layers.length > 0) {
if (!layers.includes(key)) {
continue;
}
}
var layer = vt.layers[key];
for (var f = 0; f < layer.length; f++) {
var feature = layer.feature(f);
fc.features.push(feature.toGeoJSON(urlParams.x, urlParams.y, urlParams.z));
}
}
this._processTileData(fc);
// Clean up
buffer = null;
vt = null;
layers = null;
fc = null;
}).catch((err) => {
if (err.name === 'AbortError') {
return;
}
console.error(err);
});
}
}
export default MVTTile;
var noNew = function(path, options) {
return new MVTTile(path, options);
};
export {noNew as mvtTile};