feat: add AMSC runway observations

This commit is contained in:
2569718930@qq.com
2026-05-15 01:41:49 +08:00
parent c4b1844a67
commit 4cc579ccb3
15 changed files with 823 additions and 14 deletions
+7
View File
@@ -958,6 +958,12 @@ export interface AmosData {
runway_obs?: {
runway_pairs?: Array<[string, string]> | null;
temperatures?: Array<[number | null, number | null]> | null;
point_temperatures?: Array<{
runway?: string | null;
tdz_temp?: number | null;
mid_temp?: number | null;
end_temp?: number | null;
}> | null;
pressures_hpa?: Array<number | null> | null;
wind_directions?: Array<[number, number, number] | null> | null;
wind_speeds?: Array<[number, number, number] | null> | null;
@@ -967,6 +973,7 @@ export interface AmosData {
observation_source?: string | null;
observation_source_zh?: string | null;
observation_time?: string | null;
observation_time_local?: string | null;
}
export interface HistoryPoint {
+18 -4
View File
@@ -31,6 +31,15 @@ const DEFAULT_SOURCE_PROFILE: SourceProfile = {
};
const SOURCE_PROFILES: Record<string, SourceProfile> = {
amsc_awos: {
code: "amsc_awos",
label: "AMSC AWOS",
nativeUpdateIntervalSec: 60,
freshWindowSec: 180,
expectedGraceSec: 180,
staleAfterSec: 900,
pollIntervalSec: 60,
},
amos: {
code: "amos",
label: "AMOS",
@@ -111,6 +120,7 @@ const SOURCE_PROFILES: Record<string, SourceProfile> = {
function canonicalSourceCode(value?: string | null) {
const code = normalizeObservationSourceCode(value || "metar");
if (!code) return "metar";
if (code.includes("amsc")) return "amsc_awos";
if (code.includes("amos")) return "amos";
if (code.includes("jma")) return "jma";
if (code.includes("fmi")) return "fmi";
@@ -207,12 +217,16 @@ export function getObservationFreshness(detail?: CityDetail | null) {
const hasAmosRunway =
(detail.amos?.runway_obs?.temperatures?.length || 0) > 0 ||
(detail.amos?.runway_temps?.length || 0) > 0;
if (hasAmosRunway || detail.amos?.source === "amos") {
if (hasAmosRunway || detail.amos?.source === "amos" || detail.amos?.source === "amsc_awos") {
return buildObservationFreshness({
observedAt: detail.amos?.observation_time || null,
observedAtLocal: detail.airport_current?.obs_time || detail.current?.obs_time || null,
sourceCode: "amos",
sourceLabel: detail.amos?.source_label || "AMOS",
observedAtLocal:
detail.amos?.observation_time_local ||
detail.airport_current?.obs_time ||
detail.current?.obs_time ||
null,
sourceCode: detail.amos?.source || "amos",
sourceLabel: detail.amos?.source_label || (detail.amos?.source === "amsc_awos" ? "AMSC AWOS" : "AMOS"),
});
}
const currentSource = canonicalSourceCode(