raain-model 2.6.8 → 2.6.10

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 (210) hide show
  1. package/.cursorignore +10 -0
  2. package/.github/workflows/ci.yml +29 -0
  3. package/CHANGELOG.md +166 -0
  4. package/LICENSE +21 -0
  5. package/README.md +5 -3
  6. package/RELEASE_PROCESS.md +111 -0
  7. package/package.json +1 -1
  8. package/specs/REQUIREMENTS.md +42 -0
  9. package/specs/TECHNICAL.md +57 -0
  10. package/specs/cartesian/Cartesian.spec.ts +82 -0
  11. package/specs/cartesian/CartesianTools.spec.ts +121 -0
  12. package/specs/gauge/Gauge.spec.ts +39 -0
  13. package/specs/organization/Organization.spec.ts +38 -0
  14. package/specs/polar/Polar.spec.ts +267 -0
  15. package/specs/quality/Position.spec.ts +18 -0
  16. package/specs/quality/QualityPointEdgeCases.spec.ts +215 -0
  17. package/specs/quality/QualityTools.spec.ts +67 -0
  18. package/specs/quality/SpeedMatrix.spec.ts +214 -0
  19. package/specs/radar/Radar.spec.ts +129 -0
  20. package/specs/rain/Rain.spec.ts +334 -0
  21. package/specs/tsconfig.json +12 -0
  22. package/{cartesian/CartesianMeasureValue.js → src/cartesian/CartesianMeasureValue.ts} +73 -41
  23. package/{cartesian/CartesianTools.js → src/cartesian/CartesianTools.ts} +130 -69
  24. package/src/cartesian/CartesianValue.ts +26 -0
  25. package/src/cartesian/EarthMap.ts +5 -0
  26. package/src/cartesian/ICartesianMeasureValue.ts +22 -0
  27. package/src/cartesian/LatLng.ts +43 -0
  28. package/src/cartesian/RadarCartesianMeasureValue.ts +32 -0
  29. package/src/cartesian/RainCartesianMeasureValue.ts +32 -0
  30. package/src/gauge/GaugeMeasure.ts +42 -0
  31. package/{gauge/GaugeNode.js → src/gauge/GaugeNode.ts} +48 -20
  32. package/src/gauge/GaugeNodeMap.ts +55 -0
  33. package/src/organization/EventNode.ts +43 -0
  34. package/{organization/Link.js → src/organization/Link.ts} +15 -15
  35. package/src/organization/Measure.ts +61 -0
  36. package/{organization/PeopleNode.js → src/organization/PeopleNode.ts} +20 -10
  37. package/{organization/RaainNode.js → src/organization/RaainNode.ts} +91 -58
  38. package/{organization/TeamNode.js → src/organization/TeamNode.ts} +36 -13
  39. package/{polar/AbstractPolarMeasureValue.js → src/polar/AbstractPolarMeasureValue.ts} +58 -32
  40. package/src/polar/IPolarMeasureValue.ts +21 -0
  41. package/{polar/MeasureValuePolarContainer.js → src/polar/MeasureValuePolarContainer.ts} +29 -13
  42. package/src/polar/PolarFilter.ts +46 -0
  43. package/{polar/PolarMeasureValue.js → src/polar/PolarMeasureValue.ts} +125 -62
  44. package/{polar/PolarMeasureValueMap.js → src/polar/PolarMeasureValueMap.ts} +165 -88
  45. package/src/polar/PolarValue.ts +16 -0
  46. package/{polar/RadarPolarMeasureValue.js → src/polar/RadarPolarMeasureValue.ts} +34 -21
  47. package/src/polar/RainPolarMeasureValue.ts +57 -0
  48. package/{quality/QualityPoint.js → src/quality/QualityPoint.ts} +62 -34
  49. package/{quality/SpeedMatrix.js → src/quality/SpeedMatrix.ts} +117 -76
  50. package/{quality/SpeedMatrixContainer.js → src/quality/SpeedMatrixContainer.ts} +210 -103
  51. package/src/quality/history/CartesianGaugeHistory.ts +23 -0
  52. package/src/quality/history/CartesianRainHistory.ts +15 -0
  53. package/src/quality/history/PositionHistory.ts +31 -0
  54. package/{quality/index.d.ts → src/quality/index.ts} +3 -0
  55. package/src/quality/position/Position.ts +59 -0
  56. package/src/quality/position/PositionValue.ts +15 -0
  57. package/{quality/tools/QualityTools.js → src/quality/tools/QualityTools.ts} +18 -17
  58. package/src/radar/RadarMeasure.ts +41 -0
  59. package/{radar/RadarNode.js → src/radar/RadarNode.ts} +41 -19
  60. package/src/radar/RadarNodeMap.ts +61 -0
  61. package/src/rain/MergeStrategy.ts +15 -0
  62. package/src/rain/RainComputation.ts +96 -0
  63. package/{rain/RainComputationAbstract.js → src/rain/RainComputationAbstract.ts} +135 -69
  64. package/{rain/RainComputationMap.js → src/rain/RainComputationMap.ts} +55 -22
  65. package/{rain/RainComputationQuality.js → src/rain/RainComputationQuality.ts} +82 -44
  66. package/src/rain/RainMeasure.ts +25 -0
  67. package/{rain/RainNode.js → src/rain/RainNode.ts} +117 -72
  68. package/tsconfig.json +17 -0
  69. package/tslint.json +79 -0
  70. package/typedoc.json +31 -0
  71. package/cartesian/CartesianMeasureValue.d.ts +0 -40
  72. package/cartesian/CartesianMeasureValue.js.map +0 -1
  73. package/cartesian/CartesianTools.d.ts +0 -32
  74. package/cartesian/CartesianTools.js.map +0 -1
  75. package/cartesian/CartesianValue.d.ts +0 -14
  76. package/cartesian/CartesianValue.js +0 -17
  77. package/cartesian/CartesianValue.js.map +0 -1
  78. package/cartesian/EarthMap.d.ts +0 -5
  79. package/cartesian/EarthMap.js +0 -3
  80. package/cartesian/EarthMap.js.map +0 -1
  81. package/cartesian/ICartesianMeasureValue.d.ts +0 -23
  82. package/cartesian/ICartesianMeasureValue.js +0 -3
  83. package/cartesian/ICartesianMeasureValue.js.map +0 -1
  84. package/cartesian/LatLng.d.ts +0 -16
  85. package/cartesian/LatLng.js +0 -34
  86. package/cartesian/LatLng.js.map +0 -1
  87. package/cartesian/RadarCartesianMeasureValue.d.ts +0 -17
  88. package/cartesian/RadarCartesianMeasureValue.js +0 -22
  89. package/cartesian/RadarCartesianMeasureValue.js.map +0 -1
  90. package/cartesian/RainCartesianMeasureValue.d.ts +0 -17
  91. package/cartesian/RainCartesianMeasureValue.js +0 -23
  92. package/cartesian/RainCartesianMeasureValue.js.map +0 -1
  93. package/cartesian/index.js +0 -25
  94. package/cartesian/index.js.map +0 -1
  95. package/gauge/GaugeMeasure.d.ts +0 -20
  96. package/gauge/GaugeMeasure.js +0 -30
  97. package/gauge/GaugeMeasure.js.map +0 -1
  98. package/gauge/GaugeNode.d.ts +0 -85
  99. package/gauge/GaugeNode.js.map +0 -1
  100. package/gauge/GaugeNodeMap.d.ts +0 -24
  101. package/gauge/GaugeNodeMap.js +0 -40
  102. package/gauge/GaugeNodeMap.js.map +0 -1
  103. package/gauge/index.js +0 -20
  104. package/gauge/index.js.map +0 -1
  105. package/index.js +0 -24
  106. package/index.js.map +0 -1
  107. package/organization/EventNode.d.ts +0 -22
  108. package/organization/EventNode.js +0 -30
  109. package/organization/EventNode.js.map +0 -1
  110. package/organization/IVersion.js +0 -3
  111. package/organization/IVersion.js.map +0 -1
  112. package/organization/Link.d.ts +0 -16
  113. package/organization/Link.js.map +0 -1
  114. package/organization/Measure.d.ts +0 -22
  115. package/organization/Measure.js +0 -45
  116. package/organization/Measure.js.map +0 -1
  117. package/organization/PeopleNode.d.ts +0 -18
  118. package/organization/PeopleNode.js.map +0 -1
  119. package/organization/RaainNode.d.ts +0 -96
  120. package/organization/RaainNode.js.map +0 -1
  121. package/organization/TeamNode.d.ts +0 -63
  122. package/organization/TeamNode.js.map +0 -1
  123. package/organization/index.js +0 -24
  124. package/organization/index.js.map +0 -1
  125. package/polar/AbstractPolarMeasureValue.d.ts +0 -29
  126. package/polar/AbstractPolarMeasureValue.js.map +0 -1
  127. package/polar/IPolarMeasureValue.d.ts +0 -19
  128. package/polar/IPolarMeasureValue.js +0 -3
  129. package/polar/IPolarMeasureValue.js.map +0 -1
  130. package/polar/MeasureValuePolarContainer.d.ts +0 -19
  131. package/polar/MeasureValuePolarContainer.js.map +0 -1
  132. package/polar/PolarFilter.d.ts +0 -16
  133. package/polar/PolarFilter.js +0 -45
  134. package/polar/PolarFilter.js.map +0 -1
  135. package/polar/PolarMeasureValue.d.ts +0 -51
  136. package/polar/PolarMeasureValue.js.map +0 -1
  137. package/polar/PolarMeasureValueMap.d.ts +0 -45
  138. package/polar/PolarMeasureValueMap.js.map +0 -1
  139. package/polar/PolarValue.d.ts +0 -10
  140. package/polar/PolarValue.js +0 -12
  141. package/polar/PolarValue.js.map +0 -1
  142. package/polar/RadarPolarMeasureValue.d.ts +0 -27
  143. package/polar/RadarPolarMeasureValue.js.map +0 -1
  144. package/polar/RainPolarMeasureValue.d.ts +0 -20
  145. package/polar/RainPolarMeasureValue.js +0 -42
  146. package/polar/RainPolarMeasureValue.js.map +0 -1
  147. package/polar/index.js +0 -25
  148. package/polar/index.js.map +0 -1
  149. package/quality/QualityPoint.d.ts +0 -37
  150. package/quality/QualityPoint.js.map +0 -1
  151. package/quality/SpeedMatrix.d.ts +0 -83
  152. package/quality/SpeedMatrix.js.map +0 -1
  153. package/quality/SpeedMatrixContainer.d.ts +0 -102
  154. package/quality/SpeedMatrixContainer.js.map +0 -1
  155. package/quality/history/CartesianGaugeHistory.d.ts +0 -15
  156. package/quality/history/CartesianGaugeHistory.js +0 -14
  157. package/quality/history/CartesianGaugeHistory.js.map +0 -1
  158. package/quality/history/CartesianRainHistory.d.ts +0 -9
  159. package/quality/history/CartesianRainHistory.js +0 -11
  160. package/quality/history/CartesianRainHistory.js.map +0 -1
  161. package/quality/history/PositionHistory.d.ts +0 -20
  162. package/quality/history/PositionHistory.js +0 -17
  163. package/quality/history/PositionHistory.js.map +0 -1
  164. package/quality/index.js +0 -26
  165. package/quality/index.js.map +0 -1
  166. package/quality/position/Position.d.ts +0 -22
  167. package/quality/position/Position.js +0 -50
  168. package/quality/position/Position.js.map +0 -1
  169. package/quality/position/PositionValue.d.ts +0 -9
  170. package/quality/position/PositionValue.js +0 -12
  171. package/quality/position/PositionValue.js.map +0 -1
  172. package/quality/tools/QualityTools.d.ts +0 -9
  173. package/quality/tools/QualityTools.js.map +0 -1
  174. package/radar/RadarMeasure.d.ts +0 -19
  175. package/radar/RadarMeasure.js +0 -30
  176. package/radar/RadarMeasure.js.map +0 -1
  177. package/radar/RadarNode.d.ts +0 -30
  178. package/radar/RadarNode.js.map +0 -1
  179. package/radar/RadarNodeMap.d.ts +0 -26
  180. package/radar/RadarNodeMap.js +0 -44
  181. package/radar/RadarNodeMap.js.map +0 -1
  182. package/radar/index.js +0 -20
  183. package/radar/index.js.map +0 -1
  184. package/rain/MergeStrategy.d.ts +0 -13
  185. package/rain/MergeStrategy.js +0 -11
  186. package/rain/MergeStrategy.js.map +0 -1
  187. package/rain/RainComputation.d.ts +0 -42
  188. package/rain/RainComputation.js +0 -65
  189. package/rain/RainComputation.js.map +0 -1
  190. package/rain/RainComputationAbstract.d.ts +0 -73
  191. package/rain/RainComputationAbstract.js.map +0 -1
  192. package/rain/RainComputationMap.d.ts +0 -97
  193. package/rain/RainComputationMap.js.map +0 -1
  194. package/rain/RainComputationQuality.d.ts +0 -40
  195. package/rain/RainComputationQuality.js.map +0 -1
  196. package/rain/RainMeasure.d.ts +0 -17
  197. package/rain/RainMeasure.js +0 -18
  198. package/rain/RainMeasure.js.map +0 -1
  199. package/rain/RainNode.d.ts +0 -46
  200. package/rain/RainNode.js.map +0 -1
  201. package/rain/index.js +0 -23
  202. package/rain/index.js.map +0 -1
  203. /package/{cartesian/index.d.ts → src/cartesian/index.ts} +0 -0
  204. /package/{gauge/index.d.ts → src/gauge/index.ts} +0 -0
  205. /package/{index.d.ts → src/index.ts} +0 -0
  206. /package/{organization/IVersion.d.ts → src/organization/IVersion.ts} +0 -0
  207. /package/{organization/index.d.ts → src/organization/index.ts} +0 -0
  208. /package/{polar/index.d.ts → src/polar/index.ts} +0 -0
  209. /package/{radar/index.d.ts → src/radar/index.ts} +0 -0
  210. /package/{rain/index.d.ts → src/rain/index.ts} +0 -0
@@ -0,0 +1,334 @@
1
+ import {expect} from 'chai';
2
+ import {
3
+ CartesianTools,
4
+ CartesianValue,
5
+ LatLng,
6
+ MergeStrategy,
7
+ PolarMeasureValue,
8
+ RadarNode,
9
+ RainCartesianMeasureValue,
10
+ RainComputation,
11
+ RainComputationMap,
12
+ RainComputationQuality,
13
+ RainMeasure,
14
+ RainNode,
15
+ RainPolarMeasureValue,
16
+ SpeedMatrixContainer,
17
+ TeamNode
18
+ } from '../../src';
19
+
20
+ // tslint:disable-next-line:only-arrow-functions
21
+ describe('Rain', function () {
22
+
23
+ this.timeout(100000);
24
+ const optionalTrace = (...log: any[]) => {
25
+ // console.log(new Date().toISOString(), log)
26
+ }
27
+
28
+ it('should create simple ones', () => {
29
+ const rainNodeEmpty = new RainNode({
30
+ id: 'notEmpty',
31
+ name: '',
32
+ links: [],
33
+ team: null
34
+ });
35
+ expect(JSON.stringify(rainNodeEmpty.toJSON()))
36
+ .eq('{"id":"notEmpty","links":[],"name":"","status":-1,"quality":-1,"team":null,' +
37
+ '"radars":[],"gauges":[],"lastCompletedComputations":[]}');
38
+ expect(rainNodeEmpty.getCenter().lat).eq(0);
39
+ expect(rainNodeEmpty.getCenter().lng).eq(0);
40
+
41
+ const radarNode1 = new RadarNode({
42
+ id: 'rid',
43
+ latitude: 1, longitude: 1,
44
+ name: 'rname',
45
+ team: null
46
+ });
47
+ const radarNode2 = new RadarNode({
48
+ id: 'rid',
49
+ latitude: 4, longitude: 6,
50
+ name: 'rname',
51
+ team: null
52
+ });
53
+ const rainNodeWithRadars = new RainNode({
54
+ id: 'notEmpty',
55
+ name: '',
56
+ team: null,
57
+ radars: [radarNode1, radarNode2],
58
+ });
59
+ expect(JSON.stringify(rainNodeWithRadars.toJSON()))
60
+ .eq('{"id":"notEmpty","links":[{"rel":"radar","href":"../radars/rid"}],"name":"","status":-1,"quality":-1,"team":null,' +
61
+ '"latLngRectsAsJSON":"[[{\\"lat\\":2,\\"lng\\":0},{\\"lat\\":0,\\"lng\\":2}],[{\\"lat\\":5,\\"lng\\":5},{\\"lat\\":3,\\"lng\\":7}]]",' +
62
+ '"radars":["rid"],"gauges":[],"lastCompletedComputations":[]}');
63
+
64
+ expect(rainNodeWithRadars.getCenter().lat).eq(2.5);
65
+ expect(rainNodeWithRadars.getCenter().lng).eq(3.5);
66
+ expect(JSON.stringify(rainNodeWithRadars.getLimitPoints())).eq('[{"lat":0,"lng":0},{"lat":5,"lng":7}]');
67
+
68
+
69
+ });
70
+
71
+ it('should create some', () => {
72
+
73
+ const team1 = new TeamNode({
74
+ id: 'tid1',
75
+ name: 'team1',
76
+ description: 'team...',
77
+ contracts: ['basic'],
78
+ contacts: []
79
+ });
80
+ const radarNode = new RadarNode({
81
+ id: 'r1',
82
+ latitude: 1, longitude: 1,
83
+ name: 'any name',
84
+ team: team1
85
+ });
86
+ const rainComputationEmpty = new RainComputation({
87
+ id: 'rc1',
88
+ date: new Date(10000000),
89
+ isReady: null,
90
+ results: null,
91
+ version: '1.0.0'
92
+ });
93
+
94
+ const topLeft1 = new LatLng({lat: 1.23, lng: 2.65});
95
+ const bottomRight1 = new LatLng({lat: 1.13, lng: 2.75});
96
+ const topLeft2 = new LatLng({lat: 2.23, lng: 3.65});
97
+ const bottomRight2 = new LatLng({lat: 2.13, lng: 3.75});
98
+ const latLngRects = [[topLeft1, bottomRight1], [topLeft2, bottomRight2]]
99
+ const rainNode = new RainNode({
100
+ id: 'RainNode looks OK.',
101
+ name: 'name',
102
+ links: [radarNode, rainComputationEmpty, null],
103
+ latLngRectsAsJSON: JSON.stringify(latLngRects),
104
+ team: team1
105
+ });
106
+ expect(rainNode.id).eq('RainNode looks OK.');
107
+ expect(JSON.stringify(rainNode.toJSON())).eq('' +
108
+ '{"id":"RainNode looks OK.",' +
109
+ '"links":[' +
110
+ '{"rel":"radar","href":"../radars/r1"},' +
111
+ '{"rel":"rain-computation","href":"../rain-computations/1970-01-01T02:46:40.000Z/1.0.0/rc1"}],' +
112
+ '"name":"name","status":-1,"quality":-1,"team":"tid1",' +
113
+ '"latLngRectsAsJSON":"[[{\\"lat\\":1.23,\\"lng\\":2.65},{\\"lat\\":1.13,\\"lng\\":2.75}],[{\\"lat\\":2.23,\\"lng\\":3.65},{\\"lat\\":2.13,\\"lng\\":3.75}]]",' +
114
+ '"radars":["r1"],"gauges":[],"lastCompletedComputations":["rc1"]}');
115
+
116
+ expect(rainNode.getCenter().lat).eq(1.68);
117
+ expect(rainNode.getCenter().lng).eq(3.2);
118
+ expect(rainNode.getLinksCount()).eq(2);
119
+ expect(rainNode.getLinksCount(RadarNode.TYPE)).eq(1);
120
+ expect(rainNode.getLinkIds().toString()).eq('r1,rc1');
121
+ expect(rainNode.getLink('radar', 0).getId()).eq('r1');
122
+
123
+ const rainComputation = new RainComputation({
124
+ id: 'rc1',
125
+ date: new Date('2022-01-01'),
126
+ links: [radarNode, radarNode, null],
127
+ quality: 1,
128
+ progressIngest: 1,
129
+ progressComputing: 1,
130
+ timeSpentInMs: 100,
131
+ isReady: true,
132
+ isDoneDate: new Date(),
133
+ results: [new RainPolarMeasureValue({
134
+ polarMeasureValue:
135
+ new PolarMeasureValue({measureValuePolarContainers: [], azimuthsCount: 0, polarEdgesCount: 0}),
136
+ version: 'version2'
137
+ })],
138
+ launchedBy: 'oneUser',
139
+ version: 'v1',
140
+ });
141
+
142
+ expect(rainComputation.id).eq('rc1');
143
+ expect(rainComputation.getVersion()).eq('v1');
144
+
145
+ const rainComputationQuality = new RainComputationQuality({
146
+ id: 'rcq1',
147
+ date: new Date('2026-07-08'),
148
+ links: [radarNode],
149
+ quality: 1,
150
+ isReady: true,
151
+ rainComputation,
152
+ qualitySpeedMatrixContainer: new SpeedMatrixContainer({matrices: []}),
153
+ version: 'v1'
154
+ });
155
+ expect(rainComputationQuality.id).eq('rcq1');
156
+ expect(rainComputationQuality.getVersion()).eq('v1');
157
+ expect(JSON.stringify(rainComputationQuality.toJSON()))
158
+ .eq('{' +
159
+ '"id":"rcq1",' +
160
+ '"links":[' +
161
+ '{"rel":"radar","href":"../radars/r1"},' +
162
+ '{"rel":"rain-computation","href":"../rain-computations/2022-01-01T00:00:00.000Z/v1/rc1"}' +
163
+ '],' +
164
+ '"version":"v1",' +
165
+ '"date":"2026-07-08T00:00:00.000Z",' +
166
+ '"quality":1,' +
167
+ '"progressIngest":-1,' +
168
+ '"progressComputing":-1,' +
169
+ '"isReady":true,' +
170
+ '"qualitySpeedMatrixContainer":{"qualityPoints":[],"trustedIndicators":[],"flattenMatrices":[],"speed":{"angleInDegrees":0,"pixelsPerPeriod":0},"matrices":[]},' +
171
+ '"rainComputation":"rc1"' +
172
+ '}');
173
+
174
+ const cartesianValues = [
175
+ new CartesianValue({value: 123, lat: 10, lng: 20}),
176
+ new CartesianValue({value: 321, lat: 10 + CartesianTools.DEFAULT_SCALE, lng: 20 + CartesianTools.DEFAULT_SCALE})];
177
+ const rainCartesianMeasureValue = new RainCartesianMeasureValue({
178
+ cartesianValues,
179
+ version: 'test',
180
+ limitPoints: undefined
181
+ })
182
+ const rainMeasure = new RainMeasure({id: 'measure', values: [rainCartesianMeasureValue], configurationAsJSON: '{"test": true}'});
183
+ expect(JSON.stringify(rainMeasure.toJSON()))
184
+ .eq('{"id":"measure","links":[],"validity":-1,"configurationAsJSON":"{\\"test\\":true}","values":[{"cartesianValues":[{"lat":10,"lng":20,"value":123},{"lat":10.01,"lng":20.01,"value":321}],"limitPoints":[{"lat":10,"lng":20},{"lat":10.01,"lng":20.01}],"version":"test"}]}');
185
+
186
+ const rainComputationMap = new RainComputationMap({
187
+ id: 'rc1',
188
+ date: new Date('2022-01-01'),
189
+ links: [radarNode, radarNode, null],
190
+ quality: 1,
191
+ progressIngest: 1,
192
+ progressComputing: 1,
193
+ timeSpentInMs: 100,
194
+ isReady: true,
195
+ isDoneDate: new Date('1988-01-01'),
196
+ map: [rainMeasure],
197
+ launchedBy: 'oneUser',
198
+ version: 'v1',
199
+ });
200
+
201
+ expect(JSON.stringify(rainComputationMap.toJSON()))
202
+ .eq('{"id":"rc1","links":[{"rel":"radar","href":"../radars/r1"}],"version":"v1","date":"2022-01-01T00:00:00.000Z","quality":1,"progressIngest":1,"progressComputing":1,"timeSpentInMs":100,"isReady":true,"isDoneDate":"1988-01-01T00:00:00.000Z","launchedBy":"oneUser","map":"[{\\"id\\":\\"measure\\",\\"links\\":[],\\"validity\\":-1,\\"configurationAsJSON\\":\\"{\\\\\\"test\\\\\\":true}\\",\\"values\\":[{\\"cartesianValues\\":[{\\"lat\\":10,\\"lng\\":20,\\"value\\":123},{\\"lat\\":10.01,\\"lng\\":20.01,\\"value\\":321}],\\"limitPoints\\":[{\\"lat\\":10,\\"lng\\":20},{\\"lat\\":10.01,\\"lng\\":20.01}],\\"version\\":\\"test\\"}]}]"}');
203
+
204
+ rainComputationMap.setMapData([rainMeasure, rainMeasure], {mergeStrategy: MergeStrategy.NONE});
205
+ expect(JSON.stringify(rainComputationMap.toJSON()))
206
+ .eq('{"id":"rc1","links":[{"rel":"radar","href":"../radars/r1"}],"version":"v1","date":"2022-01-01T00:00:00.000Z","quality":1,"progressIngest":1,"progressComputing":1,"timeSpentInMs":100,"isReady":true,"isDoneDate":"1988-01-01T00:00:00.000Z","launchedBy":"oneUser","map":"[{\\"id\\":\\"measure\\",\\"links\\":[],\\"validity\\":-1,\\"configurationAsJSON\\":\\"{\\\\\\"test\\\\\\":true}\\",\\"values\\":[{\\"cartesianValues\\":[{\\"lat\\":10,\\"lng\\":20,\\"value\\":123},{\\"lat\\":10.01,\\"lng\\":20.01,\\"value\\":321}],\\"limitPoints\\":[{\\"lat\\":10,\\"lng\\":20},{\\"lat\\":10.01,\\"lng\\":20.01}],\\"version\\":\\"test\\"}]},{\\"id\\":\\"measure\\",\\"links\\":[],\\"validity\\":-1,\\"configurationAsJSON\\":\\"{\\\\\\"test\\\\\\":true}\\",\\"values\\":[{\\"cartesianValues\\":[{\\"lat\\":10,\\"lng\\":20,\\"value\\":123},{\\"lat\\":10.01,\\"lng\\":20.01,\\"value\\":321}],\\"limitPoints\\":[{\\"lat\\":10,\\"lng\\":20},{\\"lat\\":10.01,\\"lng\\":20.01}],\\"version\\":\\"test\\"}]}]"}');
207
+
208
+ const cartesianTools = new CartesianTools();
209
+ cartesianTools.buildLatLngEarthMap();
210
+
211
+ const mergeLimitPoints: [LatLng, LatLng] = [new LatLng({lat: 10, lng: 11}), new LatLng({lat: 11, lng: 11.5})];
212
+ rainComputationMap.setMapData([rainMeasure, rainMeasure], {
213
+ mergeStrategy: MergeStrategy.AVERAGE,
214
+ cartesianTools,
215
+ mergeLimitPoints,
216
+ removeNullValues: false,
217
+ });
218
+ expect(JSON.stringify(rainComputationMap.toJSON()))
219
+ .eq('{"id":"rc1","links":[{"rel":"radar","href":"../radars/r1"}],"version":"v1","date":"2022-01-01T00:00:00.000Z","quality":1,"progressIngest":1,"progressComputing":1,"timeSpentInMs":100,"isReady":true,"isDoneDate":"1988-01-01T00:00:00.000Z","launchedBy":"oneUser","map":"[{\\"id\\":\\"measure\\",\\"links\\":[],\\"validity\\":-1,\\"configurationAsJSON\\":\\"{\\\\\\"test\\\\\\":true}\\",\\"values\\":[{\\"cartesianValues\\":[],\\"limitPoints\\":[{\\"lat\\":10,\\"lng\\":11},{\\"lat\\":11,\\"lng\\":11.5}]}]}]"}');
220
+
221
+ });
222
+
223
+ it('should challenge rainComputationMap.setMapData', () => {
224
+
225
+ const cartesianPixelWidthToCompute = new LatLng({lat: 0.012, lng: 0.00876});
226
+
227
+ optionalTrace('build..');
228
+ const rainMeasures = [];
229
+ const mergeLimitPoints: [LatLng, LatLng] = [new LatLng({lat: 1, lng: 2}), new LatLng({lat: 3, lng: 5})];
230
+ for (let valueId = 1; valueId < 5; valueId++) {
231
+ const cartesianValues = [];
232
+ let value = valueId;
233
+ for (let lat = mergeLimitPoints[0].lat; lat <= mergeLimitPoints[1].lat; lat += cartesianPixelWidthToCompute.lat) {
234
+ for (let lng = mergeLimitPoints[0].lng; lng <= mergeLimitPoints[1].lng; lng += cartesianPixelWidthToCompute.lng) {
235
+ cartesianValues.push(new CartesianValue({value: value++, lat, lng}))
236
+ }
237
+ }
238
+
239
+ const rainCartesianMeasureValue = new RainCartesianMeasureValue({
240
+ cartesianValues,
241
+ version: 'test',
242
+ limitPoints: undefined,
243
+ });
244
+ const rainMeasure = new RainMeasure({
245
+ id: 'm_' + valueId,
246
+ values: [rainCartesianMeasureValue],
247
+ configurationAsJSON: '{"test": true}'
248
+ });
249
+
250
+ rainMeasures.push(rainMeasure);
251
+ optionalTrace('rainMeasures pushed', value, 'values');
252
+ }
253
+ optionalTrace('build done');
254
+
255
+ const rainComputationMap = new RainComputationMap({
256
+ id: 'rc1',
257
+ date: new Date('2022-01-01'),
258
+ links: [],
259
+ quality: 1,
260
+ progressIngest: 1,
261
+ progressComputing: 1,
262
+ timeSpentInMs: 100,
263
+ isReady: true,
264
+ isDoneDate: new Date('1988-01-01'),
265
+ map: [rainMeasures[0]],
266
+ launchedBy: 'test',
267
+ version: 'v1',
268
+ });
269
+
270
+ const cartesianTools = new CartesianTools();
271
+ cartesianTools.buildLatLngEarthMap();
272
+
273
+ optionalTrace('setMapData...');
274
+ rainComputationMap.setMapData(rainMeasures, {
275
+ mergeStrategy: MergeStrategy.MAX,
276
+ cartesianTools,
277
+ mergeLimitPoints,
278
+ removeNullValues: true,
279
+ });
280
+
281
+ optionalTrace('setMapData done');
282
+ const mappedRainMeasures = rainComputationMap.getMapData().map(m => new RainMeasure(m as any));
283
+ expect(mappedRainMeasures.length).eq(1);
284
+ const mappedRainCartesianMeasureValues = mappedRainMeasures[0].values.map(m => new RainCartesianMeasureValue(m as any));
285
+ expect(mappedRainCartesianMeasureValues.length).eq(1);
286
+ expect(mappedRainCartesianMeasureValues[0].getCartesianValues().length).eq(50267);
287
+
288
+ });
289
+
290
+ it('should challenge rainComputation merge', () => {
291
+
292
+ const cartesianPixelWidthOfEach = new LatLng({lat: 0.05, lng: 0.05});
293
+ const mergeLimitPoints: [LatLng, LatLng] = [new LatLng({lat: 2, lng: 1}), new LatLng({lat: 3, lng: 2})];
294
+ const limitPointsOfEach: [LatLng, LatLng] = [new LatLng({lat: 1, lng: 1.5}), new LatLng({lat: 2.5, lng: 2})];
295
+ const rainCartesianMeasureValues = [];
296
+ for (let valueId = 1; valueId < 5; valueId++) {
297
+ const cartesianValues = [];
298
+ for (let lat = limitPointsOfEach[0].lat; lat <= limitPointsOfEach[1].lat; lat += cartesianPixelWidthOfEach.lat) {
299
+ for (let lng = limitPointsOfEach[0].lng; lng <= limitPointsOfEach[1].lng; lng += cartesianPixelWidthOfEach.lng) {
300
+ cartesianValues.push(new CartesianValue({lat, lng, value: 1}));
301
+ }
302
+ }
303
+ const rainPolarMeasureValue = new RainCartesianMeasureValue({
304
+ cartesianValues,
305
+ limitPoints: limitPointsOfEach,
306
+ version: 'v'
307
+ });
308
+ rainCartesianMeasureValues.push(rainPolarMeasureValue);
309
+ }
310
+
311
+ const rainComputation = new RainComputation({
312
+ id: 'cartesian1', date: new Date('2022-01-01'), isReady: true,
313
+ results: rainCartesianMeasureValues
314
+ });
315
+
316
+ const cartesianTools = new CartesianTools();
317
+ cartesianTools.buildLatLngEarthMap();
318
+
319
+ const mergedRainCartesianMeasureValues = rainComputation.mergeCartesianResults({
320
+ mergeStrategy: MergeStrategy.SUM,
321
+ cartesianTools,
322
+ mergeLimitPoints,
323
+ removeNullValues: true,
324
+ });
325
+
326
+ expect(mergedRainCartesianMeasureValues.length).eq(1);
327
+ expect(mergedRainCartesianMeasureValues[0].values.length).eq(1);
328
+ const cartesianValuesFound: CartesianValue[] = (mergedRainCartesianMeasureValues[0].values[0] as any).cartesianValues;
329
+ expect(cartesianValuesFound.length).eq(110);
330
+ expect(cartesianValuesFound[0].lat).eq(2);
331
+ expect(cartesianValuesFound[0].lng).eq(1.5);
332
+ });
333
+
334
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ "compilerOptions": {
4
+ "baseUrl": "./"
5
+ },
6
+ "exclude": [
7
+ "../node_modules"
8
+ ],
9
+ "include": [
10
+ "./**/*.spec.ts"
11
+ ]
12
+ }
@@ -1,66 +1,88 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CartesianMeasureValue = void 0;
4
- const CartesianValue_1 = require("./CartesianValue");
5
- const LatLng_1 = require("./LatLng");
6
- class CartesianMeasureValue {
7
- constructor(json) {
8
- var _a;
9
- if (!(json === null || json === void 0 ? void 0 : json.cartesianValues)) {
1
+ import {ICartesianMeasureValue} from './ICartesianMeasureValue';
2
+ import {CartesianValue} from './CartesianValue';
3
+ import {LatLng} from './LatLng';
4
+
5
+ export class CartesianMeasureValue implements ICartesianMeasureValue {
6
+
7
+ protected cartesianValues: CartesianValue[];
8
+ protected limitPoints: [LatLng, LatLng];
9
+
10
+ constructor(json: {
11
+ cartesianValues: string | CartesianValue[],
12
+ limitPoints?: [LatLng, LatLng]
13
+ }
14
+ ) {
15
+
16
+ if (!json?.cartesianValues) {
10
17
  throw new Error('CartesianMeasureValue needs cartesianValues');
11
18
  }
19
+
12
20
  this.setCartesianValuesAsAny(json.cartesianValues);
13
- if (((_a = json.limitPoints) === null || _a === void 0 ? void 0 : _a.length) === 2) {
21
+ if (json.limitPoints?.length === 2) {
14
22
  this.setLimitPoints(json.limitPoints[0], json.limitPoints[1]);
15
23
  }
16
24
  }
17
- static From(obj) {
25
+
26
+ static From(obj: ICartesianMeasureValue | any): CartesianMeasureValue {
18
27
  const created = new CartesianMeasureValue({
19
28
  cartesianValues: [],
20
29
  });
30
+
21
31
  if (typeof obj.cartesianValues !== 'undefined') {
22
32
  created.setCartesianValuesAsAny(obj.cartesianValues);
23
33
  }
34
+
24
35
  if (Array.isArray(obj.limitPoints) && obj.limitPoints.length === 2) {
25
36
  created.setLimitPoints(obj.limitPoints[0], obj.limitPoints[1]);
26
37
  }
38
+
27
39
  return created;
28
40
  }
29
- getCartesianValuesStringified() {
30
- return JSON.stringify({ cartesianValues: this.cartesianValues });
41
+
42
+ getCartesianValuesStringified(): string {
43
+ return JSON.stringify({cartesianValues: this.cartesianValues});
31
44
  }
32
- getCartesianValues() {
45
+
46
+ getCartesianValues(): CartesianValue[] {
33
47
  return this.cartesianValues;
34
48
  }
35
- setCartesianValues(cartesianValues) {
49
+
50
+ setCartesianValues(cartesianValues: CartesianValue[]): void {
36
51
  this.cartesianValues = cartesianValues;
37
52
  }
38
- setCartesianValuesAsString(s) {
53
+
54
+ setCartesianValuesAsString(s: string): void {
39
55
  let values = JSON.parse(s);
40
56
  if (values.cartesianValues) {
41
57
  values = values.cartesianValues;
42
58
  }
59
+
43
60
  if (Array.isArray(values)) {
44
61
  this.cartesianValues = [];
45
62
  values.forEach(v => {
46
- this.cartesianValues.push(new CartesianValue_1.CartesianValue(v));
63
+ this.cartesianValues.push(new CartesianValue(v));
47
64
  });
48
65
  }
49
66
  }
50
- toJSON(options = { stringify: false }) {
51
- let cartesianValues = this.cartesianValues;
67
+
68
+ toJSON(options = {stringify: false}): any {
69
+
70
+ let cartesianValues: any = this.cartesianValues;
52
71
  if (options.stringify) {
53
- cartesianValues = JSON.stringify(this.cartesianValues);
72
+ cartesianValues = JSON.stringify(this.cartesianValues)
54
73
  }
74
+
55
75
  return {
56
76
  cartesianValues,
57
77
  limitPoints: this.getLimitPoints(),
58
78
  };
59
79
  }
60
- toJSONWithCartesianValuesStringified() {
61
- return this.toJSON({ stringify: true });
80
+
81
+ toJSONWithCartesianValuesStringified(): any {
82
+ return this.toJSON({stringify: true});
62
83
  }
63
- getCartesianValue(json) {
84
+
85
+ getCartesianValue(json: { lat: number, lng: number }): CartesianValue {
64
86
  for (const value of this.cartesianValues) {
65
87
  if (value.lat === json.lat && value.lng === json.lng) {
66
88
  return value;
@@ -68,7 +90,12 @@ class CartesianMeasureValue {
68
90
  }
69
91
  return null;
70
92
  }
71
- getCartesianValueRounded(json) {
93
+
94
+ getCartesianValueRounded(json: {
95
+ lat: number,
96
+ lng: number,
97
+ scale: LatLng
98
+ }): CartesianValue {
72
99
  for (const value of this.cartesianValues) {
73
100
  const latRounded1 = Math.round(json.lat / json.scale.lat) * json.scale.lat;
74
101
  const lngRounded1 = Math.round(json.lng / json.scale.lng) * json.scale.lng;
@@ -80,35 +107,40 @@ class CartesianMeasureValue {
80
107
  }
81
108
  return null;
82
109
  }
83
- setCartesianValue(json) {
84
- this.cartesianValues.push(new CartesianValue_1.CartesianValue(json));
110
+
111
+ setCartesianValue(json: { lat: number, lng: number, value: number }): void {
112
+ this.cartesianValues.push(new CartesianValue(json));
85
113
  }
86
- getLimitPoints(options = { forceCompute: false }) {
114
+
115
+ getLimitPoints(options = {forceCompute: false}): [LatLng, LatLng] {
87
116
  if (options.forceCompute || !this.limitPoints || this.limitPoints.length !== 2) {
88
117
  this.computeLimits();
89
118
  }
90
119
  return this.limitPoints;
91
120
  }
92
- setLimitPoints(point1, point2) {
121
+
122
+ setLimitPoints(point1: LatLng, point2: LatLng) {
93
123
  this.limitPoints = [
94
- new LatLng_1.LatLng({ lat: point1.lat, lng: point1.lng }),
95
- new LatLng_1.LatLng({ lat: point2.lat, lng: point2.lng })
124
+ new LatLng({lat: point1.lat, lng: point1.lng}),
125
+ new LatLng({lat: point2.lat, lng: point2.lng})
96
126
  ];
97
127
  }
98
- setCartesianValuesAsAny(cartesianValues) {
128
+
129
+ protected setCartesianValuesAsAny(cartesianValues: any) {
99
130
  if (typeof cartesianValues === 'string') {
100
131
  this.setCartesianValuesAsString(cartesianValues);
101
- }
102
- else {
132
+ } else {
103
133
  this.setCartesianValues(cartesianValues);
104
134
  }
105
135
  }
106
- computeLimits() {
136
+
137
+ protected computeLimits() {
107
138
  this.limitPoints = undefined;
108
- let p1Lat;
109
- let p1Lng;
110
- let p2Lat;
111
- let p2Lng;
139
+ let p1Lat: number;
140
+ let p1Lng: number;
141
+ let p2Lat: number;
142
+ let p2Lng: number;
143
+
112
144
  for (const cartesianValue of this.cartesianValues) {
113
145
  if (typeof p1Lat === 'undefined' || cartesianValue.lat < p1Lat) {
114
146
  p1Lat = cartesianValue.lat;
@@ -123,11 +155,11 @@ class CartesianMeasureValue {
123
155
  p2Lng = cartesianValue.lng;
124
156
  }
125
157
  }
158
+
126
159
  if (typeof p1Lat !== 'undefined' && typeof p1Lng !== 'undefined' &&
127
160
  typeof p2Lat !== 'undefined' && typeof p2Lng !== 'undefined') {
128
- this.setLimitPoints(new LatLng_1.LatLng({ lat: p1Lat, lng: p1Lng }), new LatLng_1.LatLng({ lat: p2Lat, lng: p2Lng }));
161
+ this.setLimitPoints(new LatLng({lat: p1Lat, lng: p1Lng}),
162
+ new LatLng({lat: p2Lat, lng: p2Lng}));
129
163
  }
130
164
  }
131
165
  }
132
- exports.CartesianMeasureValue = CartesianMeasureValue;
133
- //# sourceMappingURL=CartesianMeasureValue.js.map