kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
166 lines (160 loc) • 20 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.decodeTile = decodeTile;
exports.getTileData = getTileData;
exports.vectorTileFeatureToProp = vectorTileFeatureToProp;
var _pbf = _interopRequireDefault(require("pbf"));
var _vectorTile = require("@mapbox/vector-tile");
var _viewportMercatorProject = require("viewport-mercator-project");
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/* global fetch */
var TILE_SIZE = 512;
var MAPBOX_HOST = 'https://a.tiles.mapbox.com';
var MAP_SOURCE = '/v4/mapbox.mapbox-streets-v7';
function getTileData(host, token, _ref) {
var _ref$index = _ref.index,
x = _ref$index.x,
y = _ref$index.y,
z = _ref$index.z;
var mapSource = "".concat(host || MAPBOX_HOST).concat(MAP_SOURCE, "/").concat(z, "/").concat(x, "/").concat(y, ".vector.pbf?access_token=").concat(token);
return fetch(mapSource).then(function (response) {
return response.arrayBuffer();
}).then(function (buffer) {
return decodeTile(x, y, z, buffer);
});
}
function decodeTile(x, y, z, arrayBuffer) {
var tile = new _vectorTile.VectorTile(new _pbf["default"](arrayBuffer));
var result = [];
var xProj = x * TILE_SIZE;
var yProj = y * TILE_SIZE;
var scale = Math.pow(2, z);
var projectFunc = project.bind(null, xProj, yProj, scale);
/* eslint-disable guard-for-in */
var layerName = 'building';
var vectorTileLayer = tile.layers[layerName];
if (!vectorTileLayer) {
return [];
}
for (var i = 0; i < vectorTileLayer.length; i++) {
var vectorTileFeature = vectorTileLayer.feature(i);
// @ts-ignore
var features = vectorTileFeatureToProp(vectorTileFeature, projectFunc);
features.forEach(function (f) {
f.properties.layer = layerName;
if (f.properties.height) {
result.push(f);
}
});
}
return result;
}
function project(x, y, scale, line, extent) {
var sizeToPixel = extent / TILE_SIZE;
for (var ii = 0; ii < line.length; ii++) {
var p = line[ii];
// LNGLAT
line[ii] = (0, _viewportMercatorProject.worldToLngLat)([x + p[0] / sizeToPixel, y + p[1] / sizeToPixel], scale);
}
}
/* adapted from @mapbox/vector-tile/lib/vectortilefeature.js for better perf */
/* eslint-disable */
function vectorTileFeatureToProp(vectorTileFeature, project) {
var coords = getCoordinates(vectorTileFeature);
var extent = vectorTileFeature.extent;
var i;
var j;
coords = classifyRings(coords);
for (i = 0; i < coords.length; i++) {
for (j = 0; j < coords[i].length; j++) {
project(coords[i][j], extent);
}
}
return coords.map(function (coordinates) {
return {
coordinates: coordinates,
properties: vectorTileFeature.properties
};
});
}
function getCoordinates(vectorTileFeature) {
var pbf = vectorTileFeature._pbf;
pbf.pos = vectorTileFeature._geometry;
var end = pbf.readVarint() + pbf.pos;
var cmd = 1;
var length = 0;
var x = 0;
var y = 0;
var lines = [];
var line;
while (pbf.pos < end) {
if (length <= 0) {
var cmdLen = pbf.readVarint();
cmd = cmdLen & 0x7;
length = cmdLen >> 3;
}
length--;
if (cmd === 1 || cmd === 2) {
x += pbf.readSVarint();
y += pbf.readSVarint();
if (cmd === 1) {
// moveTo
if (line) lines.push(line);
line = [];
}
if (line) line.push([x, y]);
} else if (cmd === 7) {
// Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
if (line) {
line.push(line[0].slice()); // closePolygon
}
} else {
throw new Error("unknown command ".concat(cmd));
}
}
if (line) lines.push(line);
return lines;
}
// classifies an array of rings into polygons with outer rings and holes
function classifyRings(rings) {
var len = rings.length;
if (len <= 1) return [rings];
var polygons = [];
var polygon;
var ccw;
for (var i = 0; i < len; i++) {
var area = signedArea(rings[i]);
if (area === 0) {
continue;
}
if (ccw === undefined) {
ccw = area < 0;
}
if (ccw === area < 0) {
if (polygon) {
polygons.push(polygon);
}
polygon = [rings[i]];
} else if (polygon) {
polygon.push(rings[i]);
}
}
if (polygon) {
polygons.push(polygon);
}
return polygons;
}
function signedArea(ring) {
var sum = 0;
for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
p1 = ring[i];
p2 = ring[j];
sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);
}
return sum;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGJmIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdmVjdG9yVGlsZSIsIl92aWV3cG9ydE1lcmNhdG9yUHJvamVjdCIsIlRJTEVfU0laRSIsIk1BUEJPWF9IT1NUIiwiTUFQX1NPVVJDRSIsImdldFRpbGVEYXRhIiwiaG9zdCIsInRva2VuIiwiX3JlZiIsIl9yZWYkaW5kZXgiLCJpbmRleCIsIngiLCJ5IiwieiIsIm1hcFNvdXJjZSIsImNvbmNhdCIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwiYXJyYXlCdWZmZXIiLCJidWZmZXIiLCJkZWNvZGVUaWxlIiwidGlsZSIsIlZlY3RvclRpbGUiLCJQcm90b2J1ZiIsInJlc3VsdCIsInhQcm9qIiwieVByb2oiLCJzY2FsZSIsIk1hdGgiLCJwb3ciLCJwcm9qZWN0RnVuYyIsInByb2plY3QiLCJiaW5kIiwibGF5ZXJOYW1lIiwidmVjdG9yVGlsZUxheWVyIiwibGF5ZXJzIiwiaSIsImxlbmd0aCIsInZlY3RvclRpbGVGZWF0dXJlIiwiZmVhdHVyZSIsImZlYXR1cmVzIiwidmVjdG9yVGlsZUZlYXR1cmVUb1Byb3AiLCJmb3JFYWNoIiwiZiIsInByb3BlcnRpZXMiLCJsYXllciIsImhlaWdodCIsInB1c2giLCJsaW5lIiwiZXh0ZW50Iiwic2l6ZVRvUGl4ZWwiLCJpaSIsInAiLCJ3b3JsZFRvTG5nTGF0IiwiY29vcmRzIiwiZ2V0Q29vcmRpbmF0ZXMiLCJqIiwiY2xhc3NpZnlSaW5ncyIsIm1hcCIsImNvb3JkaW5hdGVzIiwicGJmIiwicG9zIiwiX2dlb21ldHJ5IiwiZW5kIiwicmVhZFZhcmludCIsImNtZCIsImxpbmVzIiwiY21kTGVuIiwicmVhZFNWYXJpbnQiLCJzbGljZSIsIkVycm9yIiwicmluZ3MiLCJsZW4iLCJwb2x5Z29ucyIsInBvbHlnb24iLCJjY3ciLCJhcmVhIiwic2lnbmVkQXJlYSIsInVuZGVmaW5lZCIsInJpbmciLCJzdW0iLCJwMSIsInAyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjLzNkLWJ1aWxkaW5nLWxheWVyLzNkLWJ1aWxkaW5nLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBQcm90b2J1ZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlfSBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmltcG9ydCB7d29ybGRUb0xuZ0xhdH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge1xuICBDb29yZGluYXRlcyxcbiAgRmxhdEZpZ3VyZSxcbiAgVGlsZURhdGFJdGVtLFxuICBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiBnbG9iYWwgZmV0Y2ggKi9cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjtcbmNvbnN0IE1BUEJPWF9IT1NUID0gJ2h0dHBzOi8vYS50aWxlcy5tYXBib3guY29tJztcbmNvbnN0IE1BUF9TT1VSQ0UgPSAnL3Y0L21hcGJveC5tYXBib3gtc3RyZWV0cy12Nyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWxlRGF0YShcbiAgaG9zdDogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICB7aW5kZXg6IHt4LCB5LCB6fX06IHtpbmRleDogQ29vcmRpbmF0ZXN9XG4pOiBQcm9taXNlPFRpbGVEYXRhSXRlbVtdPiB7XG4gIGNvbnN0IG1hcFNvdXJjZSA9IGAke1xuICAgIGhvc3QgfHwgTUFQQk9YX0hPU1RcbiAgfSR7TUFQX1NPVVJDRX0vJHt6fS8ke3h9LyR7eX0udmVjdG9yLnBiZj9hY2Nlc3NfdG9rZW49JHt0b2tlbn1gO1xuXG4gIHJldHVybiBmZXRjaChtYXBTb3VyY2UpXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAudGhlbihidWZmZXIgPT4gZGVjb2RlVGlsZSh4LCB5LCB6LCBidWZmZXIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRpbGUoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB6OiBudW1iZXIsXG4gIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxuKTogVGlsZURhdGFJdGVtW10ge1xuICBjb25zdCB0aWxlID0gbmV3IFZlY3RvclRpbGUobmV3IFByb3RvYnVmKGFycmF5QnVmZmVyKSk7XG5cbiAgY29uc3QgcmVzdWx0OiBUaWxlRGF0YUl0ZW1bXSA9IFtdO1xuICBjb25zdCB4UHJvaiA9IHggKiBUSUxFX1NJWkU7XG4gIGNvbnN0IHlQcm9qID0geSAqIFRJTEVfU0laRTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6KTtcblxuICBjb25zdCBwcm9qZWN0RnVuYyA9IHByb2plY3QuYmluZChudWxsLCB4UHJvaiwgeVByb2osIHNjYWxlKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbiAgY29uc3QgbGF5ZXJOYW1lID0gJ2J1aWxkaW5nJztcbiAgY29uc3QgdmVjdG9yVGlsZUxheWVyID0gdGlsZS5sYXllcnNbbGF5ZXJOYW1lXTtcbiAgaWYgKCF2ZWN0b3JUaWxlTGF5ZXIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZWN0b3JUaWxlTGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVMYXllci5mZWF0dXJlKGkpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBmZWF0dXJlcyA9IHZlY3RvclRpbGVGZWF0dXJlVG9Qcm9wKHZlY3RvclRpbGVGZWF0dXJlLCBwcm9qZWN0RnVuYyk7XG4gICAgZmVhdHVyZXMuZm9yRWFjaChmID0+IHtcbiAgICAgIGYucHJvcGVydGllcy5sYXllciA9IGxheWVyTmFtZTtcbiAgICAgIGlmIChmLnByb3BlcnRpZXMuaGVpZ2h0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGxpbmU6IEZsYXRGaWd1cmUsIGV4dGVudDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHNpemVUb1BpeGVsID0gZXh0ZW50IC8gVElMRV9TSVpFO1xuXG4gIGZvciAobGV0IGlpID0gMDsgaWkgPCBsaW5lLmxlbmd0aDsgaWkrKykge1xuICAgIGNvbnN0IHAgPSBsaW5lW2lpXTtcbiAgICAvLyBMTkdMQVRcbiAgICBsaW5lW2lpXSA9IHdvcmxkVG9MbmdMYXQoW3ggKyBwWzBdIC8gc2l6ZVRvUGl4ZWwsIHkgKyBwWzFdIC8gc2l6ZVRvUGl4ZWxdLCBzY2FsZSk7XG4gIH1cbn1cblxuLyogYWRhcHRlZCBmcm9tIEBtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIGZvciBiZXR0ZXIgcGVyZiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JUaWxlRmVhdHVyZVRvUHJvcChcbiAgdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICBwcm9qZWN0OiAocjogRmxhdEZpZ3VyZSwgbjogbnVtYmVyKSA9PiB2b2lkXG4pOiB7Y29vcmRpbmF0ZXM6IEZsYXRGaWd1cmVbXTsgcHJvcGVydGllczogVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzfVtdIHtcbiAgbGV0IGNvb3JkczogRmxhdEZpZ3VyZVtdW10gfCBGbGF0RmlndXJlW10gPSBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZSk7XG4gIGNvbnN0IGV4dGVudCA9IHZlY3RvclRpbGVGZWF0dXJlLmV4dGVudDtcbiAgbGV0IGk6IG51bWJlcjtcbiAgbGV0IGo6IG51bWJlcjtcblxuICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSwgZXh0ZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29vcmRzLm1hcChjb29yZGluYXRlcyA9PiAoe1xuICAgIGNvb3JkaW5hdGVzLFxuICAgIHByb3BlcnRpZXM6IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXNcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUpOiBGbGF0RmlndXJlW10ge1xuICBjb25zdCBwYmYgPSB2ZWN0b3JUaWxlRmVhdHVyZS5fcGJmO1xuICBwYmYucG9zID0gdmVjdG9yVGlsZUZlYXR1cmUuX2dlb21ldHJ5O1xuXG4gIGNvbnN0IGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuICBsZXQgY21kID0gMTtcbiAgbGV0IGxlbmd0aCA9IDA7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuXG4gIGNvbnN0IGxpbmVzOiBGbGF0RmlndXJlW10gPSBbXTtcbiAgbGV0IGxpbmU6IEZsYXRGaWd1cmUgfCB1bmRlZmluZWQ7XG5cbiAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICB9XG5cbiAgICBsZW5ndGgtLTtcblxuICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgaWYgKGNtZCA9PT0gMSkge1xuICAgICAgICAvLyBtb3ZlVG9cbiAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIGxpbmUgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmUpIGxpbmUucHVzaChbeCwgeV0pO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxpbmUucHVzaChsaW5lWzBdLnNsaWNlKCkgYXMgW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gY29tbWFuZCAke2NtZH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICByZXR1cm4gbGluZXM7XG59XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzOiBGbGF0RmlndXJlW10pOiBGbGF0RmlndXJlW11bXSB7XG4gIGNvbnN0IGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gIGNvbnN0IHBvbHlnb25zOiBGbGF0RmlndXJlW11bXSA9IFtdO1xuICBsZXQgcG9seWdvbjogRmxhdEZpZ3VyZVtdIHwgdW5kZWZpbmVkO1xuICBsZXQgY2N3OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgaWYgKGFyZWEgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2N3ID0gYXJlYSA8IDA7XG4gICAgfVxuXG4gICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgIGlmIChwb2x5Z29uKSB7XG4gICAgICAgIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICB9XG4gICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcbiAgICB9IGVsc2UgaWYgKHBvbHlnb24pIHtcbiAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChwb2x5Z29uKSB7XG4gICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgfVxuXG4gIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nOiBGbGF0RmlndXJlKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxOiBudW1iZXJbXSwgcDI6IG51bWJlcltdOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgcDEgPSByaW5nW2ldO1xuICAgIHAyID0gcmluZ1tqXTtcbiAgICBzdW0gKz0gKHAyWzBdIC0gcDFbMF0pICogKHAxWzFdICsgcDJbMV0pO1xuICB9XG4gIHJldHVybiBzdW07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUdBLElBQUFBLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHdCQUFBLEdBQUFGLE9BQUE7QUFMQTtBQUNBOztBQWFBO0FBQ0EsSUFBTUcsU0FBUyxHQUFHLEdBQUc7QUFDckIsSUFBTUMsV0FBVyxHQUFHLDRCQUE0QjtBQUNoRCxJQUFNQyxVQUFVLEdBQUcsOEJBQThCO0FBRTFDLFNB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