UNPKG

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