Created
June 3, 2021 19:46
-
-
Save selimnairb/9bdd404325477ee53c8b38d756d1de3e to your computer and use it in GitHub Desktop.
Use HTML5 Canvas API to draw a legend for NOAA High-Resolution Rapid Refresh (HRRR) simulated radar reflectivity data (https://rapidrefresh.noaa.gov/hrrr/)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>HRRR legend test</title> | |
| <!-- Use HTML5 Canvas API to draw a legend for NOAA High-Resolution Rapid Refresh | |
| (HRRR) simulated radar reflectivity data (https://rapidrefresh.noaa.gov/hrrr/) | |
| --> | |
| </head> | |
| <body> | |
| <canvas id="canvas" width=548></canvas> | |
| <script> | |
| // HRRR color ramp from: https://mesonet.agron.iastate.edu/GIS/rasters.php?rid=2 | |
| let HRRR_ramp = [ | |
| {"label": "ND", "color": "#000000"}, | |
| {"label": "-32", "color": "#85718f"}, | |
| {"label": "-31.5", "color": "#85728f"}, | |
| {"label": "-31", "color": "#86738d"}, | |
| {"label": "-30.5", "color": "#87758b"}, | |
| {"label": "-30", "color": "#87768b"}, | |
| {"label": "-29.5", "color": "#887789"}, | |
| {"label": "-29", "color": "#897987"}, | |
| {"label": "-28.5", "color": "#897a87"}, | |
| {"label": "-28", "color": "#8a7b85"}, | |
| {"label": "-27.5", "color": "#8b7d84"}, | |
| {"label": "-27", "color": "#8b7e84"}, | |
| {"label": "-26.5", "color": "#8c7f82"}, | |
| {"label": "-26", "color": "#8d8180"}, | |
| {"label": "-25.5", "color": "#8d8280"}, | |
| {"label": "-25", "color": "#8e837e"}, | |
| {"label": "-24.5", "color": "#8f847c"}, | |
| {"label": "-24", "color": "#8f857c"}, | |
| {"label": "-23.5", "color": "#90877b"}, | |
| {"label": "-23", "color": "#918879"}, | |
| {"label": "-22.5", "color": "#918979"}, | |
| {"label": "-22", "color": "#928b77"}, | |
| {"label": "-21.5", "color": "#938d75"}, | |
| {"label": "-21", "color": "#969153"}, | |
| {"label": "-20.5", "color": "#989457"}, | |
| {"label": "-20", "color": "#9b975b"}, | |
| {"label": "-19.5", "color": "#9d9a60"}, | |
| {"label": "-19", "color": "#a09d64"}, | |
| {"label": "-18.5", "color": "#a3a068"}, | |
| {"label": "-18", "color": "#a5a36d"}, | |
| {"label": "-17.5", "color": "#a8a671"}, | |
| {"label": "-17", "color": "#aaa976"}, | |
| {"label": "-16.5", "color": "#adac7a"}, | |
| {"label": "-16", "color": "#b0af7e"}, | |
| {"label": "-15.5", "color": "#b2b283"}, | |
| {"label": "-15", "color": "#b7b88c"}, | |
| {"label": "-14.5", "color": "#babb90"}, | |
| {"label": "-14", "color": "#bdbe94"}, | |
| {"label": "-13.5", "color": "#bfc199"}, | |
| {"label": "-13", "color": "#c2c49d"}, | |
| {"label": "-12.5", "color": "#c4c7a2"}, | |
| {"label": "-12", "color": "#c7caa6"}, | |
| {"label": "-11.5", "color": "#cacdaa"}, | |
| {"label": "-11", "color": "#ccd0af"}, | |
| {"label": "-10.5", "color": "#d2d4b4"}, | |
| {"label": "-10", "color": "#cfd2b4"}, | |
| {"label": "-9.5", "color": "#c9ccb4"}, | |
| {"label": "-9", "color": "#c6c9b4"}, | |
| {"label": "-8.5", "color": "#c3c7b4"}, | |
| {"label": "-8", "color": "#c0c4b4"}, | |
| {"label": "-7.5", "color": "#bdc1b4"}, | |
| {"label": "-7", "color": "#b9beb4"}, | |
| {"label": "-6.5", "color": "#b6bbb4"}, | |
| {"label": "-6", "color": "#b3b9b4"}, | |
| {"label": "-5.5", "color": "#b0b6b4"}, | |
| {"label": "-5", "color": "#adb3b4"}, | |
| {"label": "-4.5", "color": "#aab0b4"}, | |
| {"label": "-4", "color": "#a4abb4"}, | |
| {"label": "-3.5", "color": "#a0a8b4"}, | |
| {"label": "-3", "color": "#9da5b4"}, | |
| {"label": "-2.5", "color": "#9aa2b4"}, | |
| {"label": "-2", "color": "#97a0b4"}, | |
| {"label": "-1.5", "color": "#949db4"}, | |
| {"label": "-1", "color": "#919ab4"}, | |
| {"label": "-0.5", "color": "#949bb5"}, | |
| {"label": "0", "color": "#9098b4"}, | |
| {"label": "0.5", "color": "#8c95b3"}, | |
| {"label": "1", "color": "#8892b2"}, | |
| {"label": "1.5", "color": "#808cb0"}, | |
| {"label": "2", "color": "#7c89af"}, | |
| {"label": "2.5", "color": "#7886ae"}, | |
| {"label": "3", "color": "#7483ac"}, | |
| {"label": "3.5", "color": "#7080ab"}, | |
| {"label": "4", "color": "#6c7daa"}, | |
| {"label": "4.5", "color": "#6779a9"}, | |
| {"label": "5", "color": "#6376a8"}, | |
| {"label": "5.5", "color": "#5f73a7"}, | |
| {"label": "6", "color": "#5b70a6"}, | |
| {"label": "6.5", "color": "#576da4"}, | |
| {"label": "7", "color": "#4f67a2"}, | |
| {"label": "7.5", "color": "#4b64a1"}, | |
| {"label": "8", "color": "#4761a0"}, | |
| {"label": "8.5", "color": "#435e9f"}, | |
| {"label": "9", "color": "#415b9e"}, | |
| {"label": "9.5", "color": "#4361a2"}, | |
| {"label": "10", "color": "#4568a6"}, | |
| {"label": "10.5", "color": "#486faa"}, | |
| {"label": "11", "color": "#4a76ae"}, | |
| {"label": "11.5", "color": "#4d7db2"}, | |
| {"label": "12", "color": "#4f84b6"}, | |
| {"label": "12.5", "color": "#518bbb"}, | |
| {"label": "13", "color": "#5699c3"}, | |
| {"label": "13.5", "color": "#599fc7"}, | |
| {"label": "14", "color": "#5ba6cb"}, | |
| {"label": "14.5", "color": "#5eadcf"}, | |
| {"label": "15", "color": "#60b4d4"}, | |
| {"label": "15.5", "color": "#62bbd8"}, | |
| {"label": "16", "color": "#65c2dc"}, | |
| {"label": "16.5", "color": "#67c9e0"}, | |
| {"label": "17", "color": "#6ad0e4"}, | |
| {"label": "17.5", "color": "#6fd6e8"}, | |
| {"label": "18", "color": "#68d6d7"}, | |
| {"label": "18.5", "color": "#59d6b3"}, | |
| {"label": "19", "color": "#52d6a2"}, | |
| {"label": "19.5", "color": "#4bd690"}, | |
| {"label": "20", "color": "#43d67e"}, | |
| {"label": "20.5", "color": "#3cd66d"}, | |
| {"label": "21", "color": "#35d65b"}, | |
| {"label": "21.5", "color": "#11d518"}, | |
| {"label": "22", "color": "#11d117"}, | |
| {"label": "22.5", "color": "#10cd17"}, | |
| {"label": "23", "color": "#10c816"}, | |
| {"label": "23.5", "color": "#10c416"}, | |
| {"label": "24", "color": "#0fbc15"}, | |
| {"label": "24.5", "color": "#0fb714"}, | |
| {"label": "25", "color": "#0eb314"}, | |
| {"label": "25.5", "color": "#0eaf13"}, | |
| {"label": "26", "color": "#0eab13"}, | |
| {"label": "26.5", "color": "#0da612"}, | |
| {"label": "27", "color": "#0da212"}, | |
| {"label": "27.5", "color": "#0d9e11"}, | |
| {"label": "28", "color": "#0c9911"}, | |
| {"label": "28.5", "color": "#0c9510"}, | |
| {"label": "29", "color": "#0c9110"}, | |
| {"label": "29.5", "color": "#0b880f"}, | |
| {"label": "30", "color": "#0b840e"}, | |
| {"label": "30.5", "color": "#0a800e"}, | |
| {"label": "31", "color": "#0a7c0d"}, | |
| {"label": "31.5", "color": "#0a770d"}, | |
| {"label": "32", "color": "#09730c"}, | |
| {"label": "32.5", "color": "#096f0c"}, | |
| {"label": "33", "color": "#096b0b"}, | |
| {"label": "33.5", "color": "#08660b"}, | |
| {"label": "34", "color": "#08620a"}, | |
| {"label": "34.5", "color": "#095e09"}, | |
| {"label": "35", "color": "#327308"}, | |
| {"label": "35.5", "color": "#467d08"}, | |
| {"label": "36", "color": "#5b8807"}, | |
| {"label": "36.5", "color": "#6f9207"}, | |
| {"label": "37", "color": "#849d06"}, | |
| {"label": "37.5", "color": "#98a806"}, | |
| {"label": "38", "color": "#adb205"}, | |
| {"label": "38.5", "color": "#c1bd05"}, | |
| {"label": "39", "color": "#d6c704"}, | |
| {"label": "39.5", "color": "#ead204"}, | |
| {"label": "40", "color": "#ffe200"}, | |
| {"label": "40.5", "color": "#ffd800"}, | |
| {"label": "41", "color": "#ffd300"}, | |
| {"label": "41.5", "color": "#ffce00"}, | |
| {"label": "42", "color": "#ffc900"}, | |
| {"label": "42.5", "color": "#ffc400"}, | |
| {"label": "43", "color": "#ffc000"}, | |
| {"label": "43.5", "color": "#ffbb00"}, | |
| {"label": "44", "color": "#ffb600"}, | |
| {"label": "44.5", "color": "#ffb100"}, | |
| {"label": "45", "color": "#ffac00"}, | |
| {"label": "45.5", "color": "#ffa700"}, | |
| {"label": "46", "color": "#ffa200"}, | |
| {"label": "46.5", "color": "#ff9900"}, | |
| {"label": "47", "color": "#ff9400"}, | |
| {"label": "47.5", "color": "#ff8f00"}, | |
| {"label": "48", "color": "#ff8a00"}, | |
| {"label": "48.5", "color": "#ff8500"}, | |
| {"label": "49", "color": "#ff8000"}, | |
| {"label": "49.5", "color": "#ff0000"}, | |
| {"label": "50", "color": "#f80000"}, | |
| {"label": "50.5", "color": "#f10000"}, | |
| {"label": "51", "color": "#ea0000"}, | |
| {"label": "51.5", "color": "#e30000"}, | |
| {"label": "52", "color": "#d50000"}, | |
| {"label": "52.5", "color": "#cd0000"}, | |
| {"label": "53", "color": "#c60000"}, | |
| {"label": "53.5", "color": "#bf0000"}, | |
| {"label": "54", "color": "#b80000"}, | |
| {"label": "54.5", "color": "#b10000"}, | |
| {"label": "55", "color": "#aa0000"}, | |
| {"label": "55.5", "color": "#a30000"}, | |
| {"label": "56", "color": "#9b0000"}, | |
| {"label": "56.5", "color": "#940000"}, | |
| {"label": "57", "color": "#8d0000"}, | |
| {"label": "57.5", "color": "#7f0000"}, | |
| {"label": "58", "color": "#780000"}, | |
| {"label": "58.5", "color": "#710000"}, | |
| {"label": "59", "color": "#ffffff"}, | |
| {"label": "59.5", "color": "#fff5ff"}, | |
| {"label": "60", "color": "#ffeaff"}, | |
| {"label": "60.5", "color": "#ffdfff"}, | |
| {"label": "61", "color": "#ffd4ff"}, | |
| {"label": "61.5", "color": "#ffc9ff"}, | |
| {"label": "62", "color": "#ffbeff"}, | |
| {"label": "62.5", "color": "#ffb3ff"}, | |
| {"label": "63", "color": "#ff9dff"}, | |
| {"label": "63.5", "color": "#ff92ff"}, | |
| {"label": "64", "color": "#ff75ff"}, | |
| {"label": "64.5", "color": "#fc6bfd"}, | |
| {"label": "65", "color": "#f960fa"}, | |
| {"label": "65.5", "color": "#f656f7"}, | |
| {"label": "66", "color": "#f34bf4"}, | |
| {"label": "66.5", "color": "#f040f1"}, | |
| {"label": "67", "color": "#ed36ef"}, | |
| {"label": "67.5", "color": "#ea2bec"}, | |
| {"label": "68", "color": "#e720e9"}, | |
| {"label": "68.5", "color": "#e10be3"}, | |
| {"label": "69", "color": "#b200ff"}, | |
| {"label": "69.5", "color": "#ac00fc"}, | |
| {"label": "70", "color": "#a400f7"}, | |
| {"label": "70.5", "color": "#9b00f4"}, | |
| {"label": "71", "color": "#9300ef"}, | |
| {"label": "71.5", "color": "#8800ea"}, | |
| {"label": "72", "color": "#8300e8"}, | |
| {"label": "72.5", "color": "#7900e2"}, | |
| {"label": "73", "color": "#7200dd"}, | |
| {"label": "73.5", "color": "#6900db"}, | |
| {"label": "74", "color": "#05ecf0"}, | |
| {"label": "74.5", "color": "#05ebf0"}, | |
| {"label": "75", "color": "#05eaf0"}, | |
| {"label": "75.5", "color": "#05dde0"}, | |
| {"label": "76", "color": "#05dce0"}, | |
| {"label": "76.5", "color": "#05dbe0"}, | |
| {"label": "77", "color": "#05cdd0"}, | |
| {"label": "77.5", "color": "#05ccd0"}, | |
| {"label": "78", "color": "#04bdc0"}, | |
| {"label": "78.5", "color": "#04bcc0"}, | |
| {"label": "79", "color": "#04bbc0"}, | |
| {"label": "79.5", "color": "#04aeb0"}, | |
| {"label": "80", "color": "#04adb0"}, | |
| {"label": "80.5", "color": "#049ea0"}, | |
| {"label": "81", "color": "#049da0"}, | |
| {"label": "81.5", "color": "#049ca0"}, | |
| {"label": "82", "color": "#038e90"}, | |
| {"label": "82.5", "color": "#038d90"}, | |
| {"label": "83", "color": "#038c90"}, | |
| {"label": "83.5", "color": "#037e80"}, | |
| {"label": "84", "color": "#037d80"}, | |
| {"label": "84.5", "color": "#036f70"}, | |
| {"label": "85", "color": "#036e70"}, | |
| {"label": "85.5", "color": "#036d70"}, | |
| {"label": "86", "color": "#025f60"}, | |
| {"label": "86.5", "color": "#025e60"}, | |
| {"label": "87", "color": "#024f50"}, | |
| {"label": "87.5", "color": "#024e50"}, | |
| {"label": "88", "color": "#024d50"}, | |
| {"label": "88.5", "color": "#023f40"}, | |
| {"label": "89", "color": "#023e40"}, | |
| {"label": "89.5", "color": "#023d40"}, | |
| {"label": "90", "color": "#013030"}, | |
| {"label": "90.5", "color": "#012f30"}, | |
| {"label": "91", "color": "#012020"}, | |
| {"label": "91.5", "color": "#011f20"}, | |
| {"label": "92", "color": "#011e20"}, | |
| {"label": "92.5", "color": "#3a67b5"}, | |
| {"label": "93", "color": "#3a66b5"}, | |
| {"label": "93.5", "color": "#3a65b5"}, | |
| {"label": "94", "color": "#3a64b5"}, | |
| {"label": "94.5", "color": "#3a63b5"}, | |
| {"label": "95", "color": "#3a62b5"}, | |
| ]; | |
| // Support for HiDPI displays | |
| // Adapted from: https://www.html5rocks.com/en/tutorials/canvas/hidpi/ | |
| // and: https://www.kirupa.com/canvas/canvas_high_dpi_retina.htm | |
| function setupCanvas(canvas) { | |
| // Get the device pixel ratio, falling back to 1. | |
| var dpr = window.devicePixelRatio || 1; | |
| // Get the size of the canvas in CSS pixels. | |
| var rect = canvas.getBoundingClientRect(); | |
| // Give the canvas pixel dimensions of their CSS | |
| // size * the device pixel ratio. | |
| canvas.width = rect.width * dpr; | |
| canvas.height = rect.height * dpr; | |
| var ctx = canvas.getContext('2d'); | |
| // Scale all drawing operations by the dpr, so you | |
| // don't have to worry about the difference. | |
| ctx.scale(dpr, dpr); | |
| // scale everything down using CSS | |
| canvas.style.width = rect.width + 'px'; | |
| canvas.style.height = rect.height + 'px'; | |
| return ctx; | |
| } | |
| const leftMargin = 10; | |
| const topMargin = 10; | |
| const rampWidth = 512; | |
| const rampHeight = 24; | |
| const ticYstop = 40; | |
| const labelYstart = 48; | |
| const firstLabelXoffset = 4 | |
| const labelXoffset = 8; | |
| const endTicXoffset = 1; | |
| const ctx = setupCanvas(document.querySelector('canvas')); | |
| ctx.font = '8px sans-serif'; | |
| ctx.strokeStyle = 'black'; | |
| // Draw HRRR color ramp and labels | |
| let labelNum = 0; | |
| zeroLen_HRRR_ramp = HRRR_ramp.length - 1; | |
| let gradient = ctx.createLinearGradient(0, 0, rampWidth, 0); | |
| for (let i = 0; i < HRRR_ramp.length; i++) { | |
| let rampStop = HRRR_ramp[i]; | |
| let stop = i / zeroLen_HRRR_ramp; | |
| gradient.addColorStop(stop, rampStop["color"]); | |
| if (i == 0) { | |
| // First label and tic | |
| let x = leftMargin + (stop * rampWidth); | |
| ctx.fillText(rampStop["label"], x - firstLabelXoffset, labelYstart); | |
| // Draw tic | |
| ctx.beginPath(); | |
| ctx.moveTo(x + endTicXoffset, rampHeight); | |
| ctx.lineTo(x + endTicXoffset, ticYstop); | |
| ctx.stroke(); | |
| } else if (i % 32 == 0) { | |
| // Intermediate labels and tic | |
| let x = leftMargin + (stop * rampWidth); | |
| ctx.fillText(rampStop["label"], x - labelXoffset, labelYstart); | |
| // Draw tic | |
| ctx.beginPath(); | |
| ctx.moveTo(x, rampHeight); | |
| ctx.lineTo(x, ticYstop); | |
| ctx.stroke(); | |
| } else if (i == 255) { | |
| // Final label and tic | |
| let x = leftMargin + (stop * rampWidth); | |
| ctx.fillText(rampStop["label"] + " dBZ", x - labelXoffset, labelYstart); | |
| // Draw tic | |
| ctx.beginPath(); | |
| ctx.moveTo(x - endTicXoffset, rampHeight); | |
| ctx.lineTo(x - endTicXoffset, ticYstop); | |
| ctx.stroke(); | |
| } | |
| } | |
| ctx.fillStyle = gradient; | |
| ctx.fillRect(leftMargin, topMargin, rampWidth, rampHeight); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment