feat: 新增海珠和番禺气象站

This commit is contained in:
yarnom 2025-09-24 10:50:56 +08:00
parent f1e54aab9f
commit a127ddfeba
3 changed files with 43 additions and 3 deletions

View File

@ -31,6 +31,8 @@ func StartGinServer() error {
r.GET("/", indexHandler) r.GET("/", indexHandler)
r.GET("/radar/nanning", radarNanningHandler) r.GET("/radar/nanning", radarNanningHandler)
r.GET("/radar/guangzhou", radarGuangzhouHandler) r.GET("/radar/guangzhou", radarGuangzhouHandler)
r.GET("/radar/panyu", radarPanyuHandler)
r.GET("/radar/haizhu", radarHaizhuHandler)
// API路由组 // API路由组
api := r.Group("/api") api := r.Group("/api")
@ -90,6 +92,28 @@ func radarGuangzhouHandler(c *gin.Context) {
c.HTML(http.StatusOK, "radar_guangzhou.html", data) c.HTML(http.StatusOK, "radar_guangzhou.html", data)
} }
// radarHaizhuHandler 海珠雷达站占位页
func radarHaizhuHandler(c *gin.Context) {
data := types.PageData{
Title: "海珠雷达站",
ServerTime: time.Now().Format("2006-01-02 15:04:05"),
OnlineDevices: database.GetOnlineDevicesCount(database.GetDB()),
TiandituKey: "0c260b8a094a4e0bc507808812cefdac",
}
c.HTML(http.StatusOK, "radar_haizhu.html", data)
}
// radarPanyuHandler 番禺雷达站占位页
func radarPanyuHandler(c *gin.Context) {
data := types.PageData{
Title: "番禺雷达站",
ServerTime: time.Now().Format("2006-01-02 15:04:05"),
OnlineDevices: database.GetOnlineDevicesCount(database.GetDB()),
TiandituKey: "0c260b8a094a4e0bc507808812cefdac",
}
c.HTML(http.StatusOK, "radar_panyu.html", data)
}
// systemStatusHandler 处理系统状态API请求 // systemStatusHandler 处理系统状态API请求
func systemStatusHandler(c *gin.Context) { func systemStatusHandler(c *gin.Context) {
status := types.SystemStatus{ status := types.SystemStatus{

View File

@ -6,6 +6,8 @@
<a href="/" class="text-blue-600 hover:text-blue-700">首页</a> <a href="/" class="text-blue-600 hover:text-blue-700">首页</a>
<a href="/radar/nanning" class="text-blue-600 hover:text-blue-700">南宁雷达站</a> <a href="/radar/nanning" class="text-blue-600 hover:text-blue-700">南宁雷达站</a>
<a href="/radar/guangzhou" class="text-blue-600 hover:text-blue-700">广州雷达站</a> <a href="/radar/guangzhou" class="text-blue-600 hover:text-blue-700">广州雷达站</a>
<a href="/radar/panyu" class="text-blue-600 hover:text-blue-700">番禺雷达站</a>
<a href="/radar/haizhu" class="text-blue-600 hover:text-blue-700">海珠雷达站</a>
</nav> </nav>
</div> </div>
<style> <style>

View File

@ -222,14 +222,28 @@
const base = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/')); const base = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/'));
// 记录本次瓦片时间供 ETA 使用 // 记录本次瓦片时间供 ETA 使用
gTileDT = base; gTileDT = base;
const ceil10=new Date(base); const m=base.getMinutes(); const up=(Math.floor(m/10)*10+10)%60; ceil10.setMinutes(up,0,0); if(up===0){ ceil10.setHours(base.getHours()+1); } await fetchRealtimeWithFallback(base);
const pad=(n)=>String(n).padStart(2,'0'); const dtStr=`${ceil10.getFullYear()}-${pad(ceil10.getMonth()+1)}-${pad(ceil10.getDate())} ${pad(ceil10.getHours())}:${pad(ceil10.getMinutes())}:00`;
await loadRealtimeAt(dtStr);
maybeCalcSector(); maybeCalcSector();
maybePlotSquare(); maybePlotSquare();
}catch(e){ await loadRealtimeLatest(); maybeCalcSector(); maybePlotSquare(); } }catch(e){ await loadRealtimeLatest(); maybeCalcSector(); maybePlotSquare(); }
} }
async function fetchRealtimeWithFallback(base){
const pad=(n)=>String(n).padStart(2,'0');
// 尝试取下一10分钟整和雷达瓦片时间对齐
const ceil10=new Date(base); const m=base.getMinutes(); const up=(Math.floor(m/10)*10+10)%60; ceil10.setMinutes(up,0,0); if(up===0){ ceil10.setHours(base.getHours()+1); }
let dtStr=`${ceil10.getFullYear()}-${pad(ceil10.getMonth()+1)}-${pad(ceil10.getDate())} ${pad(ceil10.getHours())}:${pad(ceil10.getMinutes())}:00`;
let res=await fetch(`/api/radar/weather_at?alias=${encodeURIComponent(ST_ALIAS)}&dt=${encodeURIComponent(dtStr)}`);
if(res.ok){ const r=await res.json(); fillRealtime(r); return; }
// 若没有10分钟数据退回到当前小时的整点
const hour0=new Date(base); hour0.setMinutes(0,0,0);
dtStr=`${hour0.getFullYear()}-${pad(hour0.getMonth()+1)}-${pad(hour0.getDate())} ${pad(hour0.getHours())}:00:00`;
res=await fetch(`/api/radar/weather_at?alias=${encodeURIComponent(ST_ALIAS)}&dt=${encodeURIComponent(dtStr)}`);
if(res.ok){ const r=await res.json(); fillRealtime(r); return; }
// 最后退回最新
await loadRealtimeLatest();
}
async function loadRealtimeLatest(){ async function loadRealtimeLatest(){
const res=await fetch(`/api/radar/weather_latest?alias=${encodeURIComponent(ST_ALIAS)}`); const res=await fetch(`/api/radar/weather_latest?alias=${encodeURIComponent(ST_ALIAS)}`);
if(!res.ok) throw new Error('加载实时气象失败'); if(!res.ok) throw new Error('加载实时气象失败');