kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
944 lines (841 loc) • 119 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = MapContainerFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactMapGl = _interopRequireDefault(require("react-map-gl"));
var _deck = _interopRequireDefault(require("deck.gl"));
var _reselect = require("reselect");
var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project"));
var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
var _api = require("../socket/api");
var _mapPopover = _interopRequireDefault(require("./map/map-popover"));
var _mapControl = _interopRequireDefault(require("./map/map-control"));
var _styledComponents = require("./common/styled-components");
var _editor = _interopRequireDefault(require("./editor/editor"));
var _mapboxUtils = require("../layers/mapbox-utils");
var _baseLayer = require("../layers/base-layer");
var _glUtils = require("../utils/gl-utils");
var _mapboxUtils2 = require("../utils/map-style-utils/mapbox-utils");
var _dBuildingLayer = _interopRequireDefault(require("../deckgl-layers/3d-building-layer/3d-building-layer"));
var _filterUtils = require("../utils/filter-utils");
var _defaultSettings = require("../constants/default-settings");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
// import ThreeDBuildingLayer from '../deckgl-layers/3d-building-layer/3d-building-layer';
// import continuousColorLegend from 'react-vis/dist/legends/continuous-color-legend';
var MAP_STYLE = {
container: {
display: 'inline-block',
position: 'relative'
},
top: {
position: 'absolute',
top: '0px',
pointerEvents: 'none'
}
};
var MAPBOXGL_STYLE_UPDATE = 'style.load';
var MAPBOXGL_RENDER = 'render';
var TRANSITION_DURATION = 0;
MapContainerFactory.deps = [_mapPopover["default"], _mapControl["default"]];
function MapContainerFactory(MapPopover, MapControl) {
var MapContainer = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(MapContainer, _Component);
var _super = _createSuper(MapContainer);
function MapContainer(_props) {
var _this;
(0, _classCallCheck2["default"])(this, MapContainer);
_this = _super.call(this, _props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inDebounce", 0);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateSocketLayer", function (socketData) {
var _this$props = _this.props,
datasets = _this$props.datasets,
layers = _this$props.layers,
widgets = _this$props.widgets,
visStateActions = _this$props.visStateActions;
var datasetKeys = Object.keys(datasets);
var updateDatasetIds = datasetKeys.filter(function (d) {
return datasets[d].datasetId === socketData.dsId;
});
updateDatasetIds.map(function (dataId) {
return visStateActions.updateDataset(dataId, socketData.updatedAt);
});
layers.map(function (layer) {
if (updateDatasetIds.indexOf(layer.config.dataId) > -1) {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
});
widgets.map(function (widget) {
if (updateDatasetIds.indexOf(widget.config.dataId) > -1) {
_this.props.widgetConfigChange(widget, {
apiCallRequest: true
});
}
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layersSelector", function (props) {
return props.layers;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerDataSelector", function (props) {
return props.layerData;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mapLayersSelector", function (props) {
return props.mapLayers;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerOrderSelector", function (props) {
return props.layerOrder;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layersToRenderSelector", (0, _reselect.createSelector)(_this.layersSelector, _this.layerDataSelector, _this.mapLayersSelector, // {[id]: true \ false}
function (layers, layerData, mapLayers) {
return layers.reduce(function (accu, layer, idx) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, layer.shouldRenderLayer(layerData[idx]) && _this._isVisibleMapLayer(layer, mapLayers)));
}, {});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filtersSelector", function (props) {
return props.filters;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "polygonFilters", (0, _reselect.createSelector)(_this.filtersSelector, function (filters) {
return filters.filter(function (f) {
return f.type === _filterUtils.FILTER_TYPES.polygon;
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mapboxLayersSelector", (0, _reselect.createSelector)(_this.layersSelector, _this.layerDataSelector, _this.layerOrderSelector, _this.layersToRenderSelector, _mapboxUtils.generateMapboxLayers));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCloseMapPopover", function () {
_this.props.visStateActions.onLayerClick(null);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onLayerSetDomain", function (idx, colorDomain) {
_this.props.visStateActions.layerConfigChange(_this.props.layers[idx], {
colorDomain: colorDomain
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onWebGLInitialized", _glUtils.onWebGLInitialized);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleMapToggleLayer", function (layerId) {
var _this$props2 = _this.props,
_this$props2$index = _this$props2.index,
mapIndex = _this$props2$index === void 0 ? 0 : _this$props2$index,
visStateActions = _this$props2.visStateActions;
visStateActions.toggleLayerForMap(mapIndex, layerId);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMapboxStyleUpdate", function () {
// force refresh mapboxgl layers
_this.previousLayers = {};
_this._updateMapboxLayers();
if (typeof _this.props.onMapStyleLoaded === 'function') {
_this.props.onMapStyleLoaded(_this._map);
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setMapboxMap", function (mapbox) {
if (!_this._map && mapbox) {
_this._map = mapbox.getMap(); // i noticed in certain context we don't access the actual map element
if (!_this._map) {
return;
} // bind mapboxgl event listener
_this._map.on(MAPBOXGL_STYLE_UPDATE, _this._onMapboxStyleUpdate);
_this._map.on(MAPBOXGL_RENDER, function () {
if (typeof _this.props.onMapRender === 'function') {
_this.props.onMapRender(_this._map);
}
});
}
if (_this.props.getMapboxRef) {
// The parent component can gain access to our MapboxGlMap by
// providing this callback. Note that 'mapbox' will be null when the
// ref is unset (e.g. when a split map is closed).
_this.props.getMapboxRef(mapbox, _this.props.index);
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onBeforeRender", function (_ref) {
var gl = _ref.gl;
(0, _glUtils.setLayerBlending)(gl, _this.props.layerBlending);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_renderLayer", function (overlays, idx) {
var _this$props3 = _this.props,
layers = _this$props3.layers,
layerData = _this$props3.layerData,
hoverInfo = _this$props3.hoverInfo,
clicked = _this$props3.clicked,
mapState = _this$props3.mapState,
interactionConfig = _this$props3.interactionConfig,
mousePos = _this$props3.mousePos,
animationConfig = _this$props3.animationConfig,
visStateActions = _this$props3.visStateActions,
datasets = _this$props3.datasets,
filters = _this$props3.filters;
var nextMapState = _this.state.nextMapState;
var layer = layers[idx];
var data = layerData[idx];
var layerInteraction = {
mousePosition: mousePos.mousePosition,
wrapLongitude: true
};
var objectHovered = clicked || hoverInfo;
var layerCallbacks = {
onSetLayerDomain: function onSetLayerDomain(val) {
return _this._onLayerSetDomain(idx, val);
}
}; // Layer is Layer class
// const layerOverlay = layer.renderLayer({
// data,
// idx,
// layerInteraction,
// objectHovered,
// mapState,
// interactionConfig,
// layerCallbacks,
// animationConfig
// });
var layerOverlay = [];
layerOverlay = layer.renderLayer({
data: data,
idx: idx,
layerInteraction: layerInteraction,
objectHovered: objectHovered,
mapState: mapState,
interactionConfig: interactionConfig,
layerCallbacks: layerCallbacks,
animationConfig: animationConfig,
datasets: datasets,
filters: filters,
loadEDLinkData: function loadEDLinkData(data, dataId) {
return visStateActions.loadEDLinkData(data, dataId);
},
nextMapState: nextMapState
});
return overlays.concat(layerOverlay || []);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onViewportChange", function (viewState) {
if (typeof _this.props.onViewStateChange === 'function') {
_this.props.onViewStateChange(viewState);
}
_this.props.mapStateActions.updateMap(viewState);
});
_this.state = {
nextMapState: null,
listenToSocket: false
};
_this.previousLayers = {// [layers.id]: mapboxLayerConfig
}; // dashboardConnection();
return _this;
}
(0, _createClass2["default"])(MapContainer, [{
key: "componentWillUnmount",
value: // componentDidMount() {
// }
function componentWillUnmount() {
// unbind mapboxgl event listener
if (this._map) {
this._map.off(MAPBOXGL_STYLE_UPDATE);
this._map.off(MAPBOXGL_RENDER);
}
(0, _api.removeDashboardConnection)(this.props);
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var _this2 = this;
var mapState = nextProps.mapState,
layers = nextProps.layers,
visStateActions = nextProps.visStateActions,
datasets = nextProps.datasets,
auth = nextProps.auth,
project = nextProps.project;
var listenToSocket = this.state.listenToSocket;
var datasetKeys = Object.keys(datasets);
var currentDatasetKeys = Object.keys(this.props.datasets);
if (currentDatasetKeys.length === 0 && datasetKeys.length > 0) {
listenToSocket = true;
}
if (currentDatasetKeys.length < datasetKeys.length) {
var filteredDatasetKeys = datasetKeys.filter(function (dk) {
return currentDatasetKeys.findIndex(function (cd) {
return cd === dk;
}) === -1;
});
var datasetIdsToAdd = filteredDatasetKeys.reduce(function (accu, dk) {
if (datasets[dk].isLiveDataset === true) {
accu.push(datasets[dk].datasetId);
}
return accu;
}, []);
(0, _api.addDatasetSocket)(_objectSpread({
datasetIdsToAdd: datasetIdsToAdd,
listenToSocket: listenToSocket
}, nextProps), this.updateSocketLayer); // this.setState({listenToSocket: false});
// listenDataUpdates(this.updateSocketLayer);
} else if (currentDatasetKeys.length > datasetKeys.length) {
var _filteredDatasetKeys = currentDatasetKeys.filter(function (cd) {
return datasetKeys.findIndex(function (dk) {
return dk === cd;
}) === -1;
});
var datasetIdsToRemove = _filteredDatasetKeys.reduce(function (accu, dk) {
if (_this2.props.datasets[dk].isLiveDataset === true) {
accu.push(_this2.props.datasets[dk].datasetId);
}
return accu;
}, []);
(0, _api.removeDatasetSocket)(datasetIdsToRemove, nextProps.auth);
} // }
// console.log(
// 'before condition inside componentWillRecieveProps',
// updatingDataset
// );
// if (datasetKeys.length && updatingDataset === false) {
// // helps in updating datasets insi de a dashboad without checking updateTime
// datasetKeys.map(dk => {
// if (datasets[dk].isLiveDataset === true) {
// this.setState({updatingDataset: true});
// dashboardConnection(nextProps);
// }
// });
// }
// if (updatingDataset === true) {
// dashboardConnection(nextProps);
// this.setState({updatingDataset: false});
// }
if (mapState) {
this.setState({
nextMapState: nextProps.mapState
});
}
layers.map(function (layer) {
var config = layer.config;
var apiCallRequest = config.apiCallRequest,
legendApiCallRequest = config.legendApiCallRequest,
colorField = config.colorField,
dataId = config.dataId;
var filters = nextProps.filters;
var currentFilters = _this2.props.filters;
if (currentFilters.length > filters.length) {
if (filters.length === 0) {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
filters.map(function (filter) {
if (filter.dataId.includes(dataId)) {
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson') {
visStateActions.layerConfigChange(layer, {
legendApiCallRequest: true
});
} else {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
}
});
}
if (filters.length && currentFilters.length) {
filters.map(function (f, i) {
if (f.dataId.includes(dataId)) {
if (currentFilters[i] && JSON.stringify(f.value) != JSON.stringify(currentFilters[i].value) || currentFilters[i] && currentFilters[i].dataId.length !== f.dataId.length) {
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson') {
visStateActions.layerConfigChange(layer, {
legendApiCallRequest: true
});
} else {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
}
} else if (currentFilters[i] && currentFilters[i].dataId.includes(dataId)) {
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson') {
visStateActions.layerConfigChange(layer, {
legendApiCallRequest: true
});
} else {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
}
});
}
if (filters.length && currentFilters.length === 0) {
filters.map(function (f, i) {
if (f.dataId.includes(dataId)) {
if (f.dataId.length) {
if (layer.type === 'backendPoint' || layer.type === 'backendGeojson') {
visStateActions.layerConfigChange(layer, {
legendApiCallRequest: true
});
} else {
visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
}
}
});
}
if (colorField && legendApiCallRequest && legendApiCallRequest === true) {
var result = layer.axiosLegendAPICall(datasets, filters, auth, project);
result.then(function (result) {
visStateActions.layerConfigChange(layer, {
legend: result,
apiCallRequest: true,
legendApiCallRequest: false
});
});
} // if (
// layer.type === 'point' &&
// (!legendApiCallRequest || legendApiCallRequest === false)
// ) {
// nextProps.visStateActions.layerConfigChange(layer, {
// legendApiCallRequest: true
// });
// }
if (layer.type === 'dynamic' || layer.type === 'geoHash' || layer.type === 'backendPoint' || layer.type === 'backendGeojson') {
if (!_.isEqual(_this2.props.mapState, mapState) // &&
// nextProps.layers
// nextProps.widget.config.bounds
) {
nextProps.visStateActions.layerConfigChange(layer, {
apiCallRequest: true
});
}
}
if (layer && config && apiCallRequest === true // columns[Object.keys(columns)[0]].fieldIdx !== -1
) {
visStateActions.layerConfigChange(layer, {
apiCallRequest: false,
apiCallLoader: true
});
clearTimeout(layer.inDebounce);
layer.inDebounce = setTimeout(function () {
var result = layer.axiosApiCall(datasets, _this2.getViewport(mapState), mapState.zoom, nextProps.filters, auth, project);
if (result) {
result.then(function (result) {
visStateActions.layerConfigChange(layer, {
apiCallLoader: false
});
visStateActions.updateLayerData(layer, result);
});
}
clearTimeout(layer.inDebounce);
layer.inDebounce = 0;
}, 300);
}
});
}
}, {
key: "getViewport",
value: function getViewport(mapState) {
var longitude = mapState.longitude,
latitude = mapState.latitude,
height = mapState.height,
width = mapState.width,
zoom = mapState.zoom,
pitch = mapState.pitch,
bearing = mapState.bearing; // let boundingBox = geoViewport.bounds([longitude, latitude], zoom, [
// width,
// height
// ]);
var viewport = new _viewportMercatorProject["default"]({
width: width,
height: height,
longitude: longitude,
latitude: latitude,
zoom: zoom,
pitch: pitch,
bearing: bearing
});
var cUL = viewport.unproject([0, 0]);
var cUR = viewport.unproject([width, 0]);
var cLR = viewport.unproject([width, height]);
var cLL = viewport.unproject([0, height]); // let latRange = [...new Set([cLL[1], cUR[1], cLR[1], cUL[1]])].sort(
// (a, b) => a - b
// );
// let lngRange = [...new Set([cLL[0], cUR[0], cLR[0], cUL[0]])].sort(
// (a, b) => a - b
// );
// return [lngRange[0], lngRange[1], latRange[0], latRange[1]];
return {
type: 'Polygon',
coordinates: [[cUL, cUR, cLR, cLL, cUL]]
};
}
}, {
key: "_isVisibleMapLayer",
value:
/* component private functions */
function _isVisibleMapLayer(layer, mapLayers) {
// if layer.id is not in mapLayers, don't render it
return !mapLayers || mapLayers && mapLayers[layer.id];
}
}, {
key: "_renderMapPopover",
value:
/* component render functions */
/* eslint-disable complexity */
function _renderMapPopover(layersToRender) {
// TODO: move this into reducer so it can be tested
var _this$props4 = this.props,
mapState = _this$props4.mapState,
hoverInfo = _this$props4.hoverInfo,
clicked = _this$props4.clicked,
datasets = _this$props4.datasets,
interactionConfig = _this$props4.interactionConfig,
layers = _this$props4.layers,
_this$props4$mousePos = _this$props4.mousePos,
mousePosition = _this$props4$mousePos.mousePosition,
coordinate = _this$props4$mousePos.coordinate,
pinned = _this$props4$mousePos.pinned,
auth = _this$props4.auth,
project = _this$props4.project;
if (!mousePosition) {
return null;
} // if clicked something, ignore hover behavior
var objectInfo = clicked || hoverInfo;
var layerHoverProp = null;
var position = {
x: mousePosition[0],
y: mousePosition[1]
};
if (interactionConfig.tooltip.enabled && objectInfo && objectInfo.picked) {
// if anything hovered
var object = objectInfo.object,
overlay = objectInfo.layer; // deckgl layer to kepler-gl layer
var layer = layers[overlay.props.idx];
if (layer.getHoverData && layersToRender[layer.id]) {
// if layer is visible and have hovered data
var dataId = layer.config.dataId;
var _datasets$dataId2 = datasets[dataId],
allData = _datasets$dataId2.allData,
fields = _datasets$dataId2.fields;
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
if (layer.meta.Point === true) {
var result = layer.getHoverData(object, auth, datasets, fieldsToShow);
result.then(function (re) {
layerHoverProp = {
data: re,
fields: fields,
fieldsToShow: fieldsToShow,
layer: layer,
datasets: datasets,
auth: auth
};
});
} else {
var data = layer.getHoverData(object, auth, datasets, fieldsToShow);
if (layer.name === 'MVT') {
data = Object.values(object.properties);
data = [object].concat((0, _toConsumableArray2["default"])(data));
fieldsToShow = Object.keys(object.properties);
}
layerHoverProp = {
data: data,
fields: fields,
fieldsToShow: fieldsToShow,
layer: layer,
datasets: datasets,
auth: auth
};
}
}
}
if (pinned || clicked) {
// project lnglat to screen so that tooltip follows the object on zoom
var viewport = new _viewportMercatorProject["default"](mapState);
var lngLat = clicked ? clicked.lngLat : pinned.coordinate;
position = this._getHoverXY(viewport, lngLat);
} // var data, fieldsToShow;
// const {allData, fields} = datasets[dataId];
// // const {x, y} = this._getHoverXY(viewport, lngLat) || objectInfo;
// // const {viewport} = overlay.context;
// if (layer.name == 'MVT') {
// const {
// config: {dataId}
// } = layer;
// // const {allData, fields} = datasets[dataId];
// const fieldKeys = Object.keys(object.properties);
// // let fields = [];
// // fields.push({
// // format: '',
// // id: '_geojson',
// // name: '_geojson',
// // tableFieldIndex: 1,
// // type: 'geojson'
// // });
// // fields.push({
// // format: '',
// // id: 'population',
// // name: 'Population',
// // tableFieldIndex: 2,
// // type: 'integer'
// // });
// data = Object.values(object.properties);
// data = [object, ...data];
// fieldsToShow = fieldKeys;
// // layerHoverProp = {
// // data,
// // fields,
// // fieldsToShow,
// // layer
// // };
// } else {
// data = layer.getHoverData(object, allData);
// // project lnglat to screen so that tooltip follows the object on zoom
// }
// const popoverProps = {
// data,
// fields,
// fieldsToShow: fieldsToShow
// ? fieldsToShow
// : interactionConfig.tooltip.config.fieldsToShow[dataId],
// layer,
// isVisible: true,
// x,
// y,
// freezed: Boolean(clicked),
// onClose: this._onCloseMapPopover,
// mapState
// };
// console.log('PopoverProps', popoverProps);
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(MapPopover, (0, _extends2["default"])({}, position, {
layerHoverProp: layerHoverProp,
coordinate: interactionConfig.coordinate.enabled && ((pinned || {}).coordinate || coordinate),
freezed: Boolean(clicked || pinned),
onClose: this._onCloseMapPopover,
mapW: mapState.width,
mapH: mapState.height
})))
);
}
/* eslint-enable complexity */
}, {
key: "_getHoverXY",
value: function _getHoverXY(viewport, lngLat) {
var screenCoord = !viewport || !lngLat ? null : viewport.project(lngLat);
return screenCoord && {
x: screenCoord[0],
y: screenCoord[1]
};
}
}, {
key: "_renderDeckOverlay",
value: function _renderDeckOverlay(layersToRender) {
var _this$props5 = this.props,
mapState = _this$props5.mapState,
mapStyle = _this$props5.mapStyle,
layerData = _this$props5.layerData,
layerOrder = _this$props5.layerOrder,
layers = _this$props5.layers,
visStateActions = _this$props5.visStateActions,
mapboxApiAccessToken = _this$props5.mapboxApiAccessToken,
mapboxApiUrl = _this$props5.mapboxApiUrl,
uiState = _this$props5.uiState;
var deckGlLayers = []; // wait until data is ready before render data layers
if (layerData && layerData.length) {
// last layer render first
deckGlLayers = layerOrder.slice().reverse().filter(function (idx) {
return layers[idx].overlayType === _baseLayer.OVERLAY_TYPE.deckgl && layersToRender[layers[idx].id];
}).reduce(this._renderLayer, []);
}
if (mapStyle.visibleLayerGroups['3d building']) {
deckGlLayers.push(new _dBuildingLayer["default"]({
id: '_keplergl_3d-building',
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
threeDBuildingColor: mapStyle.threeDBuildingColor,
updateTriggers: {
getFillColor: mapStyle.threeDBuildingColor
}
}));
} // const isEdit = uiState.mapControls.mapDraw.active;
return (/*#__PURE__*/_react["default"].createElement(_deck["default"], (0, _extends2["default"])({}, this.props.deckGlProps, {
viewState: mapState,
id: "default-deckgl-overlay",
layers: deckGlLayers,
onWebGLInitialized: this._onWebGLInitialized,
onBeforeRender: this._onBeforeRender,
onHover: visStateActions.onLayerHover,
onClick: visStateActions.onLayerClick // style={{zIndex: isEdit ? -1 : 0}}
}))
);
}
}, {
key: "_updateMapboxLayers",
value: function _updateMapboxLayers() {
var mapboxLayers = this.mapboxLayersSelector(this.props);
if (!Object.keys(mapboxLayers).length && !Object.keys(this.previousLayers).length) {
return;
}
(0, _mapboxUtils.updateMapboxLayers)(this._map, mapboxLayers, this.previousLayers);
this.previousLayers = mapboxLayers;
}
}, {
key: "_renderMapboxOverlays",
value: function _renderMapboxOverlays() {
if (this._map && this._map.isStyleLoaded()) {
this._updateMapboxLayers();
}
}
}, {
key: "render",
value: function render() {
var _this$props6 = this.props,
mapState = _this$props6.mapState,
mapStyle = _this$props6.mapStyle,
mapStateActions = _this$props6.mapStateActions,
mapLayers = _this$props6.mapLayers,
layers = _this$props6.layers,
MapComponent = _this$props6.MapComponent,
datasets = _this$props6.datasets,
mapboxApiAccessToken = _this$props6.mapboxApiAccessToken,
mapboxApiUrl = _this$props6.mapboxApiUrl,
uiState = _this$props6.uiState,
uiStateActions = _this$props6.uiStateActions,
visStateActions = _this$props6.visStateActions,
editor = _this$props6.editor,
index = _this$props6.index,
auth = _this$props6.auth,
project = _this$props6.project;
var longitude = mapState.longitude,
latitude = mapState.latitude,
height = mapState.height,
width = mapState.width,
zoom = mapState.zoom; // const boundingBox = geoViewport.bounds([longitude, latitude], zoom, [
// width,
// height
// ]);
// console.log('bounding box inside map-container', boundingBox);
var layersToRender = this.layersToRenderSelector(this.props);
if (!mapStyle.bottomMapStyle) {
// style not yet loaded
return (/*#__PURE__*/_react["default"].createElement("div", null)
);
}
var mapProps = _objectSpread(_objectSpread({}, mapState), {}, {
preserveDrawingBuffer: true,
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
onViewportChange: this._onViewportChange,
transformRequest: _mapboxUtils2.transformRequest
});
var isEdit = uiState.mapControls.mapDraw.active;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents.StyledMapContainer, {
sidePanel: uiState.activeSidePanel !== null,
style: MAP_STYLE.container
}, /*#__PURE__*/_react["default"].createElement(MapControl, {
datasets: datasets,
dragRotate: mapState.dragRotate,
isSplit: Boolean(mapLayers),
isExport: this.props.isExport,
layers: layers,
layersToRender: layersToRender,
mapIndex: index,
mapControls: uiState.mapControls,
readOnly: this.props.readOnly,
scale: mapState.scale || 1,
top: 0,
editor: editor,
onTogglePerspective: mapStateActions.togglePerspective,
onToggleSplitMap: mapStateActions.toggleSplitMap,
onMapToggleLayer: this._handleMapToggleLayer,
onToggleMapControl: uiStateActions.toggleMapControl,
onSetEditorMode: visStateActions.setEditorMode,
onToggleEditorVisibility: visStateActions.toggleEditorVisibility,
fitBounds: mapStateActions.fitBounds
}), /*#__PURE__*/_react["default"].createElement(MapComponent, (0, _extends2["default"])({}, mapProps, {
key: "bottom",
ref: this._setMapboxMap,
mapStyle: mapStyle.bottomMapStyle,
getCursor: this.props.hoverInfo ? function () {
return 'pointer';
} : undefined,
transitionDuration: TRANSITION_DURATION,
onMouseMove: this.props.visStateActions.onMouseMove,
attributionControl: false
}), this._renderDeckOverlay(layersToRender), this._renderMapboxOverlays(layersToRender), /*#__PURE__*/_react["default"].createElement(_editor["default"], {
index: index,
datasets: datasets,
editor: editor,
filters: this.polygonFilters(this.props),
isEnabled: isEdit,
layers: layers,
layersToRender: layersToRender,
onDeleteFeature: visStateActions.deleteFeature,
onSelect: visStateActions.setSelectedFeature,
onUpdate: visStateActions.setFeatures,
onTogglePolygonFilter: visStateActions.setPolygonFilterLayer,
style: {
pointerEvents: isEdit ? 'all' : 'none',
position: 'absolute',
display: editor.visible ? 'block' : 'none'
},
auth: auth,
project: project,
mapState: mapState
})), mapStyle.topMapStyle && /*#__PURE__*/_react["default"].createElement("div", {
style: MAP_STYLE.top
}, /*#__PURE__*/_react["default"].createElement(MapComponent, (0, _extends2["default"])({}, mapProps, {
key: "top",
mapStyle: mapStyle.topMapStyle,
attributionControl: false
}))), this._renderMapPopover(layersToRender))
);
}
}]);
return MapContainer;
}(_react.Component);
(0, _defineProperty2["default"])(MapContainer, "propTypes", {
// required
datasets: _propTypes["default"].object,
interactionConfig: _propTypes["default"].object.isRequired,
layerBlending: _propTypes["default"].string.isRequired,
layerOrder: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
layerData: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
filters: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
mapState: _propTypes["default"].object.isRequired,
uiState: _propTypes["default"].object.isRequired,
mapStyle: _propTypes["default"].object.isRequired,
mousePos: _propTypes["default"].object.isRequired,
mapboxApiAccessToken: _propTypes["default"].string.isRequired,
mapboxApiUrl: _propTypes["default"].string,
visStateActions: _propTypes["default"].object.isRequired,
mapStateActions: _propTypes["default"].object.isRequired,
uiStateActions: _propTypes["default"].object.isRequired,
// optional
readOnly: _propTypes["default"].bool,
isExport: _propTypes["default"].bool,
clicked: _propTypes["default"].object,
hoverInfo: _propTypes["default"].object,
mapLayers: _propTypes["default"].object,
onMapToggleLayer: _propTypes["default"].func,
onMapStyleLoaded: _propTypes["default"].func,
onMapRender: _propTypes["default"].func,
getMapboxRef: _propTypes["default"].func,
index: _propTypes["default"].number
});
(0, _defineProperty2["default"])(MapContainer, "defaultProps", {
MapComponent: _reactMapGl["default"],
deckGlProps: {}
});
MapContainer.displayName = 'MapContainer';
return MapContainer;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL21hcC1jb250YWluZXIuanMiXSwibmFtZXMiOlsiTUFQX1NUWUxFIiwiY29udGFpbmVyIiwiZGlzcGxheSIsInBvc2l0aW9uIiwidG9wIiwicG9pbnRlckV2ZW50cyIsIk1BUEJPWEdMX1NUWUxFX1VQREFURSIsIk1BUEJPWEdMX1JFTkRFUiIsIlRSQU5TSVRJT05fRFVSQVRJT04iLCJNYXBDb250YWluZXJGYWN0b3J5IiwiZGVwcyIsIk1hcFBvcG92ZXJGYWN0b3J5IiwiTWFwQ29udHJvbEZhY3RvcnkiLCJNYXBQb3BvdmVyIiwiTWFwQ29udHJvbCIsIk1hcENvbnRhaW5lciIsInByb3BzIiwic29ja2V0RGF0YSIsImRhdGFzZXRzIiwibGF5ZXJzIiwid2lkZ2V0cyIsInZpc1N0YXRlQWN0aW9ucyIsImRhdGFzZXRLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInVwZGF0ZURhdGFzZXRJZHMiLCJmaWx0ZXIiLCJkIiwiZGF0YXNldElkIiwiZHNJZCIsIm1hcCIsImRhdGFJZCIsInVwZGF0ZURhdGFzZXQiLCJ1cGRhdGVkQXQiLCJsYXllciIsImluZGV4T2YiLCJjb25maWciLCJsYXllckNvbmZpZ0NoYW5nZSIsImFwaUNhbGxSZXF1ZXN0Iiwid2lkZ2V0Iiwid2lkZ2V0Q29uZmlnQ2hhbmdlIiwibGF5ZXJEYXRhIiwibWFwTGF5ZXJzIiwibGF5ZXJPcmRlciIsImxheWVyc1NlbGVjdG9yIiwibGF5ZXJEYXRhU2VsZWN0b3IiLCJtYXBMYXllcnNTZWxlY3RvciIsInJlZHVjZSIsImFjY3UiLCJpZHgiLCJpZCIsInNob3VsZFJlbmRlckxheWVyIiwiX2lzVmlzaWJsZU1hcExheWVyIiwiZmlsdGVycyIsImZpbHRlcnNTZWxlY3RvciIsImYiLCJ0eXBlIiwiRklMVEVSX1RZUEVTIiwicG9seWdvbiIsImxheWVyT3JkZXJTZWxlY3RvciIsImxheWVyc1RvUmVuZGVyU2VsZWN0b3IiLCJnZW5lcmF0ZU1hcGJveExheWVycyIsIm9uTGF5ZXJDbGljayIsImNvbG9yRG9tYWluIiwib25XZWJHTEluaXRpYWxpemVkIiwibGF5ZXJJZCIsImluZGV4IiwibWFwSW5kZXgiLCJ0b2dnbGVMYXllckZvck1hcCIsInByZXZpb3VzTGF5ZXJzIiwiX3VwZGF0ZU1hcGJveExheWVycyIsIm9uTWFwU3R5bGVMb2FkZWQiLCJfbWFwIiwibWFwYm94IiwiZ2V0TWFwIiwib24iLCJfb25NYXBib3hTdHlsZVVwZGF0ZSIsIm9uTWFwUmVuZGVyIiwiZ2V0TWFwYm94UmVmIiwiZ2wiLCJsYXllckJsZW5kaW5nIiwib3ZlcmxheXMiLCJob3ZlckluZm8iLCJjbGlja2VkIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIm1vdXNlUG9zIiwiYW5pbWF0aW9uQ29uZmlnIiwibmV4dE1hcFN0YXRlIiwic3RhdGUiLCJkYXRhIiwibGF5ZXJJbnRlcmFjdGlvbiIsIm1vdXNlUG9zaXRpb24iLCJ3cmFwTG9uZ2l0dWRlIiwib2JqZWN0SG92ZXJlZCIsImxheWVyQ2FsbGJhY2tzIiwib25TZXRMYXllckRvbWFpbiIsInZhbCIsIl9vbkxheWVyU2V0RG9tYWluIiwibGF5ZXJPdmVybGF5IiwicmVuZGVyTGF5ZXIiLCJsb2FkRURMaW5rRGF0YSIsImNvbmNhdCIsInZpZXdTdGF0ZSIsIm9uVmlld1N0YXRlQ2hhbmdlIiwibWFwU3RhdGVBY3Rpb25zIiwidXBkYXRlTWFwIiwibGlzdGVuVG9Tb2NrZXQiLCJvZmYiLCJuZXh0UHJvcHMiLCJhdXRoIiwicHJvamVjdCIsImN1cnJlbnREYXRhc2V0S2V5cyIsImxlbmd0aCIsImZpbHRlcmVkRGF0YXNldEtleXMiLCJkayIsImZpbmRJbmRleCIsImNkIiwiZGF0YXNldElkc1RvQWRkIiwiaXNMaXZlRGF0YXNldCIsInB1c2giLCJ1cGRhdGVTb2NrZXRMYXllciIsImRhdGFzZXRJZHNUb1JlbW92ZSIsInNldFN0YXRlIiwibGVnZW5kQXBpQ2FsbFJlcXVlc3QiLCJjb2xvckZpZWxkIiwiY3VycmVudEZpbHRlcnMiLCJpbmNsdWRlcyIsImkiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsdWUiLCJyZXN1bHQiLCJheGlvc0xlZ2VuZEFQSUNhbGwiLCJ0aGVuIiwibGVnZW5kIiwiXyIsImlzRXF1YWwiLCJhcGlDYWxsTG9hZGVyIiwiY2xlYXJUaW1lb3V0IiwiaW5EZWJvdW5jZSIsInNldFRpbWVvdXQiLCJheGlvc0FwaUNhbGwiLCJnZXRWaWV3cG9ydCIsInpvb20iLCJ1cGRhdGVMYXllckRhdGEiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwicGl0Y2giLCJiZWFyaW5nIiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwiY1VMIiwidW5wcm9qZWN0IiwiY1VSIiwiY0xSIiwiY0xMIiwiY29vcmRpbmF0ZXMiLCJsYXllcnNUb1JlbmRlciIsImNvb3JkaW5hdGUiLCJwaW5uZWQiLCJvYmplY3RJbmZvIiwibGF5ZXJIb3ZlclByb3AiLCJ4IiwieSIsInRvb2x0aXAiLCJlbmFibGVkIiwicGlja2VkIiwib2JqZWN0Iiwib3ZlcmxheSIsImdldEhvdmVyRGF0YSIsImFsbERhdGEiLCJmaWVsZHMiLCJmaWVsZHNUb1Nob3ciLCJtZXRhIiwiUG9pbnQiLCJyZSIsIm5hbWUiLCJ2YWx1ZXMiLCJwcm9wZXJ0aWVzIiwibG5nTGF0IiwiX2dldEhvdmVyWFkiLCJCb29sZWFuIiwiX29uQ2xvc2VNYXBQb3BvdmVyIiwic2NyZWVuQ29vcmQiLCJtYXBTdHlsZSIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwidWlTdGF0ZSIsImRlY2tHbExheWVycyIsInNsaWNlIiwicmV2ZXJzZSIsIm92ZXJsYXlUeXBlIiwiT1ZFUkxBWV9UWVBFIiwiZGVja2dsIiwiX3JlbmRlckxheWVyIiwidmlzaWJsZUxheWVyR3JvdXBzIiwiVGhyZWVEQnVpbGRpbmdMYXllciIsInRocmVlREJ1aWxkaW5nQ29sb3IiLCJ1cGRhdGVUcmlnZ2VycyIsImdldEZpbGxDb2xvciIsImRlY2tHbFByb3BzIiwiX29uV2ViR0xJbml0aWFsaXplZCIsIl9vbkJlZm9yZVJlbmRlciIsIm9uTGF5ZXJIb3ZlciIsIm1hcGJveExheWVycyIsIm1hcGJveExheWVyc1NlbGVjdG9yIiwiaXNTdHlsZUxvYWRlZCIsIk1hcENvbXBvbmVudCIsInVpU3RhdGVBY3Rpb25zIiwiZWRpdG9yIiwiYm90dG9tTWFwU3R5bGUiLCJtYXBQcm9wcyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIm9uVmlld3BvcnRDaGFuZ2UiLCJfb25WaWV3cG9ydENoYW5nZSIsInRyYW5zZm9ybVJlcXVlc3QiLCJpc0VkaXQiLCJtYXBDb250cm9scyIsIm1hcERyYXciLCJhY3RpdmUiLCJhY3RpdmVTaWRlUGFuZWwiLCJkcmFnUm90YXRlIiwiaXNFeHBvcnQiLCJyZWFkT25seSIsInNjYWxlIiwidG9nZ2xlUGVyc3BlY3RpdmUiLCJ0b2dnbGVTcGxpdE1hcCIsIl9oYW5kbGVNYXBUb2dnbGVMYXllciIsInRvZ2dsZU1hcENvbnRyb2wiLCJzZXRFZGl0b3JNb2RlIiwidG9nZ2xlRWRpdG9yVmlzaWJpbGl0eSIsImZpdEJvdW5kcyIsIl9zZXRNYXBib3hNYXAiLCJ1bmRlZmluZWQiLCJvbk1vdXNlTW92ZSIsIl9yZW5kZXJEZWNrT3ZlcmxheSIsIl9yZW5kZXJNYXBib3hPdmVybGF5cyIsInBvbHlnb25GaWx0ZXJzIiwiZGVsZXRlRmVhdHVyZSIsInNldFNlbGVjdGVkRmVhdHVyZSIsInNldEZlYXR1cmVzIiwic2V0UG9seWdvbkZpbHRlckxheWVyIiwidmlzaWJsZSIsInRvcE1hcFN0eWxlIiwiX3JlbmRlck1hcFBvcG92ZXIiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJpc1JlcXVpcmVkIiwic3RyaW5nIiwiYXJyYXlPZiIsImFueSIsImJvb2wiLCJvbk1hcFRvZ2dsZUxheWVyIiwiZnVuYyIsIm51bWJlciIsIk1hcGJveEdMTWFwIiwiZGlzcGxheU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBOztB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