Skip to Content

镜像地球开放平台

图层配色指南

各气象图层的配色方案源码,可用于自定义渲染或实现图例色带。

每个图层均使用分段线性渐变的方式定义配色,数组格式为 [数值, 颜色, 数值, 颜色, ...],相邻两段之间进行线性插值,超出范围的值取最近端点颜色。

温度 (temperature) — ℃

覆盖 -70.15 ~ 46.85 ℃,从暗紫冷色调过渡到深橙红暖色调。

const temperature_color = [
  -70.15, "rgba(115,70,105,255)",
  -55.15, "rgba(202,172,195,255)",
  -40.15, "rgba(162,70,145,255)",
  -25.15, "rgba(143,89,169,255)",
  -15.15, "rgba(157,219,217,255)",
  -8.15,  "rgba(106,191,181,255)",
  -4.15,  "rgba(100,166,189,255)",
  0,      "rgba(93,133,198,255)",
  0.85,   "rgba(68,125,99,255)",
  9.85,   "rgba(128,147,24,255)",
  20.85,  "rgba(243,183,4,255)",
  29.85,  "rgba(232,83,25,255)",
  46.85,  "rgba(71,14,0,255)"
]

湿度 (relative_humidity) — %

覆盖 0 ~ 100 %,从棕红干燥色调渐变为深蓝湿润色调。

const relative_humidity_color = [
  0,   "rgba(173, 85, 56, 255)",
  30,  "rgba(173, 110, 56, 255)",
  40,  "rgba(173, 146, 56, 255)",
  50,  "rgba(105, 173, 56, 255)",
  60,  "rgba(56, 173, 121, 255)",
  70,  "rgba(56, 174, 173, 255)",
  75,  "rgba(56, 160, 173, 255)",
  80,  "rgba(56, 157, 173, 255)",
  83,  "rgba(56, 148, 173, 255)",
  87,  "rgba(56, 135, 173, 255)",
  90,  "rgba(56, 132, 173, 255)",
  93,  "rgba(56, 123, 173, 255)",
  97,  "rgba(56, 98, 157, 255)",
  100, "rgba(56, 70, 114, 255)"
]

风速 (wind) — m/s

覆盖 0 ~ 104 m/s,低速为蓝绿色调,高速过渡至灰白色。

const wind_color = [
  0,   "rgba(98,113,183,255)",
  1,   "rgba(57,97,159,255)",
  3,   "rgba(74,148,169,255)",
  5,   "rgba(77,141,123,255)",
  7,   "rgba(83,165,83,255)",
  9,   "rgba(53,159,53,255)",
  11,  "rgba(167,157,81,255)",
  13,  "rgba(159,127,58,255)",
  15,  "rgba(161,108,92,255)",
  17,  "rgba(129,58,78,255)",
  19,  "rgba(175,80,136,255)",
  21,  "rgba(117,74,147,255)",
  24,  "rgba(109,97,163,255)",
  27,  "rgba(68,105,141,255)",
  29,  "rgba(92,144,152,255)",
  36,  "rgba(125,68,165,255)",
  46,  "rgba(231,215,215,256)",
  51,  "rgba(219,212,135,256)",
  77,  "rgba(205,202,112,256)",
  104, "rgba(128,128,128,255)"
]

降水 (precipitation) — mm

覆盖 0 ~ 50 mm,无降水为灰色,随降水量加深趋向紫色。

const precipitation_color = [
  0,   "rgba(111, 111, 111, 255)",
  0.6, "rgba(60, 116, 160, 255)",
  6,   "rgba(59, 161, 161, 255)",
  8,   "rgba(59, 161, 61, 255)",
  10,  "rgba(130, 161, 59, 255)",
  15,  "rgba(161, 161, 59, 255)",
  20,  "rgba(161, 59, 59, 255)",
  31,  "rgba(161, 59, 161, 255)",
  50,  "rgba(168, 168, 168, 255)"
]

气压 (pressure_msl) — hPa

覆盖 900 ~ 1080 hPa,低压深蓝,标准气压灰色,高压深红。

const pressure_color = [
  900,  "rgba(8, 16, 48, 255)",
  950,  "rgba(0, 32, 96, 255)",
  976,  "rgba(0, 52, 146, 255)",
  986,  "rgba(0, 90, 148, 255)",
  995,  "rgba(0, 117, 146, 255)",
  1002, "rgba(26, 140, 147, 255)",
  1007, "rgba(103, 162, 155, 255)",
  1011, "rgba(155, 183, 172, 255)",
  1013, "rgba(182, 182, 182, 255)",
  1015, "rgba(176, 174, 152, 255)",
  1019, "rgba(167, 147, 107, 255)",
  1024, "rgba(163, 116, 67, 255)",
  1030, "rgba(159, 81, 44, 255)",
  1038, "rgba(142, 47, 57, 255)",
  1046, "rgba(111, 24, 64, 255)",
  1080, "rgba(48, 8, 24, 255)"
]

辐射 (shortwave_radiation) — W/m²

覆盖 0 ~ 1150 W/m²,无辐射为深灰,强辐射趋近纯白。

const shortwave_radiation_color = [
  0,    "rgba(110, 110, 110, 255)",
  5,    "rgba(122, 105, 106, 255)",
  50,   "rgba(194, 53, 81, 255)",
  100,  "rgba(199, 66, 81, 255)",
  200,  "rgba(208, 90, 81, 255)",
  400,  "rgba(226, 131, 90, 255)",
  600,  "rgba(242, 170, 110, 255)",
  800,  "rgba(255, 208, 141, 255)",
  1000, "rgba(255, 245, 180, 255)",
  1150, "rgba(255, 255, 255, 255)"
]

云量 (cloud_cover) — %

覆盖 0 ~ 100 %,晴空为黄褐色,全云覆盖为浅灰色。

const cloud_cover_color = [
  0,   "rgba(156, 142, 87, 255)",
  10,  "rgba(143, 131, 87, 255)",
  30,  "rgba(157, 192, 157, 255)",
  90,  "rgba(145, 171, 145, 255)",
  100, "rgba(187, 187, 187, 255)"
]

雷达 (composite_reflectivity) — dBZ

覆盖 0 ~ 72.5 dBZ,低于 12.5 dBZ 完全透明,随反射率从蓝绿过渡至红紫。 0, 160, 246, 0

const radar_color = [
  0.0,  "rgba(0, 160, 246, 0)",
  9.9,  "rgba(0, 160, 246, 0)",
  12.5, "rgba(0, 160, 246, 200)",
  17.5, "rgba(0, 236, 236, 200)",
  22.5, "rgba(0, 216, 0, 200)",
  27.5, "rgba(1, 144, 0, 200)",
  32.5, "rgba(255, 255, 0, 200)",
  37.5, "rgba(231, 192, 0, 200)",
  42.5, "rgba(255, 144, 0, 200)",
  47.5, "rgba(255, 0, 0, 200)",
  52.5, "rgba(214, 0, 0, 200)",
  57.5, "rgba(192, 0, 0, 200)",
  62.5, "rgba(255, 0, 240, 200)",
  67.5, "rgba(150, 0, 180, 200)",
  72.5, "rgba(173, 144, 240, 200)"
]

如何使用配色插值

以下是一个通用的线性插值函数,可将任意数值映射为对应的 RGBA 颜色:

/**
 * 根据分段配色表对数值进行线性插值,返回 [r, g, b, a] 数组
 * @param {number[]} colorStops - 格式为 [value, color, value, color, ...]
 * @param {number} value - 待插值的数值
 * @returns {[number, number, number, number]}
 */
function interpolateColor(colorStops, value) {
  const parseRgba = (str) => str.match(/[\d.]+/g).map(Number);

  // 超出范围取端点颜色
  if (value <= colorStops[0]) return parseRgba(colorStops[1]);
  if (value >= colorStops[colorStops.length - 2]) return parseRgba(colorStops[colorStops.length - 1]);

  for (let i = 0; i < colorStops.length - 2; i += 2) {
    const v0 = colorStops[i];
    const v1 = colorStops[i + 2];
    if (value >= v0 && value <= v1) {
      const t = (value - v0) / (v1 - v0);
      const c0 = parseRgba(colorStops[i + 1]);
      const c1 = parseRgba(colorStops[i + 3]);
      return c0.map((ch, idx) => Math.round(ch + (c1[idx] - ch) * t));
    }
  }
}

// 示例:将 25℃ 映射为对应的温度颜色
const [r, g, b, a] = interpolateColor(temperature_color, 25);
console.log(`rgba(${r}, ${g}, ${b}, ${a / 255})`);

Previous

风场粒子动画接入

Next

HRES 图层图片接入