UNPKG

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
"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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