彩色卫星云图接入
接入向日葵(Himawari)卫星彩色云图,使用 Leaflet ImageOverlay 将实时卫星图像叠加到地图上,覆盖东亚及西太平洋区域。
向日葵(Himawari)是日本气象厅运营的地球静止轨道气象卫星,能够提供高分辨率彩色可见光云图,覆盖东亚和西太平洋区域(0°N ~ 55.77°N,67.5°E ~ 135°E)。
与气象要素预报图层不同,卫星云图是观测数据,更新频率更高(约每 10 分钟),可直接以图片方式叠加,无需 WebGL 解码。
1. 关键参数说明
| 参数 | 说明 |
|---|---|
| meta 接口 | https://api.mirror-earth.com/api/vis/himawari/meta?apikey={apikey}&timezone=Asia/Shanghai |
| 图片 URL | https://api.mirror-earth.com/api/vis/himawari/himawari/{time}.jpeg?size=2048&apikey={apikey}&timezone=Asia/Shanghai |
| Himawari 覆盖范围 | 南北:0°N ~ 55.77°N,东西:67.5°E ~ 135°E |
| Leaflet bounds | [[0, 67.5], [55.77, 135]](格式:[[南, 西], [北, 东]]) |
| 更新频率 | 约 10 分钟一帧 |
| 图片格式 | JPEG(真彩色可见光) |
注意:卫星云图路径为 /himawari/himawari/(两层 himawari 目录),这是 API 的固定结构,勿省略。
2. 示例代码
import { useEffect, useRef, useState } from 'react';
import 'leaflet/dist/leaflet.css';
const API_KEY = 'YOUR_API_KEY';
// 向日葵卫星覆盖范围:[[南, 西], [北, 东]]
const HIMAWARI_BOUNDS: [[number, number], [number, number]] = [
[0, 67.5],
[55.77, 135],
];
export default function SatelliteDemo() {
const mapRef = useRef<HTMLDivElement>(null);
const mapInstance = useRef<any>(null);
const [status, setStatus] = useState('正在加载卫星云图...');
useEffect(() => {
if (!mapRef.current || mapInstance.current) return;
const init = async () => {
const L: any = await import('leaflet');
const map = L.map(mapRef.current).setView([30.0, 100.0], 4);
L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', {
subdomains: ['a', 'b', 'c', 'd'],
attribution: '© CartoDB',
}).addTo(map);
mapInstance.current = map;
try {
// 1. 获取最新卫星时间
const { data: [time] } = await fetch(
`https://api.mirror-earth.com/api/vis/himawari/meta?apikey=${API_KEY}&timezone=Asia/Shanghai`
).then(r => r.json());
// 2. 构建卫星图 URL(注意双层 himawari 路径)
const url = `https://api.mirror-earth.com/api/vis/himawari/himawari/${time}.jpeg?size=2048&apikey=${API_KEY}&timezone=Asia/Shanghai`;
// 3. 叠加到地图上
L.imageOverlay(url, HIMAWARI_BOUNDS, { opacity: 0.9 }).addTo(map);
setStatus(`向日葵卫星云图已加载(${time})`);
} catch {
setStatus('卫星云图加载失败,请检查 API Key');
}
};
init();
return () => {
mapInstance.current?.remove();
mapInstance.current = null;
};
}, []);
return (
<div>
<p style={{ padding: '8px 12px', background: '#fafafa', margin: 0 }}>{status}</p>
<div ref={mapRef} style={{ width: '100%', height: '500px' }} />
</div>
);
}<template>
<div>
<p style="padding: 8px 12px; background: #fafafa; margin: 0">{{ status }}</p>
<div ref="mapRef" style="width: 100%; height: 500px" />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
const API_KEY = 'YOUR_API_KEY';
// 向日葵卫星覆盖范围:[[南, 西], [北, 东]]
const HIMAWARI_BOUNDS = [
[0, 67.5],
[55.77, 135],
];
const mapRef = ref<HTMLDivElement>();
const status = ref('正在加载卫星云图...');
let map: any = null;
onMounted(async () => {
const L: any = await import('leaflet');
await import('leaflet/dist/leaflet.css');
map = L.map(mapRef.value!).setView([30.0, 100.0], 4);
L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', {
subdomains: ['a', 'b', 'c', 'd'],
attribution: '© CartoDB',
}).addTo(map);
try {
// 1. 获取最新卫星时间
const { data: [time] } = await fetch(
`https://api.mirror-earth.com/api/vis/himawari/meta?apikey=${API_KEY}&timezone=Asia/Shanghai`
).then(r => r.json());
// 2. 构建 URL(注意双层 himawari 路径)
const url = `https://api.mirror-earth.com/api/vis/himawari/himawari/${time}.jpeg?size=2048&apikey=${API_KEY}&timezone=Asia/Shanghai`;
// 3. 叠加到地图
L.imageOverlay(url, HIMAWARI_BOUNDS, { opacity: 0.9 }).addTo(map);
status.value = `向日葵卫星云图已加载(${time})`;
} catch {
status.value = '卫星云图加载失败,请检查 API Key';
}
});
onUnmounted(() => {
map?.remove();
});
</script>3. Demo 仓库
完整可运行示例已上传至 Gitee:
- 仓库:https://gitee.com/gfyml/me-layer-demo.git
- React 示例:
react-demo/src/components/SatelliteDemo.tsx - Vue 示例:
vue-demo/src/components/SatelliteDemo.vue