跳转至

机场天气

基于国内民航机场的气象观测体系建立的数据查询接口。

METAR 查询

概览

项目 内容
方法 GET
路径 https://standard.data-api.skyviewor.host/v1/metar/observation
定价 每次成功调用(HTTP 200)扣 10 资源点

请求参数

参数 类型 必填 默认值 说明
stations string 逗号分隔 ICAO 代码,最多 5 个,如 ZBAA,ZSSS
start_time string 开始时间 ISO 8601 格式,如 2024-01-01T00:00:00Z
end_time string 结束时间 ISO 8601 格式
elements string 全部要素 气象要素,逗号分隔;不传则返回全部解析要素
include_speci bool true 是否包含 SPECI 特殊天气报
include_auto bool true 是否包含 AUTO 自动报
corrected_select_strategy string corrected_only 报文修正选择策略:corrected_onlyboth

查询限制

单次最多查询 5 个机场start_timeend_time 的时间跨度不能超过 10 天。超出限制均返回 40000 错误,不计费。

响应示例

{
  "code": 0,
  "message": "ok",
  "data": {
    "stations": ["ZBAA"],
    "start_time": "2026-06-30T05:00:00Z",
    "end_time": "2026-07-01T06:00:00Z",
    "count": 1,
    "records": [
      {
        "icao_code": "ZBAA",
        "observation_time": "2026-06-30T05:00:00Z",
        "raw_metar": "METAR ZBAA 300500Z VRB02MPS CAVOK 28/20 Q1007 NOSIG=",
        "qa": 0,
        "report_type": "METAR",
        "is_corrected": false,
        "wind_direction": null,
        "wind_speed": 2,
        "wind_gust": null,
        "wind_direction_range_min": null,
        "wind_direction_range_max": null,
        "visibility": 99999,
        "temperature": 28,
        "dew_point": 20,
        "qnh": 1007,
        "weather": "Clear Sky"
      }
    ]
  },
  "request_id": "req_37a59699b4d3494899183b726b02ca7b"
}

响应字段

字段 类型 单位 说明
data.stations array 本次查询的 ICAO 代码列表
data.start_time string 查询起始时间(与请求一致)
data.end_time string 查询结束时间(与请求一致)
data.count int 返回记录数
data.records[].icao_code string 机场 ICAO 四字代码
data.records[].observation_time string 观测时间,ISO 8601 格式(UTC)
data.records[].report_type string 报文类型:METAR(例行)或 SPECI(特殊)
data.records[].is_corrected bool 是否为修正报(COR)
data.records[].raw_metar string 原始 METAR/SPECI 报文
data.records[].qa int 质量控制标识:0=原始报文无修复,值越大修复程度越高
data.records[].wind_direction int/null ° 风向角度(0=正北);null 表示不定风向或静风
data.records[].wind_speed float m/s 风速
data.records[].wind_gust float/null m/s 阵风风速;无阵风时为 null
data.records[].wind_direction_range_min int/null ° 风向范围最小值;无范围时为 null
data.records[].wind_direction_range_max int/null ° 风向范围最大值;无范围时为 null
data.records[].visibility int m 能见度;99999 表示 CAVOK(能见度 ≥ 10 km)
data.records[].temperature float °C 气温
data.records[].dew_point float °C 露点温度
data.records[].qnh float hPa 修正海平面气压
data.records[].weather string 天气现象描述(如 Clear Sky、Light Rain)

代码示例

# 更换为您的以 sk- 开头的 API Key 字符串
curl -s \
  -H "Authorization: Bearer sk-d5d0542bef7e42e2b8909cb7f42af5fb" \
  "https://standard.data-api.skyviewor.host/v1/metar/observation?stations=ZBAA&start_time=2024-01-01T00:00:00Z&end_time=2024-01-02T00:00:00Z&elements=all&include_speci=true"
import json, urllib.request
from urllib.parse import urlencode

API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"  # 更换为您的以 sk- 开头的 API Key 字符串
params = urlencode({
    "stations": "ZBAA",
    "start_time": "2024-01-01T00:00:00Z",
    "end_time": "2024-01-02T00:00:00Z",
    "elements": "all",
    "include_speci": True,
})
url = f"https://standard.data-api.skyviewor.host/v1/metar/observation?{params}"

req = urllib.request.Request(
    url, headers={"Authorization": f"Bearer {API_KEY}"}
)
with urllib.request.urlopen(req, timeout=30) as resp:
    result = json.loads(resp.read().decode())

data = result["data"]
print(f"返回 {data['count']} 条记录,消耗 10 资源点")
for item in data.get("records", []):
    print(f"  {item['icao_code']} {item['observation_time']} T={item['temperature']}°C")
const API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
const params = new URLSearchParams({
  stations: "ZBAA",
  start_time: "2024-01-01T00:00:00Z",
  end_time: "2024-01-02T00:00:00Z",
  elements: "all",
  include_speci: true,
});
const url = `https://standard.data-api.skyviewor.host/v1/metar/observation?${params}`;

const resp = await fetch(url, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!resp.ok) {
  console.log(`HTTP ${resp.status}: 无数据(未扣资源点)`);
} else {
  const result = await resp.json();
  console.log(`返回 ${result.data.count} 条记录,消耗 10 资源点`);
  result.data.records.forEach(item => {
    console.log(`  ${item.icao_code} ${item.observation_time} T=${item.temperature}°C`);
  });
}
const API_KEY: string = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
const params = new URLSearchParams({
  stations: "ZBAA",
  start_time: "2024-01-01T00:00:00Z",
  end_time: "2024-01-02T00:00:00Z",
  elements: "all",
  include_speci: "true",
});
const url = `https://standard.data-api.skyviewor.host/v1/metar/observation?${params}`;

const resp = await fetch(url, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
const result: any = await resp.json();
for (const r of result.data.records) {
  console.log(`${r.icao_code} ${r.observation_time} T=${r.temperature}°C`);
}
apiKey := "sk-d5d0542bef7e42e2b8909cb7f42af5fb" // 更换为您的以 sk- 开头的 API Key 字符串
params := url.Values{}
params.Set("stations", "ZBAA")
params.Set("start_time", "2024-01-01T00:00:00Z")
params.Set("end_time", "2024-01-02T00:00:00Z")
params.Set("elements", "all")
params.Set("include_speci", "true")
apiUrl := "https://standard.data-api.skyviewor.host/v1/metar/observation?" + params.Encode()
req, _ := http.NewRequest("GET", apiUrl, nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode == 404 {
    fmt.Println("无数据(未扣资源点)")
    return
}
var result map[string]interface{}
json.Unmarshal(body, &result)
data := result["data"].(map[string]interface{})
fmt.Printf("返回 %.0f 条记录,消耗 10 资源点\n", data["count"])
String API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
String query = String.format(
    "stations=%s&start_time=%s&end_time=%s&elements=%s&include_speci=%s",
    URLEncoder.encode("ZBAA", StandardCharsets.UTF_8),
    URLEncoder.encode("2024-01-01T00:00:00Z", StandardCharsets.UTF_8),
    URLEncoder.encode("2024-01-02T00:00:00Z", StandardCharsets.UTF_8),
    URLEncoder.encode("all", StandardCharsets.UTF_8),
    URLEncoder.encode("true", StandardCharsets.UTF_8));
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://standard.data-api.skyviewor.host/v1/metar/observation?" + query))
    .header("Authorization", "Bearer " + API_KEY)
    .GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
if (resp.statusCode() == 404) {
    System.out.println("无数据(未扣资源点)");
} else {
    System.out.println(resp.body());
}
using System.Net.Http;
using System.Text.Json;

var apiBase = "https://standard.data-api.skyviewor.host";
var apiKey = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
var json = await client.GetStringAsync($"{apiBase}/v1/metar/observation?stations=ZBAA&start_time=2024-01-01T00:00:00Z&end_time=2024-01-02T00:00:00Z&elements=all&include_speci=true");
using var doc = JsonDocument.Parse(json);
foreach (var r in doc.RootElement.GetProperty("data").GetProperty("records").EnumerateArray())
{
    Console.WriteLine($"{r.GetProperty("icao_code").GetString()} {r.GetProperty("observation_time").GetString()} T={r.GetProperty("temperature").GetDouble()}°C");
}
$API_BASE = "https://standard.data-api.skyviewor.host";
$API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串

$ch = curl_init("{$API_BASE}/v1/metar/observation?stations=ZBAA&start_time=2024-01-01T00:00:00Z&end_time=2024-01-02T00:00:00Z&elements=all&include_speci=true");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer {$API_KEY}"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
foreach ($result['data']['records'] as $r) {
    echo "{$r['icao_code']} {$r['observation_time']} T={$r['temperature']}°C\n";
}
library(httr)
library(jsonlite)

API_KEY <- "sk-d5d0542bef7e42e2b8909cb7f42af5fb"  # 更换为您的以 sk- 开头的 API Key 字符串

resp <- GET(
  "https://standard.data-api.skyviewor.host/v1/metar/observation",
  query = list(
    stations = "ZBAA",
    start_time = "2024-01-01T00:00:00Z",
    end_time = "2024-01-02T00:00:00Z",
    elements = "all",
    include_speci = "true"
  ),
  add_headers(Authorization = paste("Bearer", API_KEY))
)
if (status_code(resp) == 404) {
  cat("无数据(未扣资源点)\n")
} else {
  result <- fromJSON(content(resp, "text", encoding = "UTF-8"))
  cat(sprintf("返回 %d 条记录,消耗 10 资源点\n", result$data$count))
  for (i in seq_len(nrow(result$data$records))) {
    item <- result$data$records[i, ]
    cat(sprintf("  %s %s T=%.0f°C\n",
        item$icao_code, item$observation_time, item$temperature))
  }
}
api_base = 'https://standard.data-api.skyviewor.host';
api_key = 'sk-d5d0542bef7e42e2b8909cb7f42af5fb';  % 更换为您的以 sk- 开头的 API Key 字符串

options = weboptions('HeaderFields', {'Authorization', ['Bearer ' api_key]}, 'Timeout', 30);
result = webread([api_base '/v1/metar/observation?stations=ZBAA&start_time=2024-01-01T00:00:00Z&end_time=2024-01-02T00:00:00Z&elements=all&include_speci=true'], options);
for i = 1:length(result.data.records)
    r = result.data.records(i);
    fprintf('%s %s T=%.0f°C\n', r.icao_code, r.observation_time, r.temperature);
end

METAR 机场列表

概览

项目 内容
方法 GET
路径 https://standard.data-api.skyviewor.host/v1/metar/stations
定价 免费(0 资源点)

请求参数

参数 类型 必填 默认值 说明
icao_codes string 全部 逗号分隔 ICAO;不传返回全部
keyword string 按 ICAO / 机场名 / 城市 / 省份模糊搜索
start_time string end_time 同时传时,筛选可能有数据的机场
end_time string start_time 同时传

响应示例

{
  "code": 0,
  "message": "ok",
  "data": {
    "count": 1,
    "stations": [
      {
        "icao_code": "ZBAA",
        "name": "北京首都国际机场",
        "longitude": 116.58444,
        "latitude": 40.08,
        "altitude": 54,
        "province": "北京市",
        "city": "北京市",
        "county": "朝阳区",
        "earliest_obser_time": "2000-03-08T22:00:00+00:00"
      }
    ]
  },
  "request_id": "req_b6ab2e2b144248f8b7c8ee1a4b6fcf12"
}

响应字段

字段 类型 单位 说明
data.count int 返回机场数量
data.stations[].icao_code string 机场 ICAO 四字代码
data.stations[].name string 机场名称
data.stations[].longitude float 经度
data.stations[].latitude float 纬度
data.stations[].altitude float m 海拔高度
data.stations[].province string 所在省份/自治区/直辖市
data.stations[].city string 所在城市
data.stations[].county string 所在区县
data.stations[].earliest_obser_time string 本平台收录的该机场最早观测时间(UTC)

说明

earliest_obser_time 指本平台收录的能查询到的最早观测时间,并非该机场本身的历史最早观测时间。

代码示例

# 更换为您的以 sk- 开头的 API Key 字符串
curl -s \
  -H "Authorization: Bearer sk-d5d0542bef7e42e2b8909cb7f42af5fb" \
  "https://standard.data-api.skyviewor.host/v1/metar/stations?keyword=%E5%8C%97%E4%BA%AC"
import json, urllib.request
from urllib.parse import urlencode

API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"  # 更换为您的以 sk- 开头的 API Key 字符串
params = urlencode({"keyword": "杭州"})
url = f"https://standard.data-api.skyviewor.host/v1/metar/stations?{params}"

req = urllib.request.Request(
    url, headers={"Authorization": f"Bearer {API_KEY}"}
)
with urllib.request.urlopen(req, timeout=30) as resp:
    result = json.loads(resp.read().decode())

for station in result["data"]["items"]:
    print(f"{station['icao_code']} {station['name']} ({station['city']})")
print("不消耗资源点")
const API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
const params = new URLSearchParams({ keyword: "杭州" });
const url = `https://standard.data-api.skyviewor.host/v1/metar/stations?${params}`;

const resp = await fetch(url, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
const result = await resp.json();
result.data.stations.forEach(s => {
  console.log(`${s.icao} ${s.name} (${s.city})`);
});
console.log("不消耗资源点");
const API_KEY: string = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
const url = "https://standard.data-api.skyviewor.host/v1/metar/stations?keyword=%E6%9D%AD%E5%B7%9E";

const resp = await fetch(url, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
const result: any = await resp.json();
for (const s of result.data.stations) {
  console.log(`${s.icao_code} ${s.name} (${s.city})`);
}
apiKey := "sk-d5d0542bef7e42e2b8909cb7f42af5fb" // 更换为您的以 sk- 开头的 API Key 字符串
params := url.Values{}
params.Set("keyword", "杭州")
apiUrl := "https://standard.data-api.skyviewor.host/v1/metar/stations?" + params.Encode()
req, _ := http.NewRequest("GET", apiUrl, nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
for _, s := range result["data"].(map[string]interface{})["stations"].([]interface{}) {
    st := s.(map[string]interface{})
    fmt.Printf("%v %v (%v)\n", st["icao_code"], st["name"], st["city"])
}
fmt.Println("不消耗资源点")
String API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串
String query = "keyword=" + URLEncoder.encode("杭州", StandardCharsets.UTF_8);
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://standard.data-api.skyviewor.host/v1/metar/stations?" + query))
    .header("Authorization", "Bearer " + API_KEY)
    .GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
System.out.println("不消耗资源点");
using System.Net.Http;
using System.Text.Json;

var apiBase = "https://standard.data-api.skyviewor.host";
var apiKey = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
var json = await client.GetStringAsync($"{apiBase}/v1/metar/stations?keyword=%E6%9D%AD%E5%B7%9E");
using var doc = JsonDocument.Parse(json);
foreach (var s in doc.RootElement.GetProperty("data").GetProperty("stations").EnumerateArray())
{
    Console.WriteLine($"{s.GetProperty("icao_code").GetString()} {s.GetProperty("name").GetString()} ({s.GetProperty("city").GetString()})");
}
$API_BASE = "https://standard.data-api.skyviewor.host";
$API_KEY = "sk-d5d0542bef7e42e2b8909cb7f42af5fb"; // 更换为您的以 sk- 开头的 API Key 字符串

$ch = curl_init("{$API_BASE}/v1/metar/stations?keyword=%E6%9D%AD%E5%B7%9E");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer {$API_KEY}"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
foreach ($result['data']['stations'] as $s) {
    echo "{$s['icao_code']} {$s['name']} ({$s['city']})\n";
}
library(httr)
library(jsonlite)

API_KEY <- "sk-d5d0542bef7e42e2b8909cb7f42af5fb"  # 更换为您的以 sk- 开头的 API Key 字符串

resp <- GET(
  "https://standard.data-api.skyviewor.host/v1/metar/stations",
  query = list(keyword = "杭州"),
  add_headers(Authorization = paste("Bearer", API_KEY))
)
result <- fromJSON(content(resp, "text", encoding = "UTF-8"))
for (i in seq_len(nrow(result$data$stations))) {
  s <- result$data$stations[i, ]
  cat(sprintf("%s %s (%s)\n", s$icao_code, s$name, s$city))
}
cat("不消耗资源点\n")
api_base = 'https://standard.data-api.skyviewor.host';
api_key = 'sk-d5d0542bef7e42e2b8909cb7f42af5fb';  % 更换为您的以 sk- 开头的 API Key 字符串

options = weboptions('HeaderFields', {'Authorization', ['Bearer ' api_key]}, 'Timeout', 30);
result = webread([api_base '/v1/metar/stations?keyword=%E6%9D%AD%E5%B7%9E'], options);
for i = 1:length(result.data.stations)
    s = result.data.stations(i);
    fprintf('%s %s (%s)\n', s.icao_code, s.name, s.city);
end