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.
- package/.cursorignore +10 -0
- package/.github/workflows/ci.yml +29 -0
- package/CHANGELOG.md +166 -0
- package/LICENSE +21 -0
- package/README.md +5 -3
- package/RELEASE_PROCESS.md +111 -0
- package/package.json +1 -1
- package/specs/REQUIREMENTS.md +42 -0
- package/specs/TECHNICAL.md +57 -0
- package/specs/cartesian/Cartesian.spec.ts +82 -0
- package/specs/cartesian/CartesianTools.spec.ts +121 -0
- package/specs/gauge/Gauge.spec.ts +39 -0
- package/specs/organization/Organization.spec.ts +38 -0
- package/specs/polar/Polar.spec.ts +267 -0
- package/specs/quality/Position.spec.ts +18 -0
- package/specs/quality/QualityPointEdgeCases.spec.ts +215 -0
- package/specs/quality/QualityTools.spec.ts +67 -0
- package/specs/quality/SpeedMatrix.spec.ts +214 -0
- package/specs/radar/Radar.spec.ts +129 -0
- package/specs/rain/Rain.spec.ts +334 -0
- package/specs/tsconfig.json +12 -0
- package/{cartesian/CartesianMeasureValue.js → src/cartesian/CartesianMeasureValue.ts} +73 -41
- package/{cartesian/CartesianTools.js → src/cartesian/CartesianTools.ts} +130 -69
- package/src/cartesian/CartesianValue.ts +26 -0
- package/src/cartesian/EarthMap.ts +5 -0
- package/src/cartesian/ICartesianMeasureValue.ts +22 -0
- package/src/cartesian/LatLng.ts +43 -0
- package/src/cartesian/RadarCartesianMeasureValue.ts +32 -0
- package/src/cartesian/RainCartesianMeasureValue.ts +32 -0
- package/src/gauge/GaugeMeasure.ts +42 -0
- package/{gauge/GaugeNode.js → src/gauge/GaugeNode.ts} +48 -20
- package/src/gauge/GaugeNodeMap.ts +55 -0
- package/src/organization/EventNode.ts +43 -0
- package/{organization/Link.js → src/organization/Link.ts} +15 -15
- package/src/organization/Measure.ts +61 -0
- package/{organization/PeopleNode.js → src/organization/PeopleNode.ts} +20 -10
- package/{organization/RaainNode.js → src/organization/RaainNode.ts} +91 -58
- package/{organization/TeamNode.js → src/organization/TeamNode.ts} +36 -13
- package/{polar/AbstractPolarMeasureValue.js → src/polar/AbstractPolarMeasureValue.ts} +58 -32
- package/src/polar/IPolarMeasureValue.ts +21 -0
- package/{polar/MeasureValuePolarContainer.js → src/polar/MeasureValuePolarContainer.ts} +29 -13
- package/src/polar/PolarFilter.ts +46 -0
- package/{polar/PolarMeasureValue.js → src/polar/PolarMeasureValue.ts} +125 -62
- package/{polar/PolarMeasureValueMap.js → src/polar/PolarMeasureValueMap.ts} +165 -88
- package/src/polar/PolarValue.ts +16 -0
- package/{polar/RadarPolarMeasureValue.js → src/polar/RadarPolarMeasureValue.ts} +34 -21
- package/src/polar/RainPolarMeasureValue.ts +57 -0
- package/{quality/QualityPoint.js → src/quality/QualityPoint.ts} +62 -34
- package/{quality/SpeedMatrix.js → src/quality/SpeedMatrix.ts} +117 -76
- package/{quality/SpeedMatrixContainer.js → src/quality/SpeedMatrixContainer.ts} +210 -103
- package/src/quality/history/CartesianGaugeHistory.ts +23 -0
- package/src/quality/history/CartesianRainHistory.ts +15 -0
- package/src/quality/history/PositionHistory.ts +31 -0
- package/{quality/index.d.ts → src/quality/index.ts} +3 -0
- package/src/quality/position/Position.ts +59 -0
- package/src/quality/position/PositionValue.ts +15 -0
- package/{quality/tools/QualityTools.js → src/quality/tools/QualityTools.ts} +18 -17
- package/src/radar/RadarMeasure.ts +41 -0
- package/{radar/RadarNode.js → src/radar/RadarNode.ts} +41 -19
- package/src/radar/RadarNodeMap.ts +61 -0
- package/src/rain/MergeStrategy.ts +15 -0
- package/src/rain/RainComputation.ts +96 -0
- package/{rain/RainComputationAbstract.js → src/rain/RainComputationAbstract.ts} +135 -69
- package/{rain/RainComputationMap.js → src/rain/RainComputationMap.ts} +55 -22
- package/{rain/RainComputationQuality.js → src/rain/RainComputationQuality.ts} +82 -44
- package/src/rain/RainMeasure.ts +25 -0
- package/{rain/RainNode.js → src/rain/RainNode.ts} +117 -72
- package/tsconfig.json +17 -0
- package/tslint.json +79 -0
- package/typedoc.json +31 -0
- package/cartesian/CartesianMeasureValue.d.ts +0 -40
- package/cartesian/CartesianMeasureValue.js.map +0 -1
- package/cartesian/CartesianTools.d.ts +0 -32
- package/cartesian/CartesianTools.js.map +0 -1
- package/cartesian/CartesianValue.d.ts +0 -14
- package/cartesian/CartesianValue.js +0 -17
- package/cartesian/CartesianValue.js.map +0 -1
- package/cartesian/EarthMap.d.ts +0 -5
- package/cartesian/EarthMap.js +0 -3
- package/cartesian/EarthMap.js.map +0 -1
- package/cartesian/ICartesianMeasureValue.d.ts +0 -23
- package/cartesian/ICartesianMeasureValue.js +0 -3
- package/cartesian/ICartesianMeasureValue.js.map +0 -1
- package/cartesian/LatLng.d.ts +0 -16
- package/cartesian/LatLng.js +0 -34
- package/cartesian/LatLng.js.map +0 -1
- package/cartesian/RadarCartesianMeasureValue.d.ts +0 -17
- package/cartesian/RadarCartesianMeasureValue.js +0 -22
- package/cartesian/RadarCartesianMeasureValue.js.map +0 -1
- package/cartesian/RainCartesianMeasureValue.d.ts +0 -17
- package/cartesian/RainCartesianMeasureValue.js +0 -23
- package/cartesian/RainCartesianMeasureValue.js.map +0 -1
- package/cartesian/index.js +0 -25
- package/cartesian/index.js.map +0 -1
- package/gauge/GaugeMeasure.d.ts +0 -20
- package/gauge/GaugeMeasure.js +0 -30
- package/gauge/GaugeMeasure.js.map +0 -1
- package/gauge/GaugeNode.d.ts +0 -85
- package/gauge/GaugeNode.js.map +0 -1
- package/gauge/GaugeNodeMap.d.ts +0 -24
- package/gauge/GaugeNodeMap.js +0 -40
- package/gauge/GaugeNodeMap.js.map +0 -1
- package/gauge/index.js +0 -20
- package/gauge/index.js.map +0 -1
- package/index.js +0 -24
- package/index.js.map +0 -1
- package/organization/EventNode.d.ts +0 -22
- package/organization/EventNode.js +0 -30
- package/organization/EventNode.js.map +0 -1
- package/organization/IVersion.js +0 -3
- package/organization/IVersion.js.map +0 -1
- package/organization/Link.d.ts +0 -16
- package/organization/Link.js.map +0 -1
- package/organization/Measure.d.ts +0 -22
- package/organization/Measure.js +0 -45
- package/organization/Measure.js.map +0 -1
- package/organization/PeopleNode.d.ts +0 -18
- package/organization/PeopleNode.js.map +0 -1
- package/organization/RaainNode.d.ts +0 -96
- package/organization/RaainNode.js.map +0 -1
- package/organization/TeamNode.d.ts +0 -63
- package/organization/TeamNode.js.map +0 -1
- package/organization/index.js +0 -24
- package/organization/index.js.map +0 -1
- package/polar/AbstractPolarMeasureValue.d.ts +0 -29
- package/polar/AbstractPolarMeasureValue.js.map +0 -1
- package/polar/IPolarMeasureValue.d.ts +0 -19
- package/polar/IPolarMeasureValue.js +0 -3
- package/polar/IPolarMeasureValue.js.map +0 -1
- package/polar/MeasureValuePolarContainer.d.ts +0 -19
- package/polar/MeasureValuePolarContainer.js.map +0 -1
- package/polar/PolarFilter.d.ts +0 -16
- package/polar/PolarFilter.js +0 -45
- package/polar/PolarFilter.js.map +0 -1
- package/polar/PolarMeasureValue.d.ts +0 -51
- package/polar/PolarMeasureValue.js.map +0 -1
- package/polar/PolarMeasureValueMap.d.ts +0 -45
- package/polar/PolarMeasureValueMap.js.map +0 -1
- package/polar/PolarValue.d.ts +0 -10
- package/polar/PolarValue.js +0 -12
- package/polar/PolarValue.js.map +0 -1
- package/polar/RadarPolarMeasureValue.d.ts +0 -27
- package/polar/RadarPolarMeasureValue.js.map +0 -1
- package/polar/RainPolarMeasureValue.d.ts +0 -20
- package/polar/RainPolarMeasureValue.js +0 -42
- package/polar/RainPolarMeasureValue.js.map +0 -1
- package/polar/index.js +0 -25
- package/polar/index.js.map +0 -1
- package/quality/QualityPoint.d.ts +0 -37
- package/quality/QualityPoint.js.map +0 -1
- package/quality/SpeedMatrix.d.ts +0 -83
- package/quality/SpeedMatrix.js.map +0 -1
- package/quality/SpeedMatrixContainer.d.ts +0 -102
- package/quality/SpeedMatrixContainer.js.map +0 -1
- package/quality/history/CartesianGaugeHistory.d.ts +0 -15
- package/quality/history/CartesianGaugeHistory.js +0 -14
- package/quality/history/CartesianGaugeHistory.js.map +0 -1
- package/quality/history/CartesianRainHistory.d.ts +0 -9
- package/quality/history/CartesianRainHistory.js +0 -11
- package/quality/history/CartesianRainHistory.js.map +0 -1
- package/quality/history/PositionHistory.d.ts +0 -20
- package/quality/history/PositionHistory.js +0 -17
- package/quality/history/PositionHistory.js.map +0 -1
- package/quality/index.js +0 -26
- package/quality/index.js.map +0 -1
- package/quality/position/Position.d.ts +0 -22
- package/quality/position/Position.js +0 -50
- package/quality/position/Position.js.map +0 -1
- package/quality/position/PositionValue.d.ts +0 -9
- package/quality/position/PositionValue.js +0 -12
- package/quality/position/PositionValue.js.map +0 -1
- package/quality/tools/QualityTools.d.ts +0 -9
- package/quality/tools/QualityTools.js.map +0 -1
- package/radar/RadarMeasure.d.ts +0 -19
- package/radar/RadarMeasure.js +0 -30
- package/radar/RadarMeasure.js.map +0 -1
- package/radar/RadarNode.d.ts +0 -30
- package/radar/RadarNode.js.map +0 -1
- package/radar/RadarNodeMap.d.ts +0 -26
- package/radar/RadarNodeMap.js +0 -44
- package/radar/RadarNodeMap.js.map +0 -1
- package/radar/index.js +0 -20
- package/radar/index.js.map +0 -1
- package/rain/MergeStrategy.d.ts +0 -13
- package/rain/MergeStrategy.js +0 -11
- package/rain/MergeStrategy.js.map +0 -1
- package/rain/RainComputation.d.ts +0 -42
- package/rain/RainComputation.js +0 -65
- package/rain/RainComputation.js.map +0 -1
- package/rain/RainComputationAbstract.d.ts +0 -73
- package/rain/RainComputationAbstract.js.map +0 -1
- package/rain/RainComputationMap.d.ts +0 -97
- package/rain/RainComputationMap.js.map +0 -1
- package/rain/RainComputationQuality.d.ts +0 -40
- package/rain/RainComputationQuality.js.map +0 -1
- package/rain/RainMeasure.d.ts +0 -17
- package/rain/RainMeasure.js +0 -18
- package/rain/RainMeasure.js.map +0 -1
- package/rain/RainNode.d.ts +0 -46
- package/rain/RainNode.js.map +0 -1
- package/rain/index.js +0 -23
- package/rain/index.js.map +0 -1
- /package/{cartesian/index.d.ts → src/cartesian/index.ts} +0 -0
- /package/{gauge/index.d.ts → src/gauge/index.ts} +0 -0
- /package/{index.d.ts → src/index.ts} +0 -0
- /package/{organization/IVersion.d.ts → src/organization/IVersion.ts} +0 -0
- /package/{organization/index.d.ts → src/organization/index.ts} +0 -0
- /package/{polar/index.d.ts → src/polar/index.ts} +0 -0
- /package/{radar/index.d.ts → src/radar/index.ts} +0 -0
- /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
|
+
});
|
|
@@ -1,66 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 (
|
|
21
|
+
if (json.limitPoints?.length === 2) {
|
|
14
22
|
this.setLimitPoints(json.limitPoints[0], json.limitPoints[1]);
|
|
15
23
|
}
|
|
16
24
|
}
|
|
17
|
-
|
|
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
|
-
|
|
30
|
-
|
|
41
|
+
|
|
42
|
+
getCartesianValuesStringified(): string {
|
|
43
|
+
return JSON.stringify({cartesianValues: this.cartesianValues});
|
|
31
44
|
}
|
|
32
|
-
|
|
45
|
+
|
|
46
|
+
getCartesianValues(): CartesianValue[] {
|
|
33
47
|
return this.cartesianValues;
|
|
34
48
|
}
|
|
35
|
-
|
|
49
|
+
|
|
50
|
+
setCartesianValues(cartesianValues: CartesianValue[]): void {
|
|
36
51
|
this.cartesianValues = cartesianValues;
|
|
37
52
|
}
|
|
38
|
-
|
|
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
|
|
63
|
+
this.cartesianValues.push(new CartesianValue(v));
|
|
47
64
|
});
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
61
|
-
|
|
80
|
+
|
|
81
|
+
toJSONWithCartesianValuesStringified(): any {
|
|
82
|
+
return this.toJSON({stringify: true});
|
|
62
83
|
}
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
110
|
+
|
|
111
|
+
setCartesianValue(json: { lat: number, lng: number, value: number }): void {
|
|
112
|
+
this.cartesianValues.push(new CartesianValue(json));
|
|
85
113
|
}
|
|
86
|
-
|
|
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
|
-
|
|
121
|
+
|
|
122
|
+
setLimitPoints(point1: LatLng, point2: LatLng) {
|
|
93
123
|
this.limitPoints = [
|
|
94
|
-
new
|
|
95
|
-
new
|
|
124
|
+
new LatLng({lat: point1.lat, lng: point1.lng}),
|
|
125
|
+
new LatLng({lat: point2.lat, lng: point2.lng})
|
|
96
126
|
];
|
|
97
127
|
}
|
|
98
|
-
|
|
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
|
-
|
|
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
|
|
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
|