批量下载全国区县历史数据
以下载全国区县2025年逐日气温、降雨数据为例
需求:下载全国所有区县 2025 年逐日平均气温、降雨量数据。
历史数据模型:era5_seamless
支持的逐小时要素: era5历史数据
全部支持的逐日数据要素查看:逐日要素支持
全部支持的逐月数据要素查看:逐月要素支持
以 Python 代码为例,分四步完成:
第一步:获取全国区县 adcode 列表
平台提供现成的行政区划 CSV 文件,直接下载解析即可。
import io
import time
import zipfile
import requests
import pandas as pd
API_KEY = "your_api_key"
BASE_URL = "https://api.mirror-earth.com"
# 下载区县表
res = requests.get(f"https://open.mirror-earth.com/district.csv")
res.encoding = "utf-8"
df = pd.read_csv(io.StringIO(res.text))
adcodes = df["adcode"].astype(str).tolist()
print(f"共 {len(adcodes)} 个区县")
第二步:创建批量下载任务
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
}
payload = {
"domain": "era5_seamless",
"hourly": [],
"daily": ["temperature_2m_mean", "rain_sum"],
"monthly": [],
"time_range": {
"type": "date_range",
"start": "2025-01-01",
"end": "2025-12-31",
},
"area": {
"type": "point",
"adcodes": adcodes,
},
"timezone": "Asia/Shanghai",
"area_average": False,
}
res = requests.post(f"{BASE_URL}/api/tasks/export", json=payload, headers=headers)
res.raise_for_status()
result = res.json()
task_id = result["data"]["task_id"]
print(f"任务已创建,task_id: {task_id}")
第三步:轮询等待任务完成
output_file = None
while True:
res = requests.get(f"{BASE_URL}/api/tasks/{task_id}/status", headers=headers)
res.raise_for_status()
data = res.json()["data"]
status = data["status"]
progress = data.get("progress_percent", 0)
print(f"任务状态:{status},进度:{progress}%")
if status == "completed":
output_file = data["output_file"]
break
elif status in ("failed", "cancelled"):
raise RuntimeError(f"任务异常,状态:{status}")
time.sleep(10)
第四步:下载并解压任务结果
download_url = f"{BASE_URL}/user_downloads/{output_file}"
res = requests.get(download_url, headers=headers, stream=True)
res.raise_for_status()
zip_path = "district_2025.zip"
with open(zip_path, "wb") as f:
for chunk in res.iter_content(chunk_size=8192):
f.write(chunk)
with zipfile.ZipFile(zip_path, "r") as z:
z.extractall("district_2025")
print("下载完成,数据已解压到 district_2025/")
完整代码
import io
import time
import zipfile
import requests
import pandas as pd
API_KEY = "your_api_key"
BASE_URL = "https://api.mirror-earth.com"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
}
# ── 1. 获取区县 adcode 列表 ──────────────────────────────────────
res = requests.get("https://open.mirror-earth.com/district.csv")
res.encoding = "utf-8"
df = pd.read_csv(io.StringIO(res.text))
adcodes = df["adcode"].astype(str).tolist()
print(f"共 {len(adcodes)} 个区县")
# ── 2. 创建任务 ──────────────────────────────────────────────────
payload = {
"domain": "era5_seamless",
"hourly": [],
"daily": ["temperature_2m_mean", "rain_sum"],
"monthly": [],
"time_range": {
"type": "date_range",
"start": "2025-01-01",
"end": "2025-12-31",
},
"area": {
"type": "point",
"adcodes": adcodes,
},
"timezone": "Asia/Shanghai",
"area_average": False,
}
res = requests.post(f"{BASE_URL}/api/tasks/export", json=payload, headers=headers)
res.raise_for_status()
task_id = res.json()["data"]["task_id"]
print(f"任务已创建,task_id: {task_id}")
# ── 3. 轮询任务进度 ──────────────────────────────────────────────
output_file = None
while True:
res = requests.get(f"{BASE_URL}/api/tasks/{task_id}/status", headers=headers)
res.raise_for_status()
data = res.json()["data"]
status = data["status"]
progress = data.get("progress_percent", 0)
print(f"任务状态:{status},进度:{progress}%")
if status == "completed":
output_file = data["output_file"]
break
elif status in ("failed", "cancelled"):
raise RuntimeError(f"任务异常,状态:{status}")
time.sleep(10)
# ── 4. 下载并解压结果 ────────────────────────────────────────────
download_url = f"{BASE_URL}/user_downloads/{output_file}"
res = requests.get(download_url, headers=headers, stream=True)
res.raise_for_status()
zip_path = "district_2025.zip"
with open(zip_path, "wb") as f:
for chunk in res.iter_content(chunk_size=8192):
f.write(chunk)
with zipfile.ZipFile(zip_path, "r") as z:
z.extractall("district_2025")
print("下载完成,数据已解压到 district_2025/")
行政区划表
| 级别 | 文件 |
|---|---|
| 省/直辖市 | province.csv |
| 地级市 | city.csv |
| 区县 | district.csv |
CSV 字段说明:
| 字段 | 说明 |
|---|---|
adcode | 行政区划代码 |
name | 名称 |
parent | 上级名称 |
parent_id | 上级 adcode |