gridviz 2.0.38 → 2.0.39

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 +7488 -7530
  3. package/dist/gridviz.min.js +1 -1
  4. package/package.json +78 -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 +177 -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/KernelSmoothingOldStyle.js +221 -221
  35. package/src/style/KernelSmoothingStyle.js +115 -115
  36. package/src/style/KernelSmoothingWGLStyle.js +130 -130
  37. package/src/style/LegoStyle.js +112 -112
  38. package/src/style/MosaicStyle.js +107 -107
  39. package/src/style/NinjaStarStyle.js +124 -124
  40. package/src/style/PillarStyle.js +230 -230
  41. package/src/style/SegmentStyle.js +142 -142
  42. package/src/style/ShapeColorSizeStyle.js +126 -126
  43. package/src/style/SideCatStyle.js +172 -172
  44. package/src/style/SideStyle.js +218 -218
  45. package/src/style/SquareColorCatWGLStyle.js +120 -120
  46. package/src/style/SquareColorWGLStyle.js +146 -146
  47. package/src/style/StrokeStyle.js +131 -131
  48. package/src/style/TanakaStyle.js +160 -160
  49. package/src/style/TextStyle.js +132 -132
  50. package/src/utils/Utils.js +35 -35
  51. package/src/utils/WebGLRectangleColoring.js +106 -106
  52. package/src/utils/WebGLSquareColoring.js +118 -118
  53. package/src/utils/WebGLSquareColoringAdvanced.js +230 -230
  54. package/src/utils/WebGLSquareColoringCatAdvanced.js +133 -133
  55. package/src/utils/WebGLSquareColoringKS.js +153 -153
  56. package/src/utils/stretching.js +131 -131
  57. package/src/utils/webGLUtils.js +71 -71
  58. package/src/utils/zoomUtils.js +142 -142
package/src/index.js CHANGED
@@ -1,177 +1,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 { 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 { 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,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
+ }