@@ -37,8 +37,7 @@ const DATASETS = {
37
37
layerType : 'Trips 2D' ,
38
38
lineWidth : 2 ,
39
39
mapStyle : 'dark-v11' ,
40
- palette : 'Sunset' ,
41
- outline : 'none'
40
+ palette : 'Sunset'
42
41
} ,
43
42
'NYC Taxi Trips (Table)' : {
44
43
name : 'NYC Taxi Trips (Table)' ,
@@ -61,8 +60,7 @@ const DATASETS = {
61
60
layerType : 'Trips 2D' ,
62
61
lineWidth : 2 ,
63
62
mapStyle : 'outdoors-v12' ,
64
- palette : 'ArmyRose' ,
65
- outline : 'black'
63
+ palette : 'ArmyRose'
66
64
} ,
67
65
'Atlanta Vehicle Trajectories' : {
68
66
name : 'Atlanta Vehicle Trajectories' ,
@@ -85,8 +83,7 @@ const DATASETS = {
85
83
layerType : 'Trips 2D' ,
86
84
lineWidth : 1.5 ,
87
85
mapStyle : 'dark-v11' ,
88
- palette : 'Vivid' ,
89
- outline : 'none'
86
+ palette : 'Vivid'
90
87
} ,
91
88
'Memphis Vehicle Trajectories (Query)' : {
92
89
name : 'Memphis Vehicle Trajectories (Query)' ,
@@ -108,19 +105,13 @@ const DATASETS = {
108
105
layerType : 'Trips 2D' ,
109
106
lineWidth : 1.5 ,
110
107
mapStyle : 'satellite-streets-v12' ,
111
- palette : 'Temps' ,
112
- outline : 'white'
108
+ palette : 'Temps'
113
109
}
114
110
}
115
111
const DATASET_NAMES = Object . keys ( DATASETS ) ;
116
112
117
113
const LAYER = { Path : 'Path 2D' , Trips : 'Trips 2D' , Points : 'Point 2D' } ;
118
114
119
- const OUTLINES = {
120
- black : 'black' ,
121
- white : 'white' ,
122
- none : 'none'
123
- } ;
124
115
125
116
const PALETTES = {
126
117
ArmyRose : 'ArmyRose' ,
@@ -162,7 +153,6 @@ export default function App() {
162
153
const [ layerType , setLayerType ] = useState ( initialDataset . layerType ) ;
163
154
const [ mapStyle , setMapStyle ] = useState ( initialDataset . mapStyle ) ;
164
155
const [ palette , setPalette ] = useState ( initialDataset . palette ) ;
165
- const [ outline , setOutline ] = useState ( initialDataset . outline ) ;
166
156
const [ currentTime , setCurrentTime ] = useState ( 0 ) ;
167
157
const [ animationSpeed , setAnimationSpeed ] = useState ( 100 ) ;
168
158
const [ trailLength , setTrailLength ] = useState ( 1000 ) ;
@@ -176,7 +166,6 @@ export default function App() {
176
166
setLayerType ( dataset . layerType ) ;
177
167
setLineWidth ( dataset . lineWidth ) ;
178
168
setMapStyle ( dataset . mapStyle ) ;
179
- setOutline ( dataset . outline ) ;
180
169
setPalette ( dataset . palette ) ;
181
170
// Reset time controls to defaults - they'll be updated when data loads
182
171
setCurrentTime ( 0 ) ;
@@ -191,7 +180,7 @@ export default function App() {
191
180
const [ clickedTrajectoryId , setClickedTrajectoryId ] = useState ( null ) ;
192
181
193
182
// Handle trajectory click to jump to start time
194
- async function handleTrajectoryClick ( info ) {
183
+ function handleTrajectoryClick ( info ) {
195
184
console . log ( 'handleTrajectoryClick' , info ) ;
196
185
if ( ! info . object || ! dataSource ?. widgetSource ) return ;
197
186
@@ -204,13 +193,11 @@ export default function App() {
204
193
205
194
console . log ( 'Clicked trajectory with ID:' , trajectoryId ) ;
206
195
207
- try {
208
- // Use getRange to efficiently get min/max timestamps for this trajectory
209
- const timeRange = await dataSource . widgetSource . getRange ( {
210
- column : timestampColumn ,
211
- filters : { [ trajectoryIdColumn ] : { in : { values : [ trajectoryId ] } } }
212
- } ) ;
213
-
196
+ // Use getRange to efficiently get min/max timestamps for this trajectory
197
+ dataSource . widgetSource . getRange ( {
198
+ column : timestampColumn ,
199
+ filters : { [ trajectoryIdColumn ] : { in : { values : [ trajectoryId ] } } }
200
+ } ) . then ( timeRange => {
214
201
if ( timeRange && timeRange . min ) {
215
202
const startTime = normalizeTimestamp ( timeRange . min ) ;
216
203
@@ -224,9 +211,9 @@ export default function App() {
224
211
setCurrentTime ( startTime ) ;
225
212
setClickedTrajectoryId ( trajectoryId ) ;
226
213
}
227
- } catch ( error ) {
214
+ } ) . catch ( error => {
228
215
console . error ( 'Error fetching trajectory time range:' , error ) ;
229
- }
216
+ } ) ;
230
217
}
231
218
232
219
useEffect ( ( ) => {
@@ -293,19 +280,20 @@ export default function App() {
293
280
294
281
const layers = showPoints ? [
295
282
new VectorTileLayer ( {
296
- id : ` points- ${ palette } ` ,
283
+ id : ' points' ,
297
284
data : dataSource ,
298
285
pointRadiusMinPixels : lineWidth ,
299
286
pointRadiusMaxPixels : lineWidth ,
300
287
getFillColor : colorContinuous ( {
301
288
attr : 'trajectoryId' ,
302
289
domain : [ 0 , 100 , 200 , 300 , 400 , 500 , 600 , 700 , 800 , 900 , 1000 ] ,
303
290
colors : palette
304
- } )
291
+ } ) ,
292
+ updateTriggers : { getFillColor : [ palette ] } ,
305
293
} )
306
294
] : [
307
295
new TrajectoryTileLayer ( {
308
- id : ` ${ palette } - ${ outline } ` ,
296
+ id : 'trajectories' ,
309
297
data : dataSource ,
310
298
renderMode : showTrips ? 'trips' : 'paths' ,
311
299
uniqueIdProperty : 'trajectoryId' , // TODO internalize this
@@ -324,7 +312,7 @@ export default function App() {
324
312
domain : [ 0 , 5 , 10 , 15 , 20 , 25 ] ,
325
313
colors : palette
326
314
} ) ,
327
-
315
+ updateTriggers : { getLineColor : [ palette ] , getFillColor : [ palette ] } ,
328
316
currentTime,
329
317
trailLength,
330
318
getWidth : lineWidth ,
@@ -335,7 +323,6 @@ export default function App() {
335
323
jointRounded : true ,
336
324
capRounded : true ,
337
325
_pathType : 'open' ,
338
- outline,
339
326
zRange : [ 0 , 4000 ] ,
340
327
onClick : handleTrajectoryClick ,
341
328
onHover : info => {
@@ -379,7 +366,6 @@ export default function App() {
379
366
< ObjectSelect title = "Layer" obj = { LAYER } value = { layerType } onSelect = { setLayerType } top = { 30 } />
380
367
< ObjectSelect title = "Map Style" obj = { MAP_STYLES } value = { mapStyle } onSelect = { setMapStyle } top = { 60 } />
381
368
< ObjectSelect title = "Palette" obj = { PALETTES } value = { palette } onSelect = { setPalette } top = { 90 } />
382
- < ObjectSelect title = "Outline" obj = { OUTLINES } value = { outline } onSelect = { setOutline } top = { 120 } />
383
369
{ showTrips && < RangeInput
384
370
name = { 'Time' }
385
371
animationSpeed = { animationSpeed }
0 commit comments