kopia lustrzana https://github.com/robhawkes/vizicities
102 wiersze
2.3 KiB
JavaScript
Executable File
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};
|