PNG RGB(A) & RhoHV

This commit is contained in:
core 2025-01-06 13:08:11 -05:00
parent 310a354f2f
commit d27ba95d32
Signed by: core
GPG key ID: 9D0DAED5555DD0B4
4 changed files with 82 additions and 12 deletions

3
.cargo/config.toml Normal file
View file

@ -0,0 +1,3 @@
[profile.dev]
opt-level = 1
incremental = true

View file

@ -81,4 +81,28 @@ Color: 70 255 255 255 128 128 128
Color: 80 128 128 128
"""
missing = -99.0
no_coverage = -999.0
[sources.grib2.noaa_mrms_merged_rhohv_3km_CONUS]
from = "https://mrms.ncep.noaa.gov/3DRhoHV/MergedRhoHV_03.00/MRMS_MergedRhoHV_03.00.latest.grib2.gz"
needs_gzip = true
valid_for = 300
palette = """
Color: 0.20 149 148 156
Color: 0.45 22 20 140
Color: 0.65 9 2 233
Color: 0.75 137 135 214
Color: 0.80 92 255 89
Color: 0.85 139 207 2
Color: 0.90 255 251 0
Color: 0.93 255 196 0
Color: 0.95 255 137 3
Color: 0.96 255 43 0
Color: 0.97 227 0 0
Color: 0.98 161 0 0
Color: 0.99 121 0 90
Color: 1.00 250 172 209
Color: 1.05 119 0 125
"""
missing = -99.0
no_coverage = -999.0

View file

@ -6,7 +6,7 @@ use std::fmt::{Debug, Formatter};
use std::io::{Cursor, Read};
use std::time::Instant;
use image::codecs::png::PngDecoder;
use image::{DynamicImage, ImageBuffer, ImageDecoder, ImageFormat, ImageReader, Luma};
use image::{DynamicImage, GenericImageView, ImageBuffer, ImageDecoder, ImageFormat, ImageReader, Luma};
use tracing::{debug, warn};
use crate::error::GribError;
use crate::LatLongVectorRelativity::{EasterlyAndNortherly, IncreasingXY};
@ -104,6 +104,8 @@ impl GribMessage {
let bitmap = bitmap.ok_or(GribError::MissingBitmap)?;
let data = data.ok_or(GribError::MissingData)?;
debug!("{:?}", data_representation);
data_representation.load_data(data.data.clone())?;
Ok(Self {
@ -315,7 +317,7 @@ pub struct GridpointPNGDataRepresentation {
pub depth: u8,
pub type_of_values: u8,
pub image: Option<ImageBuffer<Luma<u16>, Vec<u16>>>
pub image: Option<DynamicImage>
}
impl GridpointPNGDataRepresentation {
fn parse<R: Read>(_length: u32, nommer: &mut NomReader<R>) -> Result<Self, GribError> {
@ -339,7 +341,7 @@ impl GridpointPNGDataRepresentation {
let image = image_reader.decode()?;
self.image = Some(image.to_luma16());
self.image = Some(image);
Ok(())
}
@ -347,17 +349,50 @@ impl GridpointPNGDataRepresentation {
fn get_image_coordinate(&self, x: u32, y: u32) -> Option<f32> {
match &self.image {
Some(i) => {
if x >= i.width() || y >= i.height() {
None
} else {
let datapoint = i.get_pixel(x, y).0[0] as f32;
let diff = datapoint * 2.0_f32.powi(self.binary_scale_factor as i32);
let dig_factor = 10_f32.powi(-(self.decimal_scale_factor as i32));
let value = (self.reference_value + diff) * dig_factor;
Some(value)
match self.depth {
1 | 2 | 4 | 8 | 16 => {
if x >= i.width() || y >= i.height() {
None
} else {
let datapoint = i.as_luma16().unwrap().get_pixel(x, y).0[0] as f32;
let diff = datapoint * 2.0_f32.powi(self.binary_scale_factor as i32);
let dig_factor = 10_f32.powi(-(self.decimal_scale_factor as i32));
let value = (self.reference_value + diff) * dig_factor;
Some(value)
}
},
24 => {
if x >= i.width() || y >= i.height() {
None
} else {
let datapoint_channels = i.as_rgb8().unwrap().get_pixel(x, y).0;
let datapoint = u32::from_be_bytes([0, datapoint_channels[0], datapoint_channels[1], datapoint_channels[2]]) as f32;
let diff = datapoint * 2.0_f32.powi(self.binary_scale_factor as i32);
let dig_factor = 10_f32.powi(-(self.decimal_scale_factor as i32));
let value = (self.reference_value + diff) * dig_factor;
Some(value)
}
},
32 => {
if x >= i.width() || y >= i.height() {
None
} else {
let datapoint_channels = i.as_rgba8().unwrap().get_pixel(x, y).0;
let datapoint = u32::from_be_bytes(datapoint_channels) as f32;
let diff = datapoint * 2.0_f32.powi(self.binary_scale_factor as i32);
let dig_factor = 10_f32.powi(-(self.decimal_scale_factor as i32));
let value = (self.reference_value + diff) * dig_factor;
Some(value)
}
},
_ => panic!("unsupported bit depth")
}
},
None => None,
None => None
}
}
}

View file

@ -138,6 +138,14 @@ impl eframe::App for WxboxApp {
need_to_reset_for_next_frame = true;
}
});
if location == "CONUS" {
ui.collapsing("RhoHV (Correlation Coefficient)", |ui| {
if ui.radio_value(&mut tile_request_options.data, format!("grib2/noaa_mrms_merged_rhohv_3km_{}", location), "RhoHV @ 3.00 KM").changed() {
need_to_reset_for_next_frame = true;
}
});
}
});
}
});