@aeroswarm/weather 0.1.4 → 0.1.5
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/dist/grid.d.ts +12 -0
- package/dist/grid.d.ts.map +1 -1
- package/dist/index.js +81 -17
- package/dist/store.d.ts +21 -1
- package/dist/store.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/grid.d.ts
CHANGED
|
@@ -69,6 +69,18 @@ export declare function sampleWind(grid: WindGrid, lon: number, lat: number): {
|
|
|
69
69
|
u: number;
|
|
70
70
|
v: number;
|
|
71
71
|
} | null;
|
|
72
|
+
export interface NudgeOptions {
|
|
73
|
+
/** Jarak pengaruh sebuah stasiun (km). Di luar jarak ini grid tidak berubah. Bawaan 80. */
|
|
74
|
+
radiusKm?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Sesuaikan grid model dengan pengamatan di stasiun: di dekat stasiun nilai grid ditarik ke nilai
|
|
78
|
+
* pengamatan (persis di stasiun), makin jauh makin kecil, dan di luar `radiusKm` tidak berubah. Stasiun
|
|
79
|
+
* di luar grid atau di sel tanpa data dilewati.
|
|
80
|
+
*/
|
|
81
|
+
export declare function nudgeScalar(grid: ScalarGrid, points: readonly StationValue[], options?: NudgeOptions): ScalarGrid;
|
|
82
|
+
/** Sesuaikan grid angin model dengan angin di stasiun (pada komponen u dan v). */
|
|
83
|
+
export declare function nudgeWind(grid: WindGrid, stations: readonly StationWind[], options?: NudgeOptions): WindGrid;
|
|
72
84
|
/** Campur dua grid angin yang bentuknya sama (mis. dua jam prakiraan), `t` 0-1. */
|
|
73
85
|
export declare function blendWindGrids(a: WindGrid, b: WindGrid, t: number): WindGrid;
|
|
74
86
|
/**
|
package/dist/grid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../src/grid.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../src/grid.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -643,6 +643,52 @@ function sampleWind(grid, lon, lat) {
|
|
|
643
643
|
const v = bilinear(grid.v, grid.bounds, grid.nx, grid.ny, lon, lat);
|
|
644
644
|
return u === null || v === null ? null : { u, v };
|
|
645
645
|
}
|
|
646
|
+
var influence = (distance, radius) => distance >= radius ? 0 : (radius * radius - distance * distance) / (radius * radius + distance * distance);
|
|
647
|
+
function nudgeValues(values, bounds, nx, ny, deltas, radius) {
|
|
648
|
+
const out = Float32Array.from(values);
|
|
649
|
+
if (deltas.length === 0) return out;
|
|
650
|
+
for (let row = 0; row < ny; row++) {
|
|
651
|
+
for (let col = 0; col < nx; col++) {
|
|
652
|
+
const index = row * nx + col;
|
|
653
|
+
if (Number.isNaN(out[index])) continue;
|
|
654
|
+
const cell = pointOf(bounds, nx, ny, col, row);
|
|
655
|
+
let weights = 0;
|
|
656
|
+
let weighted = 0;
|
|
657
|
+
for (const d of deltas) {
|
|
658
|
+
const w = influence(distanceKm(cell, d), radius);
|
|
659
|
+
weights += w;
|
|
660
|
+
weighted += w * d.delta;
|
|
661
|
+
}
|
|
662
|
+
if (weights > 0) out[index] = out[index] + weighted / weights * Math.min(1, weights);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return out;
|
|
666
|
+
}
|
|
667
|
+
function nudgeScalar(grid, points, options = {}) {
|
|
668
|
+
const deltas = [];
|
|
669
|
+
for (const p of points) {
|
|
670
|
+
const model = sampleScalar(grid, p.lon, p.lat);
|
|
671
|
+
if (model !== null) deltas.push({ lat: p.lat, lon: p.lon, delta: p.value - model });
|
|
672
|
+
}
|
|
673
|
+
return { ...grid, values: nudgeValues(grid.values, grid.bounds, grid.nx, grid.ny, deltas, options.radiusKm ?? 80) };
|
|
674
|
+
}
|
|
675
|
+
function nudgeWind(grid, stations, options = {}) {
|
|
676
|
+
const du = [];
|
|
677
|
+
const dv = [];
|
|
678
|
+
for (const s of stations) {
|
|
679
|
+
const model = sampleWind(grid, s.lon, s.lat);
|
|
680
|
+
if (!model) continue;
|
|
681
|
+
const obs = s.directionDeg === null ? { u: 0, v: 0 } : uvFromSpeedDirection(s.speedKt * KT_TO_MS, s.directionDeg);
|
|
682
|
+
du.push({ lat: s.lat, lon: s.lon, delta: obs.u - model.u });
|
|
683
|
+
dv.push({ lat: s.lat, lon: s.lon, delta: obs.v - model.v });
|
|
684
|
+
}
|
|
685
|
+
const radius = options.radiusKm ?? 80;
|
|
686
|
+
return {
|
|
687
|
+
...grid,
|
|
688
|
+
u: nudgeValues(grid.u, grid.bounds, grid.nx, grid.ny, du, radius),
|
|
689
|
+
v: nudgeValues(grid.v, grid.bounds, grid.nx, grid.ny, dv, radius)
|
|
690
|
+
};
|
|
691
|
+
}
|
|
646
692
|
function blendWindGrids(a, b, t) {
|
|
647
693
|
if (a.nx !== b.nx || a.ny !== b.ny) throw new Error("Grid angin harus berukuran sama");
|
|
648
694
|
const mix = (x, y) => Float32Array.from(x, (value, i) => value + (y[i] - value) * t);
|
|
@@ -1099,24 +1145,48 @@ var WeatherStore = class {
|
|
|
1099
1145
|
* koordinat, diinterpolasi ke grid. Mengembalikan null bila tidak ada stasiun yang bisa dipakai.
|
|
1100
1146
|
*/
|
|
1101
1147
|
fieldsAt(at, grid, options = {}) {
|
|
1148
|
+
const points = this.pointsAt(at, options);
|
|
1149
|
+
if (points.stations.length === 0) return null;
|
|
1150
|
+
return {
|
|
1151
|
+
at,
|
|
1152
|
+
stations: points.stations,
|
|
1153
|
+
wind: windGridFromStations(points.winds, grid),
|
|
1154
|
+
cloud: interpolateScalar(points.clouds, grid),
|
|
1155
|
+
rain: interpolateScalar(points.rains, grid),
|
|
1156
|
+
temperature: points.temperatures.length > 0 ? interpolateScalar(points.temperatures, grid) : null
|
|
1157
|
+
};
|
|
1158
|
+
}
|
|
1159
|
+
/**
|
|
1160
|
+
* Gabungkan medan model dengan laporan: grid model disesuaikan ke pengamatan (METAR/SPECI) atau
|
|
1161
|
+
* prakiraan (TAF) di stasiun yang punya koordinat, dalam jarak `radiusKm` dari tiap stasiun. Tanpa
|
|
1162
|
+
* stasiun yang bisa dipakai, medan model dikembalikan apa adanya.
|
|
1163
|
+
*/
|
|
1164
|
+
blendInto(model, modelName, at, options = {}) {
|
|
1165
|
+
const points = this.pointsAt(at, options);
|
|
1166
|
+
return {
|
|
1167
|
+
at,
|
|
1168
|
+
stations: [modelName, ...points.stations],
|
|
1169
|
+
wind: model.wind ? nudgeWind(model.wind, points.winds, options) : null,
|
|
1170
|
+
cloud: model.cloud ? nudgeScalar(model.cloud, points.clouds, options) : null,
|
|
1171
|
+
rain: model.rain ? nudgeScalar(model.rain, points.rains, options) : null,
|
|
1172
|
+
temperature: model.temperature ? nudgeScalar(model.temperature, points.temperatures, options) : null
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
/** Nilai tiap stasiun yang punya koordinat dan data pada waktu `at`. */
|
|
1176
|
+
pointsAt(at, options) {
|
|
1102
1177
|
const winds = [];
|
|
1103
1178
|
const clouds = [];
|
|
1104
1179
|
const rains = [];
|
|
1105
1180
|
const temperatures = [];
|
|
1106
|
-
const
|
|
1181
|
+
const stations = [];
|
|
1107
1182
|
for (const station of this.stations()) {
|
|
1108
1183
|
const place = this.locate(station);
|
|
1109
1184
|
if (!place) continue;
|
|
1110
1185
|
const snapshot = this.snapshotAt(station, at, options);
|
|
1111
1186
|
if (!snapshot) continue;
|
|
1112
|
-
|
|
1187
|
+
stations.push(station);
|
|
1113
1188
|
const { state } = snapshot;
|
|
1114
|
-
winds.push({
|
|
1115
|
-
lat: place.lat,
|
|
1116
|
-
lon: place.lon,
|
|
1117
|
-
speedKt: state.wind.speedKt,
|
|
1118
|
-
directionDeg: state.wind.fromDeg
|
|
1119
|
-
});
|
|
1189
|
+
winds.push({ lat: place.lat, lon: place.lon, speedKt: state.wind.speedKt, directionDeg: state.wind.fromDeg });
|
|
1120
1190
|
clouds.push({ lat: place.lat, lon: place.lon, value: state.clouds.total * 100 });
|
|
1121
1191
|
rains.push({
|
|
1122
1192
|
lat: place.lat,
|
|
@@ -1128,15 +1198,7 @@ var WeatherStore = class {
|
|
|
1128
1198
|
temperatures.push({ lat: place.lat, lon: place.lon, value: observed.temperatureC });
|
|
1129
1199
|
}
|
|
1130
1200
|
}
|
|
1131
|
-
|
|
1132
|
-
return {
|
|
1133
|
-
at,
|
|
1134
|
-
stations: used,
|
|
1135
|
-
wind: windGridFromStations(winds, grid),
|
|
1136
|
-
cloud: interpolateScalar(clouds, grid),
|
|
1137
|
-
rain: interpolateScalar(rains, grid),
|
|
1138
|
-
temperature: temperatures.length > 0 ? interpolateScalar(temperatures, grid) : null
|
|
1139
|
-
};
|
|
1201
|
+
return { stations, winds, clouds, rains, temperatures };
|
|
1140
1202
|
}
|
|
1141
1203
|
// ---- internal -------------------------------------------------------------
|
|
1142
1204
|
changed() {
|
|
@@ -1214,6 +1276,8 @@ export {
|
|
|
1214
1276
|
interpolateScalar,
|
|
1215
1277
|
latticePoints,
|
|
1216
1278
|
mergeConditions,
|
|
1279
|
+
nudgeScalar,
|
|
1280
|
+
nudgeWind,
|
|
1217
1281
|
parseConditionTokens,
|
|
1218
1282
|
parseGrib2Json,
|
|
1219
1283
|
parseGridJson,
|
package/dist/store.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type AnimationSnapshot } from "./animation.js";
|
|
2
|
-
import { type GeoPoint, type GridBounds, type ScalarGrid, type WindGrid } from "./grid.js";
|
|
2
|
+
import { type GeoPoint, type GridBounds, type NudgeOptions, type ScalarGrid, type WindGrid } from "./grid.js";
|
|
3
3
|
import type { TafChange } from "./types.js";
|
|
4
4
|
export type Locate = (icao: string) => GeoPoint | undefined;
|
|
5
5
|
export interface IngestOptions {
|
|
@@ -41,6 +41,16 @@ export interface WeatherFields {
|
|
|
41
41
|
/** Suhu (°C); null bila tidak ada pengamatan bersuhu. */
|
|
42
42
|
temperature: ScalarGrid | null;
|
|
43
43
|
}
|
|
44
|
+
/** Medan dengan besaran yang boleh tidak ada (mis. seri model tanpa data suhu). */
|
|
45
|
+
export interface FieldSet {
|
|
46
|
+
at: Date;
|
|
47
|
+
/** Sumber yang dipakai: stasiun, atau nama model diikuti stasiun yang menyesuaikannya. */
|
|
48
|
+
stations: string[];
|
|
49
|
+
wind: WindGrid | null;
|
|
50
|
+
cloud: ScalarGrid | null;
|
|
51
|
+
rain: ScalarGrid | null;
|
|
52
|
+
temperature: ScalarGrid | null;
|
|
53
|
+
}
|
|
44
54
|
export interface FieldGridOptions {
|
|
45
55
|
bounds: GridBounds;
|
|
46
56
|
nx: number;
|
|
@@ -82,6 +92,16 @@ export declare class WeatherStore {
|
|
|
82
92
|
fieldsAt(at: Date, grid: FieldGridOptions, options?: {
|
|
83
93
|
includeProbable?: boolean;
|
|
84
94
|
}): WeatherFields | null;
|
|
95
|
+
/**
|
|
96
|
+
* Gabungkan medan model dengan laporan: grid model disesuaikan ke pengamatan (METAR/SPECI) atau
|
|
97
|
+
* prakiraan (TAF) di stasiun yang punya koordinat, dalam jarak `radiusKm` dari tiap stasiun. Tanpa
|
|
98
|
+
* stasiun yang bisa dipakai, medan model dikembalikan apa adanya.
|
|
99
|
+
*/
|
|
100
|
+
blendInto(model: Omit<FieldSet, "stations" | "at">, modelName: string, at: Date, options?: NudgeOptions & {
|
|
101
|
+
includeProbable?: boolean;
|
|
102
|
+
}): FieldSet;
|
|
103
|
+
/** Nilai tiap stasiun yang punya koordinat dan data pada waktu `at`. */
|
|
104
|
+
private pointsAt;
|
|
85
105
|
private changed;
|
|
86
106
|
private add;
|
|
87
107
|
private latest;
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,iBAAiB,EAAqB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,UAAU,EAEf,KAAK,YAAY,EAGjB,KAAK,UAAU,EAGf,KAAK,QAAQ,EAEd,MAAM,WAAW,CAAC;AAGnB,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,IAAI,CAAC;IACT,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,oEAAoE;IACpE,IAAI,EAAE,UAAU,CAAC;IACjB,yDAAyD;IACzD,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED,mFAAmF;AACnF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAiBD;;;GAGG;AACH,qBAAa,YAAY;IAOX,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,iEAAiE;IACjE,OAAO,SAAK;gBAEiB,MAAM,EAAE,MAAM;IAE3C,2FAA2F;IAC3F,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAiClE,oEAAoE;IACpE,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAanC,8CAA8C;IAC9C,KAAK,IAAI,IAAI;IAMb,SAAS,IAAI,OAAO;IAOpB,QAAQ,IAAI,MAAM,EAAE;IAMpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK1C,oEAAoE;IACpE,UAAU,CACR,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,IAAI,EACR,OAAO,GAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GACxE,iBAAiB,GAAG,IAAI;IAU3B,0FAA0F;IAC1F,QAAQ,IAAI,QAAQ,GAAG,IAAI;IAkC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,aAAa,GAAG,IAAI;IAa7G;;;;OAIG;IACH,SAAS,CACP,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,IAAI,EACR,OAAO,GAAE,YAAY,GAAG;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GACzD,QAAQ;IAYX,wEAAwE;IACxE,OAAO,CAAC,QAAQ;IA+BhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,GAAG;IAkBX,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,YAAY;CASrB"}
|