gdtc.shipxy.com/tile.g,私有化镜像后本地 XYZ 同样式);#ff8573、active #48505c;单点气象面板深色 #1d374c。目标:基于离线气象数据,在私有化海图上复现在线平台气象服务( ShipxyAPI.WeatherService→map.weatherService)的核心图层效果:风场粒子(showWindFiel)、海浪等值面(showSeaWaves)、台风路径与风圈(showTyphoonInfoList),以及单点气象查询(对应GetWeatherByPoint)。数据字段结构与船讯网官方气象接口(6.1 实时/预报气象、6.2 台风)保持一致,离线数据包可直接灌入。
GET /apicall/v3/CurrentWeather?key&lng&lat,官方 6.1.1)返回结构(离线数据包按此组织):{
"status": 0, "msg": "",
"data": {
"observation_time": "2026-01-01T10:00:00Z",
"atmospheric_data": {
"temperature": 12.314, "wind_speed_100m": 8.994,
"wind_direction_100m": 37.562, "wind_speed": 13.067,
"wind_direction": 38.758, "atmospheric_pressure": 102.206,
"weather": "阴", "precipitation": 0,
"visibility": 13.032
},
"ocean_data": {
"wave_direction": 44.949, "wave_height": 0.77, "wave_period": 4.75,
"swell_direction": 67.553, "swell_height": 0.377, "swell_period": 7.647,
"wind_wave_direction": 38.313, "wind_wave_height": 0.66, "wind_wave_period": 2.867,
"ocean_current_direction": 203.454, "ocean_current_speed": 0.402,
"sea_water_height": 9.659, "sea_water_temp": 14.905, "sea_level_pressure": 102.275
}
}
}atmospheric_data.ocean_data 子集)效率更高。GET /apicall/v3/GetAllTyphoon 列表 + GET /apicall/v3/GetSingleTyphoon 详情,官方 6.2.1/6.2.2):{
"status": 0, "msg": "", "total": 15,
"data": [
{
"typhoon_id": "3063123",
"typhoon_time": "202507231400", // yyyyMMddHHmm,UTC+0(国内使用 +8)
"forecast": "BABJ", // 非空=预报机构预测点;空=实测点
"fhour": "24", // 未来小时;实测点为空
"lat": 16.8667, "lng": 119.9667, // WGS84
"grade": 10, // 风级(5-18)
"mspeed": 28, // 风速 m/s
"pressure": 985, // 中心气压 hPa
"kspeed": 13, "direction": "S", // 移速 km/h,移向
"radius7": 180, "radius10": 0, // 7/10 级风圈平均半径 km
"radius7_s": "180,120,150,200", // 四象限 7 级风圈:东北,东南,西南,西北
"radius10_s": "0", "radius12_s": "0"
}
]
}weather-grid.json),一次加载、前端自绘:{
"time": "2026-09-17 08:00:00",
"lon0": 118.0, "lat0": 26.0, // 网格原点(西南角)
"dlon": 0.08, "dlat": 0.08, // 官方网格精度 0.08°
"nx": 120, "ny": 90,
"wind_u": [ ... ], // 10m 风东向分量 m/s(长度 nx*ny)
"wind_v": [ ... ], // 北向分量
"wave_height": [ ... ] // 有效波高 m
}yyyy-MM-dd HH:mm:ss(官方 WeatherService 的时间参数即此格式)。map.weatherService.showWindFiel() 是风场粒子动画:粒子随风速流向移动、颜色表达风速量级。私有化实现(Canvas 全屏层 + 网格插值 + 粒子生命周期):WindParticleLayer.jsshowSeaWaves() 渲染的是有效波高色斑图(波高越大颜色越深/越暖)。私有化实现:网格 → marching squares 等值线 → 分级填色多边形。WaveIsolineLayer.jsmarchingSquares 完整实现(网格二值化 → 轮廓提取,纯前端无依赖):上面为可运行的简化版(格边描边成等值线观感)。要精确的"闭合填色多边形",可引入 d3-contour(内网部署d3-contour.js,d3.contours().size([nx,ny]).thresholds(bands)一步生成多边形坐标,再从行列号反算经纬度)。两种都给客户提供时,小网格(≤500×500)建议 d3 方案:
GetWeatherByPoint 字段对齐(气压、风向、风速、浪高、水温等;无效值统一 -32767,与官方约定一致):showTyphoonInfoList() 展示:台风实况路径点(按强度分级着色)、预报机构路径、7/10/12 级四象限风圈、当前台风中心符号与信息卡。私有化实现要点:data 数组 里 forecast 为空的是实测点,非空是预报点(按机构分组,BABJ=北京、RJTD=东京等);grade(5–18)映射颜色:≥11 强台风/超强台风深红、8–10 台风橙、6–7 热带风暴黄、5 热带低压蓝绿;radius7_s 四象限(东北、东南、西南、西北)风圈画成四段不同半径的圆弧拼合。TyphoonLayer.js台风数据定时更新: typhoon_time为 UTC+0,国内展示 +8(官方同款提示);radius7/radius10为平均半径(画整圆用),四象限精细风圈用radius*_s。
| 在线 API | 数据源 | 私有化绘制方式 |
|---|---|---|
showTempTile / showPressureTile 气温/气压瓦片 | 网格数据 | 服务端预渲染色斑瓦片(Python + Pillow 按网格画 PNG 瓦片,存入文档 01 的瓦片服务),前端 L.tileLayer 叠加 |
showSeaBreezes 海风符号 | 风向/风速格点 | 网格抽稀后画风羽符号(barb)marker |
showOceanCurrentFiel 海流粒子 | 海流 u/v 格点 | 复用第 2 节粒子引擎,换数据通道 |
showRainFall 降雨 | 降水格点 | 复用第 3 节等值面(换 bands 配色) |
weatherChoroplethServer 气压等值线 | 气压格点 | d3-contour 生成标量等值线(不填充),线上标气压值 |
showTides 潮汐 | 港口潮汐表(6.3 口径) | 港口 marker + 潮高曲线弹框(参考文档 02 的 showTrackAnalysis 曲线画法) |
气象图标 icon_base_url | 自托管图标目录 | 天气状况(weather 字段)→ 本地图标映射,ShipxyOptions.weather.icon_base_url 在线版同思路,私有化直接用本地目录 |
hideWindFiel 等效清屏;-32767。