机场天气
基于国内民航机场的气象观测体系建立的数据查询接口。
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_only 或 both |
查询限制
单次最多查询 5 个机场;start_time 与 end_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