From 35b2555d47e4b6ce38c3b808703c39417a9696e2 Mon Sep 17 00:00:00 2001 From: Ariel Noyman Date: Wed, 25 Jan 2023 16:48:39 -0500 Subject: [PATCH] wip layers tooltip --- src/Components/LayerHoveredTooltip/index.js | 30 +++++++++++++++++ src/settings/settings.js | 1 - .../DeckglMap/deckglLayers/AccessLayer.js | 19 ++++++++++- .../DeckglMap/deckglLayers/TrafficLayer.js | 17 ++++++++-- src/views/CityScopeJS/DeckglMap/index.js | 32 ++++++++++++++----- 5 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 src/Components/LayerHoveredTooltip/index.js diff --git a/src/Components/LayerHoveredTooltip/index.js b/src/Components/LayerHoveredTooltip/index.js new file mode 100644 index 00000000..9b1793e4 --- /dev/null +++ b/src/Components/LayerHoveredTooltip/index.js @@ -0,0 +1,30 @@ +import { Typography, Box } from "@mui/material"; + +export const LayerHoveredTooltip = (props) => { + if (!props.mousePos) return null; + const mousePos = props.mousePos; + const layerHoveredData = props.layerHoveredData; + + return ( + + + {layerHoveredData && layerHoveredData} + + + ); +}; diff --git a/src/settings/settings.js b/src/settings/settings.js index 6f43c7a3..0323843d 100644 --- a/src/settings/settings.js +++ b/src/settings/settings.js @@ -50,7 +50,6 @@ export const cityIOSettings = { { name: "tui", expectUpdate: true }, { name: "geo_heatmap", expectUpdate: true }, { name: "traffic", expectUpdate: true }, - ], }, }; diff --git a/src/views/CityScopeJS/DeckglMap/deckglLayers/AccessLayer.js b/src/views/CityScopeJS/DeckglMap/deckglLayers/AccessLayer.js index 82671c70..0287dc47 100644 --- a/src/views/CityScopeJS/DeckglMap/deckglLayers/AccessLayer.js +++ b/src/views/CityScopeJS/DeckglMap/deckglLayers/AccessLayer.js @@ -3,7 +3,12 @@ import { CubeGeometry } from "@luma.gl/engine"; import { OBJLoader } from "@loaders.gl/obj"; import { numberToColorHsl } from "../../../../utils/utils"; -export default function AccessLayer({ data, intensity, selected }) { +export default function AccessLayer({ + data, + intensity, + selected, + setLayerHoveredData, +}) { const accessData = data.access && data.access.features; const cube = new CubeGeometry({ type: "x,z", xlen: 0, ylen: 0, zlen: 0 }); const header = data.GEOGRID.properties.header; @@ -32,6 +37,18 @@ export default function AccessLayer({ data, intensity, selected }) { // }); return new SimpleMeshLayer({ + onHover: (event) => { + if (event.object) { + setLayerHoveredData( + // create a string with data.access.properties[selected] and value of event.object.properties[selected] to display in the tooltip + `${data.access.properties[selected]}: ${Math.floor( + event.object.properties[selected] * 100 + )}%` + ); + } + }, + pickable: true, + id: "ACCESS", opacity: 0.1 + intensity / 100, diff --git a/src/views/CityScopeJS/DeckglMap/deckglLayers/TrafficLayer.js b/src/views/CityScopeJS/DeckglMap/deckglLayers/TrafficLayer.js index 9fc2bf81..3822c29a 100644 --- a/src/views/CityScopeJS/DeckglMap/deckglLayers/TrafficLayer.js +++ b/src/views/CityScopeJS/DeckglMap/deckglLayers/TrafficLayer.js @@ -1,7 +1,7 @@ import { GeoJsonLayer } from "@deck.gl/layers"; import { numberToColorHsl } from "../../../../utils/utils"; -export default function TrafficLayer({ data, opacity }) { +export default function TrafficLayer({ data, opacity, setLayerHoveredData }) { if (data.traffic) { // create a new geojson object from `data.traffic` // where each feature is a rectangular polygon with the coordinates of the @@ -59,10 +59,21 @@ export default function TrafficLayer({ data, opacity }) { }; return new GeoJsonLayer({ + onHover: (event) => { + if (event.object) { + setLayerHoveredData( + `traffic: ${ + Math.floor(event.object.properties.norm_traffic * 100) + }%` + ); + } + }, + pickable: true, + id: "TRAFFIC_TRIPS", shadowEnabled: false, data: newGeoJson, - pickable: true, + filled: true, extruded: true, @@ -82,7 +93,7 @@ export default function TrafficLayer({ data, opacity }) { 0, 1 ); - // return the color with the opacity + // return the color with the opacity return [rgb[0], rgb[1], rgb[2], 200 + 55 * opacity]; }, diff --git a/src/views/CityScopeJS/DeckglMap/index.js b/src/views/CityScopeJS/DeckglMap/index.js index 1e8832ac..0bf02e97 100644 --- a/src/views/CityScopeJS/DeckglMap/index.js +++ b/src/views/CityScopeJS/DeckglMap/index.js @@ -1,6 +1,7 @@ import { useState, useEffect } from "react"; import { useSelector } from "react-redux"; import PaintBrush from "../../../Components/PaintBrush"; +import { LayerHoveredTooltip } from "../../../Components/LayerHoveredTooltip"; import { postToCityIO } from "../../../utils/utils"; import DeckglBase from "./DeckglBase"; import "mapbox-gl/dist/mapbox-gl.css"; @@ -30,6 +31,9 @@ export default function DeckGLMap() { const [hoveredObj, setHoveredObj] = useState(); const [GEOGRIDDATA, setGEOGRIDDATA] = useState(); + // sets data from all hovered objected currently in the viewport + const [layerHoveredData, setLayerHoveredData] = useState(); + const pickingRadius = 40; const editModeToggle = menuState.editMenuState.EDIT_BUTTON; const selectedType = menuState.typesMenuState.SELECTED_TYPE; @@ -105,6 +109,7 @@ export default function DeckGLMap() { }), ACCESS: AccessLayer({ + setLayerHoveredData, data: cityIOdata, selected: layersMenu && @@ -134,6 +139,7 @@ export default function DeckGLMap() { }), TRAFFIC: TrafficLayer({ + setLayerHoveredData, data: cityIOdata, opacity: layersMenu && @@ -180,14 +186,24 @@ export default function DeckGLMap() { onMouseUp={() => setMouseDown(false)} onMouseDown={() => setMouseDown(true)} > - + {layerHoveredData && ( + + )} + {/* only show if grid layer is on */} + {layersMenu.GRID_LAYER_CHECKBOX && + layersMenu.GRID_LAYER_CHECKBOX.isOn && ( + + )}