@@ -5,18 +5,22 @@ import {Deck, MapViewState} from '@deck.gl/core';
5
5
import { H3TileLayer , BASEMAP , colorBins } from '@deck.gl/carto' ;
6
6
import { initSelectors } from './selectorUtils' ;
7
7
import { debounce , getSpatialFilterFromViewState } from './utils' ;
8
- import { h3QuerySource } from '@carto/api-client'
8
+ import { h3QuerySource , WidgetSource } from '@carto/api-client'
9
+ import Chart from 'chart.js/auto' ;
9
10
10
11
const cartoConfig = {
12
+ // @ts -expect-error misconfigured env variables
11
13
apiBaseUrl : import . meta. env . VITE_API_BASE_URL ,
14
+ // @ts -expect-error misconfigured env variables
12
15
accessToken : import . meta. env . VITE_API_ACCESS_TOKEN ,
13
16
connectionName : 'carto_dw'
14
17
} ;
15
18
16
19
const INITIAL_VIEW_STATE : MapViewState = {
17
- latitude : 40.7128 , // New York
18
- longitude : - 74.006 , // New York
19
- zoom : 7 ,
20
+ // Spain
21
+ latitude : 37.3753636 ,
22
+ longitude : - 5.9962577 ,
23
+ zoom : 6 ,
20
24
pitch : 0 ,
21
25
bearing : 0 ,
22
26
minZoom : 3.5 ,
@@ -36,6 +40,9 @@ let viewState = INITIAL_VIEW_STATE
36
40
const variableSelector = document . getElementById ( 'variable' ) as HTMLSelectElement ;
37
41
const aggMethodLabel = document . getElementById ( 'agg-method' ) as HTMLSelectElement ;
38
42
const formulaWidget = document . getElementById ( 'formula-data' ) as HTMLDivElement ;
43
+ const categoriesWidget = document . getElementById ( 'categories-data' ) as HTMLCanvasElement ;
44
+ const histogramWidget = document . getElementById ( 'histogram-data' ) as HTMLCanvasElement ;
45
+ let histogramChart : Chart ;
39
46
40
47
aggMethodLabel . innerText = aggregationExp ;
41
48
variableSelector ?. addEventListener ( 'change' , ( ) => {
@@ -51,8 +58,8 @@ variableSelector?.addEventListener('change', () => {
51
58
function render ( ) {
52
59
source = h3QuerySource ( {
53
60
...cartoConfig ,
54
- aggregationExp : `${ aggregationExp } as value` ,
55
- sqlQuery : `SELECT * FROM cartobq.public_account.derived_spatialfeatures_usa_h3int_res8_v1_yearly_v2 `
61
+ aggregationExp : `${ aggregationExp } as value` ,
62
+ sqlQuery : `SELECT * FROM carto-demo-data.demo_tables.derived_spatialfeatures_esp_h3res8_v1_yearly_v2 `
56
63
} ) ;
57
64
renderLayers ( ) ;
58
65
renderWidgets ( ) ;
@@ -91,15 +98,61 @@ function renderLayers() {
91
98
}
92
99
93
100
async function renderWidgets ( ) {
94
- formulaWidget . innerHTML = '<span style="font-weight: 400; font-size: 14px;">Loading...</span>'
95
101
const { widgetSource } = await source
96
- const formula = await widgetSource . getFormula ( {
102
+ await Promise . all ( [
103
+ renderFormula ( widgetSource ) ,
104
+ renderHistogram ( widgetSource )
105
+ ] )
106
+ }
107
+
108
+ async function renderFormula ( ws : WidgetSource ) {
109
+ formulaWidget . innerHTML = '<span style="font-weight: 400; font-size: 14px;">Loading...</span>'
110
+ const formula = await ws . getFormula ( {
97
111
column : selectedVariable ,
112
+ operation : 'sum' ,
113
+ spatialFilter : getSpatialFilterFromViewState ( viewState ) ,
114
+ viewState,
115
+ } )
116
+ formulaWidget . textContent = Intl . NumberFormat ( 'en-US' , {
117
+ maximumFractionDigits : 0 ,
118
+ // notation: 'compact'
119
+ } ) . format ( formula . value )
120
+ }
121
+
122
+ const TICKS = [ 100 , 500 , 1000 , 5000 ] ;
123
+
124
+ async function renderHistogram ( ws : WidgetSource ) {
125
+ histogramWidget . parentElement ?. querySelector ( '.loader' ) ?. classList . toggle ( 'hidden' , false ) ;
126
+ histogramWidget . classList . toggle ( 'hidden' , true ) ;
127
+
128
+ const categories = await ws . getCategories ( {
129
+ column : 'urbanity' ,
98
130
operation : 'count' ,
99
131
spatialFilter : getSpatialFilterFromViewState ( viewState ) ,
100
132
viewState,
101
133
} )
102
- formulaWidget . textContent = Intl . NumberFormat ( 'en-US' ) . format ( formula . value )
134
+
135
+ histogramWidget . parentElement ?. querySelector ( '.loader' ) ?. classList . toggle ( 'hidden' , true ) ;
136
+ histogramWidget . classList . toggle ( 'hidden' , false ) ;
137
+
138
+ if ( histogramChart ) {
139
+ histogramChart . data . labels = categories . map ( ( c ) => c . name ) ;
140
+ histogramChart . data . datasets [ 0 ] . data = categories . map ( ( c ) => c . value ) ;
141
+ histogramChart . update ( ) ;
142
+ } else {
143
+ histogramChart = new Chart ( histogramWidget , {
144
+ type : 'bar' ,
145
+ data : {
146
+ labels : categories . map ( ( c ) => c . name ) ,
147
+ datasets : [
148
+ {
149
+ label : 'Urbanity category' ,
150
+ data : categories . map ( ( c ) => c . value ) ,
151
+ }
152
+ ]
153
+ } ,
154
+ } )
155
+ }
103
156
}
104
157
105
158
const debouncedRenderWidgets = debounce ( renderWidgets , 500 ) ;
0 commit comments