1
1
import React , { useState , useEffect } from "react" ;
2
2
import DeckGL from "@deck.gl/react" ;
3
- import { LineLayer } from "@deck.gl/layers" ;
4
- import { GeoJsonLayer } from "deck.gl" ;
5
3
import { Map } from "react-map-gl" ;
6
- import mapbox_token from "./mapbox_token.js" ;
7
4
import { IconLayer } from "@deck.gl/layers" ;
8
5
import axios from "axios" ;
9
- import { Button } from "@mui/material" ;
10
-
11
- import { useNavigate } from "react-router-dom" ;
6
+ import mapbox_token from "./mapbox_token.js" ;
7
+ import BenchmarkingData from "./BenchmarkingData.js" ;
12
8
13
9
const MAPBOX_ACCESS_TOKEN = mapbox_token ;
14
10
const MAP_STYLE =
15
11
"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json" ;
16
12
17
- // Viewport settings
18
13
const INITIAL_VIEW_STATE = {
19
14
longitude : - 111 ,
20
15
latitude : 33 ,
@@ -24,7 +19,6 @@ const INITIAL_VIEW_STATE = {
24
19
bearing : 0 ,
25
20
} ;
26
21
27
- // retrieve benchmarking collection data from database
28
22
const getBenchmarkingCollection = async ( ) => {
29
23
try {
30
24
const response = await axios . get (
@@ -44,10 +38,12 @@ const getBenchmarkingCollection = async () => {
44
38
} ;
45
39
46
40
// https://deck.gl/docs/api-reference/layers/icon-layer
47
- export default function Benchmarking ( ) {
48
- let navigate = useNavigate ( ) ; // navigate to diff pages
49
41
50
- const [ benchmarkingData , setBenchmarkingData ] = useState ( ) ;
42
+ export default function Benchmarking ( ) {
43
+ const [ benchmarkingData , setBenchmarkingData ] = useState ( [ ] ) ;
44
+ const [ selectedSite , setSelectedSite ] = useState ( null ) ;
45
+ const [ isPanelOpen , setIsPanelOpen ] = useState ( false ) ;
46
+ const [ model , setModel ] = useState ( "regressionBaseline" ) ;
51
47
52
48
useEffect ( ( ) => {
53
49
getBenchmarkingCollection ( ) . then ( ( data ) => {
@@ -57,12 +53,15 @@ export default function Benchmarking() {
57
53
58
54
const onClick = ( info ) => {
59
55
if ( info . object ) {
60
- const siteID = info . object . siteID ;
61
- // Use the navigate function to go to a new page with the siteID parameter
62
- navigate ( `/benchmarking/${ siteID } ` ) ;
56
+ setSelectedSite ( info . object ) ;
57
+ setIsPanelOpen ( true ) ;
63
58
}
64
59
} ;
65
60
61
+ const chooseModel = ( event ) => {
62
+ setModel ( event . target . value ) ;
63
+ } ;
64
+
66
65
const ICON_MAPPING = {
67
66
marker : { x : 0 , y : 0 , width : 120 , height : 120 , mask : true } ,
68
67
} ;
@@ -71,34 +70,74 @@ export default function Benchmarking() {
71
70
id : "icon-layer" ,
72
71
data : benchmarkingData ,
73
72
pickable : true ,
74
- // iconAtlas and iconMapping are required
75
- // getIcon: return a string
76
73
iconAtlas :
77
74
"https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/icon-atlas.png" ,
78
75
iconMapping : ICON_MAPPING ,
76
+ // iconAtlas and iconMapping are required
77
+ // getIcon: return a string
79
78
getIcon : ( d ) => "marker" ,
80
-
81
79
sizeScale : 6 ,
82
80
getPosition : ( d ) => d . coordinates ,
83
81
getSize : ( d ) => 5 ,
84
82
getColor : ( d ) => [ Math . sqrt ( d . exits ) , 140 , 0 ] ,
85
83
} ) ;
86
84
87
85
return (
88
- < DeckGL
89
- initialViewState = { INITIAL_VIEW_STATE }
90
- controller = { true }
91
- layers = { [ layers ] }
92
- getTooltip = { ( { object } ) =>
93
- object &&
94
- `${ object . siteInfo . city } , ${ object . siteInfo . state } \
95
- \nSite ID: ${ object . siteID } \
96
- \nDOE Climate Zone: ${ object . siteInfo . doe_climate_zone }
97
- \n Click for detailed information`
98
- }
99
- onClick = { onClick }
100
- >
101
- < Map mapStyle = { MAP_STYLE } mapboxAccessToken = { MAPBOX_ACCESS_TOKEN } />
102
- </ DeckGL >
86
+ < div style = { { position : "relative" , height : "100vh" , width : "100%" } } >
87
+ < DeckGL
88
+ initialViewState = { INITIAL_VIEW_STATE }
89
+ controller = { true }
90
+ layers = { [ layers ] }
91
+ getTooltip = { ( { object } ) =>
92
+ object &&
93
+ `${ object . siteInfo . city } , ${ object . siteInfo . state }
94
+ \nSite ID: ${ object . siteID }
95
+ \nDOE Climate Zone: ${ object . siteInfo . doe_climate_zone }
96
+ \n Click for detailed information`
97
+ }
98
+ onClick = { onClick }
99
+ >
100
+ < Map mapStyle = { MAP_STYLE } mapboxAccessToken = { MAPBOX_ACCESS_TOKEN } />
101
+ </ DeckGL >
102
+
103
+ { isPanelOpen && selectedSite && (
104
+ < div
105
+ style = { {
106
+ position : "absolute" ,
107
+ bottom : 0 ,
108
+ left : 0 ,
109
+ right : 0 ,
110
+ height : "60%" , // popup window height
111
+ backgroundColor : "white" ,
112
+ padding : "20px" ,
113
+ boxShadow : "0 -2px 10px rgba(0, 0, 0, 0.1)" ,
114
+ overflowY : "auto" ,
115
+ transition : "transform 0.3s ease-out" ,
116
+ transform : isPanelOpen ? "translateY(0)" : "translateY(100%)" ,
117
+ } }
118
+ >
119
+ < button
120
+ onClick = { ( ) => setIsPanelOpen ( false ) }
121
+ style = { {
122
+ position : "absolute" ,
123
+ top : "10px" ,
124
+ right : "10px" ,
125
+ background : "none" ,
126
+ border : "none" ,
127
+ fontSize : "1.5em" ,
128
+ cursor : "pointer" ,
129
+ } }
130
+ >
131
+ ×
132
+ </ button >
133
+
134
+ < BenchmarkingData
135
+ selectedSite = { selectedSite }
136
+ model = { model }
137
+ chooseModel = { chooseModel }
138
+ />
139
+ </ div >
140
+ ) }
141
+ </ div >
103
142
) ;
104
143
}
0 commit comments