react-meteo-chart
Version:
pre alpha of meteo chart
294 lines (272 loc) • 8.47 kB
JSX
import hexToRgb from "hex-to-rgb";
import rgbToHex from "rgb-to-hex";
import convert from "color-convert";
import { precipColours } from "../shared/colours";
import getColour from "../shared/colourGetter";
function getIgnoreBufrs(type) {
if (type.search(/PRECIPITATION/) !== -1) return [0.01, 500];
switch (type) {
case "DOPPLER MEAN VELOCITY (RADIAL)":
return [-30, 30];
case "HORIZONTAL REFLECTIVITY":
return [-20, 100];
// return [-100, 100];
break;
case "DIFFERENTIAL REFLECTIVITY":
return [0, 100];
break;
case "RADAR RAINFALL INTENSITY":
return [0.2 / 36000000, 100];
case "ECHO TOPS":
return [1, 100000];
case "HAZARDOUS PHENOMENA":
return [1, 16];
default:
return [-100, 100000];
}
}
function getbufrColor(num) {
if (num > -50 && num <= -30) return [0, 0, 170];
if (num > -30 && num <= -20) return [0, 0, 204];
if (num > -20 && num <= -10) return [0, 0, 238];
if (num > -10 && num <= 0) return [85, 0, 255];
if (num > 0 && num <= 10) return [119, 0, 204];
if (num > 10 && num <= 20) return [153, 0, 170];
if (num > 20 && num <= 30) return [187, 0, 119];
if (num > 30 && num <= 40) return [221, 0, 51];
return [100, 100, 100];
}
function getbufrdopplermeanColor(num) {
if (num > -30 && num <= -25) return "#c4e5af";
if (num > -25 && num <= -20) return "#85ccbb";
if (num > -20 && num <= -15) return "#45b7c1";
if (num > -15 && num <= -10) return "#1e91c1";
if (num > -10 && num <= -5) return "#1c60a9";
if (num > -5 && num < 0) return "#00327f";
if (num == 0) return "#a8ae9d";
if (num > 0 && num <= 5) return "#b00124";
if (num > 5 && num <= 10) return "#e7171b";
if (num > 10 && num <= 15) return "#f75635";
if (num > 15 && num <= 20) return "#fe8c39";
if (num > 20 && num <= 25) return "#fbb35e";
if (num > 25 && num <= 30) return "#f0dc76";
return "";
}
function getbufrechoColor(num) {
num /= 1000;
// console.log(num);
if (num > 0 && num <= 3) return "#01f4f5";
if (num > 3 && num <= 5) return "#02978f";
if (num > 5 && num <= 6) return "#009b43";
if (num > 6 && num <= 7) return "#03b54d";
if (num > 7 && num <= 9) return "#00d108";
if (num > 9 && num < 11) return "#35f750";
if (num > 11 && num < 12) return "#fefc3e";
if (num > 12 && num <= 13) return "#fae909";
if (num > 13 && num <= 14) return "#ffbe01";
if (num > 14 && num <= 15) return "#ffb702";
if (num > 15 && num <= 16) return "#fd9c03";
if (num > 16 && num <= 17) return "#fe6403";
if (num > 17 && num <= 19) return "#fd3104";
if (num > 19 && num <= 20) return "#c32463";
if (num > 20) return "#ee37d2";
return "#FF0000";
}
function getbufrhorizColor(num) {
num /= 1000;
// console.log(num);
if (num > -20 && num <= -10) return "#dcdaff";
if (num > -10 && num <= -5) return "#6e6fff";
if (num > -5 && num <= 0) return "#090bfe";
if (num > 0 && num <= 10) return "#0dac12";
if (num > 10 && num <= 20) return "#7fd70c";
if (num > 20 && num < 30) return "#fafe01";
if (num > 30 && num < 40) return "#fecf01";
if (num > 40 && num <= 50) return "#fae909";
if (num > 13 && num <= 14) return "#fd8303";
if (num > 50) return "#fe0000";
return "#FF0000";
}
const ZDRColor = [
[0, 0, 0],
[60, 60, 60],
[92, 92, 92],
[120, 120, 120],
[145, 145, 145],
[173, 173, 173],
[113, 96, 144],
[16, 12, 125],
[52, 193, 169],
[0, 162, 255],
[0, 255, 162],
[0, 255, 255],
[119, 255, 0],
[255, 220, 0],
[255, 85, 0],
[176, 0, 0],
[255, 0, 0],
[213, 0, 255],
[115, 0, 255],
[90, 0, 150]
];
function zdr2color(num) {
if (num <= -4.0) return ZDRColor[0];
else if (num <= -3.5) return ZDRColor[1];
else if (num <= -3.0) return ZDRColor[2];
else if (num <= -2.5) return ZDRColor[3];
else if (num <= -0.5) return ZDRColor[4];
else if (num <= -0) return ZDRColor[5];
else if (num <= 0.25) return ZDRColor[6];
else if (num <= 0.5) return ZDRColor[7];
else if (num <= 1) return ZDRColor[8];
else if (num <= 1.25) return ZDRColor[9];
else if (num <= 1.5) return ZDRColor[10];
else if (num <= 2) return ZDRColor[11];
else if (num <= 2.5) return ZDRColor[12];
else if (num <= 3) return ZDRColor[13];
else if (num <= 3.5) return ZDRColor[14];
else if (num <= 4) return ZDRColor[15];
else if (num <= 5) return ZDRColor[16];
else if (num <= 6) return ZDRColor[17];
else return ZDRColor[18];
}
const rainfallColor = [
[0, 0, 0],
[200, 200, 200],
[180, 180, 255],
[120, 120, 255],
[20, 20, 255],
[0, 216, 195],
[0, 150, 144],
[0, 102, 102],
[255, 255, 0],
[255, 200, 0],
[255, 155, 0],
[255, 100, 0],
[255, 0, 0],
[200, 0, 0],
[120, 0, 0],
[40, 0, 0]
];
const RAINFALL_CONST = 36000000;
function rainfall2color(num) {
num *= RAINFALL_CONST;
if (num <= 0.2) return rainfallColor[0];
else if (num <= 0.5) return rainfallColor[1];
else if (num <= 1.5) return rainfallColor[2];
else if (num <= 2.5) return rainfallColor[3];
else if (num <= 4) return rainfallColor[4];
else if (num <= 6) return rainfallColor[5];
else if (num <= 10) return rainfallColor[6];
else if (num <= 15) return rainfallColor[7];
else if (num <= 20) return rainfallColor[8];
else if (num <= 35) return rainfallColor[9];
else if (num <= 50) return rainfallColor[10];
else if (num <= 80) return rainfallColor[11];
else if (num <= 120) return rainfallColor[12];
else if (num <= 200) return rainfallColor[13];
else if (num <= 300) return rainfallColor[14];
else return rainfallColor[1];
}
function getPreciptionColor(num) {
return getColour(num, precipColours);
}
function normalizeHeight(h) {
if (h == 0) return 0;
else if (h <= 1000) return 1;
else if (h <= 2000) return 2;
else if (h <= 3000) return 3;
else if (h <= 4000) return 4;
else if (h <= 5000) return 5;
else if (h <= 6000) return 6;
else if (h <= 7000) return 7;
else if (h <= 8000) return 8;
else if (h <= 9000) return 9;
else if (h <= 10000) return 10;
return 11;
}
function hazardousColor(h) {
return hazardColors[h - 1];
}
function getColorByType(type, color) {
// console.log(rgbToHEx);
if (color == null) return "#ffffff00";
if (type.search(/PRECIPITATION/) !== -1) return getPreciptionColor(color);
switch (type) {
case "DOPPLER MEAN VELOCITY (RADIAL)":
return getbufrdopplermeanColor(color);
case "HORIZONTAL REFLECTIVITY":
return getbufrhorizColor(color);
case "DIFFERENTIAL REFLECTIVITY": {
return `#${convert.rgb.hex(zdr2color(color))}`;
}
case "ECHO TOPS":
return getbufrechoColor(color);
case "RADAR RAINFALL INTENSITY":
return `#${convert.rgb.hex(rainfall2color(color))}`;
case "HAZARDOUS PHENOMENA":
return `#${convert.rgb.hex(hazardousColor(color))}`;
default:
return `#${convert.rgb.hex(getbufrColor(color))}`;
}
}
function getMeasureByType(type) {
// console.log(rgbToHEx);
if (type.search(/PRECIPITATION/) !== -1) return "кг/м²";
switch (type) {
case "DOPPLER MEAN VELOCITY (RADIAL)":
return "м/c";
case "HORIZONTAL REFLECTIVITY":
return "дБ";
case "DIFFERENTIAL REFLECTIVITY": {
return "дБ";
}
case "ECHO TOPS":
return "дБ";
case "RADAR RAINFALL INTENSITY":
return `мм/с`;
case "HAZARDOUS PHENOMENA":
return ``;
default:
return ``;
}
}
function isBufrWithHeight(type) {
if (type.search(/PRECIPITATION PAST/) !== -1 || type == "HAZARDOUS PHENOMENA")
return false;
return true;
}
function getHeightlessElevation(value, type) {
if (type.search(/PRECIPITATION/) !== -1) {
return value ? value.toFixed(3) : value;
}
return 1000;
}
const hazardColors = [
[182, 182, 180],
[169, 168, 174],
[101, 144, 117],
[67, 207, 85],
[85, 170, 77],
[240, 220, 169],
[86, 154, 217],
[0, 33, 209],
[1, 1, 111],
[221, 163, 125],
[213, 109, 132],
[211, 1, 10],
[220, 108, 32],
[151, 55, 7],
[83, 8, 5],
[222, 201, 216],
[236, 97, 224],
[210, 5, 172],
[76, 75, 106]
];
export {
getColorByType,
getIgnoreBufrs,
getMeasureByType,
getHeightlessElevation,
isBufrWithHeight
};