gridviz 2.0.38 → 2.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +119 -119
  2. package/dist/gridviz.js +7945 -8887
  3. package/dist/gridviz.min.js +1 -1
  4. package/package.json +77 -78
  5. package/src/App.js +698 -698
  6. package/src/BackgroundLayer.js +182 -182
  7. package/src/BackgroundLayerWMS.js +131 -131
  8. package/src/Dataset.js +76 -76
  9. package/src/DatasetComponent.js +103 -103
  10. package/src/GeoCanvas.js +419 -419
  11. package/src/LabelLayer.js +190 -190
  12. package/src/Layer.js +92 -92
  13. package/src/Legend.js +86 -86
  14. package/src/LineLayer.js +150 -150
  15. package/src/Style.js +114 -114
  16. package/src/Tooltip.js +168 -168
  17. package/src/dataset/COGeo.js +24 -24
  18. package/src/dataset/CSVGrid.js +104 -104
  19. package/src/dataset/GeoTIFF.js +127 -127
  20. package/src/dataset/GridTile.js +41 -41
  21. package/src/dataset/ParquetGrid.js +122 -122
  22. package/src/dataset/TiledGrid.js +296 -296
  23. package/src/index.js +174 -177
  24. package/src/legend/ColorCategoryLegend.js +124 -124
  25. package/src/legend/ColorDiscreteLegend.js +105 -105
  26. package/src/legend/ColorLegend.js +125 -125
  27. package/src/legend/SegmentOrientationLegend.js +87 -87
  28. package/src/legend/SegmentWidthLegend.js +97 -97
  29. package/src/legend/SizeLegend.js +141 -141
  30. package/src/style/CompositionStyle.js +300 -300
  31. package/src/style/ContourStyle.js +54 -54
  32. package/src/style/DotDensityStyle.js +156 -156
  33. package/src/style/JoyPlotStyle.js +135 -135
  34. package/src/style/LegoStyle.js +112 -112
  35. package/src/style/MosaicStyle.js +107 -107
  36. package/src/style/NinjaStarStyle.js +124 -124
  37. package/src/style/PillarStyle.js +230 -230
  38. package/src/style/SegmentStyle.js +142 -142
  39. package/src/style/ShapeColorSizeStyle.js +126 -126
  40. package/src/style/SideCatStyle.js +172 -172
  41. package/src/style/SideStyle.js +218 -218
  42. package/src/style/SquareColorCatWGLStyle.js +120 -120
  43. package/src/style/SquareColorWGLStyle.js +146 -146
  44. package/src/style/StrokeStyle.js +131 -131
  45. package/src/style/TanakaStyle.js +160 -160
  46. package/src/style/TextStyle.js +132 -132
  47. package/src/utils/Utils.js +35 -35
  48. package/src/utils/WebGLRectangleColoring.js +106 -106
  49. package/src/utils/WebGLSquareColoring.js +118 -118
  50. package/src/utils/WebGLSquareColoringAdvanced.js +230 -230
  51. package/src/utils/WebGLSquareColoringCatAdvanced.js +133 -133
  52. package/src/utils/WebGLSquareColoringKS.js +153 -153
  53. package/src/utils/stretching.js +131 -131
  54. package/src/utils/webGLUtils.js +71 -71
  55. package/src/utils/zoomUtils.js +142 -142
  56. package/src/style/KernelSmoothingOldStyle.js +0 -221
  57. package/src/style/KernelSmoothingStyle.js +0 -115
  58. package/src/style/KernelSmoothingWGLStyle.js +0 -130
package/src/index.js CHANGED
@@ -1,177 +1,174 @@
1
- //@ts-check
2
- 'use strict'
3
-
4
- // the application
5
- export { App } from './App.js'
6
- export { GeoCanvas } from './GeoCanvas.js'
7
- export { Style } from './Style.js'
8
- export { Layer } from './Layer.js'
9
- export { Dataset } from './Dataset.js'
10
- export { DatasetComponent } from './DatasetComponent.js'
11
-
12
- // export dataset types
13
- export { TiledGrid } from './dataset/TiledGrid.js'
14
- export { CSVGrid } from './dataset/CSVGrid.js'
15
- //export { ParquetGrid } from "./dataset/ParquetGrid"
16
- //export { GeoTIFF } from "./dataset/GeoTIFF"
17
-
18
- // export styles
19
- export { ShapeColorSizeStyle } from './style/ShapeColorSizeStyle.js'
20
- export { StrokeStyle } from './style/StrokeStyle.js'
21
- export { JoyPlotStyle } from './style/JoyPlotStyle.js'
22
- export { CompositionStyle } from './style/CompositionStyle.js'
23
- export { SegmentStyle } from './style/SegmentStyle.js'
24
- export { TextStyle } from './style/TextStyle.js'
25
- export { KernelSmoothingStyle } from './style/KernelSmoothingStyle.js'
26
- //export { KernelSmoothingOldStyle } from "./style/KernelSmoothingStyle"
27
- //export { KernelSmoothingWGLStyle } from "./style/KernelSmoothingStyle"
28
- export { PillarStyle } from './style/PillarStyle.js'
29
- export { SideStyle } from './style/SideStyle.js'
30
- export { ContourStyle } from './style/ContourStyle.js'
31
- export { SideCatStyle } from './style/SideCatStyle.js'
32
- export { DotDensityStyle } from './style/DotDensityStyle.js'
33
- export { TanakaStyle } from './style/TanakaStyle.js'
34
- export { LegoStyle } from './style/LegoStyle.js'
35
- export { SquareColorWGLStyle } from './style/SquareColorWGLStyle.js'
36
- export { SquareColorCatWGLStyle } from './style/SquareColorCatWGLStyle.js'
37
- export { MosaicStyle } from './style/MosaicStyle.js'
38
- export { NinjaStarStyle } from './style/NinjaStarStyle.js'
39
-
40
- // export additional layers
41
- export { BackgroundLayer } from './BackgroundLayer.js'
42
- export { BackgroundLayerWMS } from './BackgroundLayerWMS.js'
43
- export { LabelLayer } from './LabelLayer.js'
44
- export { LineLayer as BoundaryLayer } from './LineLayer.js'
45
-
46
- // export legends
47
- export { ColorLegend } from './legend/ColorLegend.js'
48
- export { ColorDiscreteLegend } from './legend/ColorDiscreteLegend.js'
49
- export { ColorCategoryLegend } from './legend/ColorCategoryLegend.js'
50
- export { SizeLegend } from './legend/SizeLegend.js'
51
- export { SegmentWidthLegend } from './legend/SegmentWidthLegend.js'
52
- export { SegmentOrientationLegend } from './legend/SegmentOrientationLegend.js'
53
-
54
- // export { goToStraight, zoomTo } from "./utils/zoomUtils"
55
- export * from './utils/stretching.js'
56
-
57
- export { getClass } from './utils/Utils.js'
58
-
59
- import { GeoCanvas } from './GeoCanvas.js'
60
- import { geoAzimuthalEqualArea } from 'd3-geo'
61
-
62
- /**
63
- * Returns label layer from Eurostat, for ETRS89-LAEA grids.
64
- * From Euronym data: https://github.com/eurostat/euronym
65
- *
66
- * @returns {object}
67
- */
68
- export const getEuronymeLabelLayer = function (cc = 'EUR', res = 50, opts) {
69
- opts = opts || {}
70
- const ex = opts.ex || 1.2
71
- const fontFamily = opts.fontFamily || 'Arial'
72
- const exSize = opts.exSize || 1
73
- opts.style =
74
- opts.style ||
75
- ((lb, zf) => {
76
- if (lb.rs < ex * zf) return
77
- if (lb.r1 < ex * zf) return exSize + 'em ' + fontFamily
78
- return exSize * 1.5 + 'em ' + fontFamily
79
- })
80
- //ETRS89-LAEA projection
81
- opts.proj =
82
- opts.proj ||
83
- geoAzimuthalEqualArea()
84
- .rotate([-10, -52])
85
- .reflectX(false)
86
- .reflectY(true)
87
- .scale(6378137)
88
- .translate([4321000, 3210000])
89
- opts.preprocess = (lb) => {
90
- //exclude countries
91
- //if(opts.ccOut && lb.cc && opts.ccOut.includes(lb.cc)) return false;
92
- if (opts.ccIn && lb.cc && !(opts.ccIn.indexOf(lb.cc) >= 0)) return false
93
-
94
- //project from geo coordinates to ETRS89-LAEA
95
- const p = opts.proj([lb.lon, lb.lat])
96
- lb.x = p[0]
97
- lb.y = p[1]
98
- delete lb.lon
99
- delete lb.lat
100
- }
101
- opts.baseURL = opts.baseURL || 'https://raw.githubusercontent.com/eurostat/euronym/main/pub/v2/UTF/'
102
- opts.url = opts.baseURL + res + '/' + cc + '.csv'
103
- return opts
104
- }
105
-
106
- /**
107
- * @returns {object}
108
- */
109
- export const getEurostatBoundariesLayer = function (opts) {
110
- opts = opts || {}
111
- const nutsYear = opts.nutsYear || '2021'
112
- const crs = opts.crs || '3035'
113
- const scale = opts.scale || '03M'
114
- const nutsLevel = opts.nutsLevel || '3'
115
- const col = opts.col || '#888'
116
- const colKosovo = opts.colKosovo || '#bcbcbc'
117
- const showOth = opts.showOth == undefined ? true : opts.showOth
118
-
119
- opts.color =
120
- opts.color ||
121
- ((f, zf) => {
122
- const p = f.properties
123
- if (!showOth /*&& p.co == "F"*/ && p.eu != 'T' && p.cc != 'T' && p.efta != 'T' && p.oth === 'T')
124
- return
125
- if (p.id >= 100000) return colKosovo
126
- if (p.co === 'T') return col
127
- if (zf < 400) return col
128
- else if (zf < 1000) return p.lvl >= 3 ? '' : col
129
- else if (zf < 2000) return p.lvl >= 2 ? '' : col
130
- else return p.lvl >= 1 ? '' : col
131
- })
132
-
133
- opts.width =
134
- opts.width ||
135
- ((f, zf) => {
136
- const p = f.properties
137
- if (p.co === 'T') return 0.5
138
- if (zf < 400) return p.lvl == 3 ? 2.2 : p.lvl == 2 ? 2.2 : p.lvl == 1 ? 2.2 : 4
139
- else if (zf < 1000) return p.lvl == 2 ? 1.8 : p.lvl == 1 ? 1.8 : 2.5
140
- else if (zf < 2000) return p.lvl == 1 ? 1.8 : 2.5
141
- else return 1.2
142
- })
143
-
144
- opts.lineDash =
145
- opts.lineDash ||
146
- ((f, zf) => {
147
- const p = f.properties
148
- if (p.co === 'T') return []
149
- if (zf < 400)
150
- return p.lvl == 3
151
- ? [2 * zf, 2 * zf]
152
- : p.lvl == 2
153
- ? [5 * zf, 2 * zf]
154
- : p.lvl == 1
155
- ? [5 * zf, 2 * zf]
156
- : [10 * zf, 3 * zf]
157
- else if (zf < 1000)
158
- return p.lvl == 2 ? [5 * zf, 2 * zf] : p.lvl == 1 ? [5 * zf, 2 * zf] : [10 * zf, 3 * zf]
159
- else if (zf < 2000) return p.lvl == 1 ? [5 * zf, 2 * zf] : [10 * zf, 3 * zf]
160
- else return [10 * zf, 3 * zf]
161
- })
162
-
163
- opts.baseURL = opts.baseURL || 'https://raw.githubusercontent.com/eurostat/Nuts2json/master/pub/v2/'
164
- opts.url = opts.baseURL + nutsYear + '/' + crs + '/' + scale + '/nutsbn_' + nutsLevel + '.json'
165
- return opts
166
- }
167
-
168
- export const getParameterByName = GeoCanvas.getParameterByName
169
-
170
- // set default d3 locale
171
- import { formatDefaultLocale } from 'd3-format'
172
- formatDefaultLocale({
173
- decimal: '.',
174
- thousands: ' ',
175
- grouping: [3],
176
- currency: ['', '€'],
177
- })
1
+ //@ts-check
2
+ 'use strict'
3
+
4
+ // the application
5
+ export { App } from './App.js'
6
+ export { GeoCanvas } from './GeoCanvas.js'
7
+ export { Style } from './Style.js'
8
+ export { Layer } from './Layer.js'
9
+ export { Dataset } from './Dataset.js'
10
+ export { DatasetComponent } from './DatasetComponent.js'
11
+
12
+ // export dataset types
13
+ export { TiledGrid } from './dataset/TiledGrid.js'
14
+ export { CSVGrid } from './dataset/CSVGrid.js'
15
+ //export { ParquetGrid } from "./dataset/ParquetGrid"
16
+ //export { GeoTIFF } from "./dataset/GeoTIFF"
17
+
18
+ // export styles
19
+ export { ShapeColorSizeStyle } from './style/ShapeColorSizeStyle.js'
20
+ export { StrokeStyle } from './style/StrokeStyle.js'
21
+ export { JoyPlotStyle } from './style/JoyPlotStyle.js'
22
+ export { CompositionStyle } from './style/CompositionStyle.js'
23
+ export { SegmentStyle } from './style/SegmentStyle.js'
24
+ export { TextStyle } from './style/TextStyle.js'
25
+ export { PillarStyle } from './style/PillarStyle.js'
26
+ export { SideStyle } from './style/SideStyle.js'
27
+ export { ContourStyle } from './style/ContourStyle.js'
28
+ export { SideCatStyle } from './style/SideCatStyle.js'
29
+ export { DotDensityStyle } from './style/DotDensityStyle.js'
30
+ export { TanakaStyle } from './style/TanakaStyle.js'
31
+ export { LegoStyle } from './style/LegoStyle.js'
32
+ export { SquareColorWGLStyle } from './style/SquareColorWGLStyle.js'
33
+ export { SquareColorCatWGLStyle } from './style/SquareColorCatWGLStyle.js'
34
+ export { MosaicStyle } from './style/MosaicStyle.js'
35
+ export { NinjaStarStyle } from './style/NinjaStarStyle.js'
36
+
37
+ // export additional layers
38
+ export { BackgroundLayer } from './BackgroundLayer.js'
39
+ export { BackgroundLayerWMS } from './BackgroundLayerWMS.js'
40
+ export { LabelLayer } from './LabelLayer.js'
41
+ export { LineLayer as BoundaryLayer } from './LineLayer.js'
42
+
43
+ // export legends
44
+ export { ColorLegend } from './legend/ColorLegend.js'
45
+ export { ColorDiscreteLegend } from './legend/ColorDiscreteLegend.js'
46
+ export { ColorCategoryLegend } from './legend/ColorCategoryLegend.js'
47
+ export { SizeLegend } from './legend/SizeLegend.js'
48
+ export { SegmentWidthLegend } from './legend/SegmentWidthLegend.js'
49
+ export { SegmentOrientationLegend } from './legend/SegmentOrientationLegend.js'
50
+
51
+ // export { goToStraight, zoomTo } from "./utils/zoomUtils"
52
+ export * from './utils/stretching.js'
53
+
54
+ export { getClass } from './utils/Utils.js'
55
+
56
+ import { GeoCanvas } from './GeoCanvas.js'
57
+ import { geoAzimuthalEqualArea } from 'd3-geo'
58
+
59
+ /**
60
+ * Returns label layer from Eurostat, for ETRS89-LAEA grids.
61
+ * From Euronym data: https://github.com/eurostat/euronym
62
+ *
63
+ * @returns {object}
64
+ */
65
+ export const getEuronymeLabelLayer = function (cc = 'EUR', res = 50, opts) {
66
+ opts = opts || {}
67
+ const ex = opts.ex || 1.2
68
+ const fontFamily = opts.fontFamily || 'Arial'
69
+ const exSize = opts.exSize || 1
70
+ opts.style =
71
+ opts.style ||
72
+ ((lb, zf) => {
73
+ if (lb.rs < ex * zf) return
74
+ if (lb.r1 < ex * zf) return exSize + 'em ' + fontFamily
75
+ return exSize * 1.5 + 'em ' + fontFamily
76
+ })
77
+ //ETRS89-LAEA projection
78
+ opts.proj =
79
+ opts.proj ||
80
+ geoAzimuthalEqualArea()
81
+ .rotate([-10, -52])
82
+ .reflectX(false)
83
+ .reflectY(true)
84
+ .scale(6378137)
85
+ .translate([4321000, 3210000])
86
+ opts.preprocess = (lb) => {
87
+ //exclude countries
88
+ //if(opts.ccOut && lb.cc && opts.ccOut.includes(lb.cc)) return false;
89
+ if (opts.ccIn && lb.cc && !(opts.ccIn.indexOf(lb.cc) >= 0)) return false
90
+
91
+ //project from geo coordinates to ETRS89-LAEA
92
+ const p = opts.proj([lb.lon, lb.lat])
93
+ lb.x = p[0]
94
+ lb.y = p[1]
95
+ delete lb.lon
96
+ delete lb.lat
97
+ }
98
+ opts.baseURL = opts.baseURL || 'https://raw.githubusercontent.com/eurostat/euronym/main/pub/v2/UTF/'
99
+ opts.url = opts.baseURL + res + '/' + cc + '.csv'
100
+ return opts
101
+ }
102
+
103
+ /**
104
+ * @returns {object}
105
+ */
106
+ export const getEurostatBoundariesLayer = function (opts) {
107
+ opts = opts || {}
108
+ const nutsYear = opts.nutsYear || '2021'
109
+ const crs = opts.crs || '3035'
110
+ const scale = opts.scale || '03M'
111
+ const nutsLevel = opts.nutsLevel || '3'
112
+ const col = opts.col || '#888'
113
+ const colKosovo = opts.colKosovo || '#bcbcbc'
114
+ const showOth = opts.showOth == undefined ? true : opts.showOth
115
+
116
+ opts.color =
117
+ opts.color ||
118
+ ((f, zf) => {
119
+ const p = f.properties
120
+ if (!showOth /*&& p.co == "F"*/ && p.eu != 'T' && p.cc != 'T' && p.efta != 'T' && p.oth === 'T')
121
+ return
122
+ if (p.id >= 100000) return colKosovo
123
+ if (p.co === 'T') return col
124
+ if (zf < 400) return col
125
+ else if (zf < 1000) return p.lvl >= 3 ? '' : col
126
+ else if (zf < 2000) return p.lvl >= 2 ? '' : col
127
+ else return p.lvl >= 1 ? '' : col
128
+ })
129
+
130
+ opts.width =
131
+ opts.width ||
132
+ ((f, zf) => {
133
+ const p = f.properties
134
+ if (p.co === 'T') return 0.5
135
+ if (zf < 400) return p.lvl == 3 ? 2.2 : p.lvl == 2 ? 2.2 : p.lvl == 1 ? 2.2 : 4
136
+ else if (zf < 1000) return p.lvl == 2 ? 1.8 : p.lvl == 1 ? 1.8 : 2.5
137
+ else if (zf < 2000) return p.lvl == 1 ? 1.8 : 2.5
138
+ else return 1.2
139
+ })
140
+
141
+ opts.lineDash =
142
+ opts.lineDash ||
143
+ ((f, zf) => {
144
+ const p = f.properties
145
+ if (p.co === 'T') return []
146
+ if (zf < 400)
147
+ return p.lvl == 3
148
+ ? [2 * zf, 2 * zf]
149
+ : p.lvl == 2
150
+ ? [5 * zf, 2 * zf]
151
+ : p.lvl == 1
152
+ ? [5 * zf, 2 * zf]
153
+ : [10 * zf, 3 * zf]
154
+ else if (zf < 1000)
155
+ return p.lvl == 2 ? [5 * zf, 2 * zf] : p.lvl == 1 ? [5 * zf, 2 * zf] : [10 * zf, 3 * zf]
156
+ else if (zf < 2000) return p.lvl == 1 ? [5 * zf, 2 * zf] : [10 * zf, 3 * zf]
157
+ else return [10 * zf, 3 * zf]
158
+ })
159
+
160
+ opts.baseURL = opts.baseURL || 'https://raw.githubusercontent.com/eurostat/Nuts2json/master/pub/v2/'
161
+ opts.url = opts.baseURL + nutsYear + '/' + crs + '/' + scale + '/nutsbn_' + nutsLevel + '.json'
162
+ return opts
163
+ }
164
+
165
+ export const getParameterByName = GeoCanvas.getParameterByName
166
+
167
+ // set default d3 locale
168
+ import { formatDefaultLocale } from 'd3-format'
169
+ formatDefaultLocale({
170
+ decimal: '.',
171
+ thousands: ' ',
172
+ grouping: [3],
173
+ currency: ['', '€'],
174
+ })
@@ -1,124 +1,124 @@
1
- //@ts-check
2
- 'use strict'
3
-
4
- import { Legend } from '../Legend.js'
5
-
6
- /**
7
- * A legend element for color categrories.
8
- *
9
- * @author Joseph Davies, Julien Gaffuri
10
- */
11
- export class ColorCategoryLegend extends Legend {
12
- /** @param {Object} opts */
13
- constructor(opts) {
14
- super(opts)
15
- opts = opts || {}
16
-
17
- //col/categories array, in display order
18
- /**
19
- * @private
20
- * @type {Array.<Array.<string>>} */
21
- this.colCat = opts.colCat || [['gray', '-']]
22
-
23
- /**
24
- * @private
25
- * @type {import("../Style").Shape} */
26
- this.shape = opts.shape || 'circle'
27
- this.dimension = opts.dimension || { r: 8 }
28
- this.strokeColor = opts.strokeColor || 'gray'
29
- this.strokeWidth = opts.strokeWidth || 1
30
-
31
- this.title = opts.title
32
- this.titleFontSize = opts.titleFontSize || '0.8em'
33
- this.titleFontWeight = opts.titleFontWeight || 'bold'
34
-
35
- //label
36
- this.labelFontSize = opts.labelFontSize || '0.8em'
37
- }
38
-
39
- /**
40
- * @param {{ style: import("../Style").Style, r: number, zf: number, sSize: import("../Style").Stat, sColor: import("../Style").Stat }} opts
41
- */
42
- update(opts) {
43
- //clear
44
- this.div.selectAll('*').remove()
45
-
46
- //build
47
-
48
- //title
49
- if (this.title)
50
- this.div
51
- .append('div')
52
- .style('font-size', this.titleFontSize)
53
- .style('font-weight', this.titleFontWeight)
54
- .style('margin-bottom', '7px')
55
- .text(this.title)
56
-
57
- //categories
58
- const nb = this.colCat.length
59
- if (nb == 0) return
60
-
61
- for (let i = 0; i < nb; i++) {
62
- const cat = this.colCat[i]
63
-
64
- //make div for category
65
- const d = this.div.append('div')
66
- //to enable vertical centering
67
- //.style("position", "relative")
68
-
69
- const sw = this.strokeWidth
70
-
71
- //draw graphic element: box / circle
72
- if (this.shape === 'square') {
73
- const h = this.dimension.h || 15
74
- const w = this.dimension.w || 20
75
- d.append('div')
76
- .style('display', 'inline')
77
-
78
- .append('svg')
79
- .attr('width', w + 2 * sw)
80
- .attr('height', h + 2 * sw)
81
-
82
- .append('rect')
83
- .attr('x', sw)
84
- .attr('y', sw)
85
- .attr('width', w)
86
- .attr('height', h)
87
- .style('fill', cat[0])
88
- .style('stroke', this.strokeColor)
89
- .style('stroke-width', this.strokeWidth)
90
- } else if (this.shape === 'circle') {
91
- const r = this.dimension.r || 8
92
- const h = 2 * r + 2 * sw
93
- d.append('div')
94
- .style('display', 'inline')
95
-
96
- .append('svg')
97
- .attr('width', h)
98
- .attr('height', h)
99
-
100
- .append('circle')
101
- .attr('cx', r + sw)
102
- .attr('cy', r + sw)
103
- .attr('r', r)
104
- .style('fill', cat[0])
105
- .style('stroke', this.strokeColor)
106
- .style('stroke-width', this.strokeWidth)
107
- } else {
108
- throw new Error('Unexpected shape:' + this.shape)
109
- }
110
-
111
- //write label text
112
- d.append('div')
113
- //show on right of graphic
114
- .style('display', 'inline')
115
-
116
- //center vertically
117
- //.style("position", "absolute").style("top", "0").style("bottom", "0")
118
-
119
- .style('padding-left', '5px')
120
- .style('font-size', this.labelFontSize)
121
- .text(cat[1])
122
- }
123
- }
124
- }
1
+ //@ts-check
2
+ 'use strict'
3
+
4
+ import { Legend } from '../Legend.js'
5
+
6
+ /**
7
+ * A legend element for color categrories.
8
+ *
9
+ * @author Joseph Davies, Julien Gaffuri
10
+ */
11
+ export class ColorCategoryLegend extends Legend {
12
+ /** @param {Object} opts */
13
+ constructor(opts) {
14
+ super(opts)
15
+ opts = opts || {}
16
+
17
+ //col/categories array, in display order
18
+ /**
19
+ * @private
20
+ * @type {Array.<Array.<string>>} */
21
+ this.colCat = opts.colCat || [['gray', '-']]
22
+
23
+ /**
24
+ * @private
25
+ * @type {import("../Style").Shape} */
26
+ this.shape = opts.shape || 'circle'
27
+ this.dimension = opts.dimension || { r: 8 }
28
+ this.strokeColor = opts.strokeColor || 'gray'
29
+ this.strokeWidth = opts.strokeWidth || 1
30
+
31
+ this.title = opts.title
32
+ this.titleFontSize = opts.titleFontSize || '0.8em'
33
+ this.titleFontWeight = opts.titleFontWeight || 'bold'
34
+
35
+ //label
36
+ this.labelFontSize = opts.labelFontSize || '0.8em'
37
+ }
38
+
39
+ /**
40
+ * @param {{ style: import("../Style").Style, r: number, zf: number, sSize: import("../Style").Stat, sColor: import("../Style").Stat }} opts
41
+ */
42
+ update(opts) {
43
+ //clear
44
+ this.div.selectAll('*').remove()
45
+
46
+ //build
47
+
48
+ //title
49
+ if (this.title)
50
+ this.div
51
+ .append('div')
52
+ .style('font-size', this.titleFontSize)
53
+ .style('font-weight', this.titleFontWeight)
54
+ .style('margin-bottom', '7px')
55
+ .text(this.title)
56
+
57
+ //categories
58
+ const nb = this.colCat.length
59
+ if (nb == 0) return
60
+
61
+ for (let i = 0; i < nb; i++) {
62
+ const cat = this.colCat[i]
63
+
64
+ //make div for category
65
+ const d = this.div.append('div')
66
+ //to enable vertical centering
67
+ //.style("position", "relative")
68
+
69
+ const sw = this.strokeWidth
70
+
71
+ //draw graphic element: box / circle
72
+ if (this.shape === 'square') {
73
+ const h = this.dimension.h || 15
74
+ const w = this.dimension.w || 20
75
+ d.append('div')
76
+ .style('display', 'inline')
77
+
78
+ .append('svg')
79
+ .attr('width', w + 2 * sw)
80
+ .attr('height', h + 2 * sw)
81
+
82
+ .append('rect')
83
+ .attr('x', sw)
84
+ .attr('y', sw)
85
+ .attr('width', w)
86
+ .attr('height', h)
87
+ .style('fill', cat[0])
88
+ .style('stroke', this.strokeColor)
89
+ .style('stroke-width', this.strokeWidth)
90
+ } else if (this.shape === 'circle') {
91
+ const r = this.dimension.r || 8
92
+ const h = 2 * r + 2 * sw
93
+ d.append('div')
94
+ .style('display', 'inline')
95
+
96
+ .append('svg')
97
+ .attr('width', h)
98
+ .attr('height', h)
99
+
100
+ .append('circle')
101
+ .attr('cx', r + sw)
102
+ .attr('cy', r + sw)
103
+ .attr('r', r)
104
+ .style('fill', cat[0])
105
+ .style('stroke', this.strokeColor)
106
+ .style('stroke-width', this.strokeWidth)
107
+ } else {
108
+ throw new Error('Unexpected shape:' + this.shape)
109
+ }
110
+
111
+ //write label text
112
+ d.append('div')
113
+ //show on right of graphic
114
+ .style('display', 'inline')
115
+
116
+ //center vertically
117
+ //.style("position", "absolute").style("top", "0").style("bottom", "0")
118
+
119
+ .style('padding-left', '5px')
120
+ .style('font-size', this.labelFontSize)
121
+ .text(cat[1])
122
+ }
123
+ }
124
+ }