mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-01 09:30:06 +00:00
Perform level 3 data moment remapping when smoothing
This commit is contained in:
parent
c492f11466
commit
b7970bb631
4 changed files with 103 additions and 14 deletions
|
|
@ -485,6 +485,50 @@ void Level3ProductView::UpdateColorTableLut()
|
||||||
Q_EMIT ColorTableLutUpdated();
|
Q_EMIT ColorTableLutUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint8_t Level3ProductView::ComputeEdgeValue() const
|
||||||
|
{
|
||||||
|
std::uint8_t edgeValue = 0;
|
||||||
|
|
||||||
|
std::shared_ptr<wsr88d::rpg::ProductDescriptionBlock> descriptionBlock =
|
||||||
|
p->graphicMessage_->description_block();
|
||||||
|
|
||||||
|
const float offset = descriptionBlock->offset();
|
||||||
|
const float scale = descriptionBlock->scale();
|
||||||
|
|
||||||
|
switch (p->category_)
|
||||||
|
{
|
||||||
|
case common::Level3ProductCategory::Velocity:
|
||||||
|
edgeValue = (scale > 0.0f) ? (-offset / scale) : -offset;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case common::Level3ProductCategory::DifferentialReflectivity:
|
||||||
|
edgeValue = -offset;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case common::Level3ProductCategory::SpectrumWidth:
|
||||||
|
case common::Level3ProductCategory::SpecificDifferentialPhase:
|
||||||
|
edgeValue = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case common::Level3ProductCategory::CorrelationCoefficient:
|
||||||
|
edgeValue = static_cast<std::uint8_t>(
|
||||||
|
std::max<std::uint16_t>(255, descriptionBlock->number_of_levels()));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case common::Level3ProductCategory::Reflectivity:
|
||||||
|
case common::Level3ProductCategory::StormRelativeVelocity:
|
||||||
|
case common::Level3ProductCategory::VerticallyIntegratedLiquid:
|
||||||
|
case common::Level3ProductCategory::EchoTops:
|
||||||
|
case common::Level3ProductCategory::HydrometeorClassification:
|
||||||
|
case common::Level3ProductCategory::PrecipitationAccumulation:
|
||||||
|
default:
|
||||||
|
edgeValue = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return edgeValue;
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<wsr88d::DataLevelCode>
|
std::optional<wsr88d::DataLevelCode>
|
||||||
Level3ProductView::GetDataLevelCode(std::uint16_t level) const
|
Level3ProductView::GetDataLevelCode(std::uint16_t level) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@ protected:
|
||||||
void DisconnectRadarProductManager() override;
|
void DisconnectRadarProductManager() override;
|
||||||
void UpdateColorTableLut() override;
|
void UpdateColorTableLut() override;
|
||||||
|
|
||||||
|
std::uint8_t ComputeEdgeValue() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Impl;
|
class Impl;
|
||||||
std::unique_ptr<Impl> p;
|
std::unique_ptr<Impl> p;
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,8 @@ public:
|
||||||
const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData,
|
const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData,
|
||||||
bool smoothingEnabled);
|
bool smoothingEnabled);
|
||||||
|
|
||||||
|
inline std::uint8_t RemapDataMoment(std::uint8_t dataMoment) const;
|
||||||
|
|
||||||
Level3RadialView* self_;
|
Level3RadialView* self_;
|
||||||
|
|
||||||
boost::asio::thread_pool threadPool_ {1u};
|
boost::asio::thread_pool threadPool_ {1u};
|
||||||
|
|
@ -54,6 +56,7 @@ public:
|
||||||
std::vector<float> coordinates_ {};
|
std::vector<float> coordinates_ {};
|
||||||
std::vector<float> vertices_ {};
|
std::vector<float> vertices_ {};
|
||||||
std::vector<std::uint8_t> dataMoments8_ {};
|
std::vector<std::uint8_t> dataMoments8_ {};
|
||||||
|
std::uint8_t edgeValue_ {};
|
||||||
|
|
||||||
std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket> lastRadialData_ {};
|
std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket> lastRadialData_ {};
|
||||||
bool lastSmoothingEnabled_ {false};
|
bool lastSmoothingEnabled_ {false};
|
||||||
|
|
@ -347,6 +350,10 @@ void Level3RadialView::ComputeSweep()
|
||||||
// are skipping the radar site origin. The end gate is unaffected, as
|
// are skipping the radar site origin. The end gate is unaffected, as
|
||||||
// we need to draw one less data point.
|
// we need to draw one less data point.
|
||||||
++startGate;
|
++startGate;
|
||||||
|
|
||||||
|
// For most products other than reflectivity, the edge should not go to
|
||||||
|
// the bottom of the color table
|
||||||
|
p->edgeValue_ = ComputeEdgeValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::uint16_t radial = 0; radial < radialData->number_of_radials();
|
for (std::uint16_t radial = 0; radial < radialData->number_of_radials();
|
||||||
|
|
@ -401,12 +408,12 @@ void Level3RadialView::ComputeSweep()
|
||||||
}
|
}
|
||||||
|
|
||||||
// The order must match the store vertices section below
|
// The order must match the store vertices section below
|
||||||
dataMoments8[mIndex++] = dm1;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm1);
|
||||||
dataMoments8[mIndex++] = dm2;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm2);
|
||||||
dataMoments8[mIndex++] = dm4;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm4);
|
||||||
dataMoments8[mIndex++] = dm1;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm1);
|
||||||
dataMoments8[mIndex++] = dm3;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm3);
|
||||||
dataMoments8[mIndex++] = dm4;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm4);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -492,6 +499,19 @@ void Level3RadialView::ComputeSweep()
|
||||||
Q_EMIT SweepComputed();
|
Q_EMIT SweepComputed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint8_t
|
||||||
|
Level3RadialView::Impl::RemapDataMoment(std::uint8_t dataMoment) const
|
||||||
|
{
|
||||||
|
if (dataMoment != 0)
|
||||||
|
{
|
||||||
|
return dataMoment;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return edgeValue_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Level3RadialView::Impl::ComputeCoordinates(
|
void Level3RadialView::Impl::ComputeCoordinates(
|
||||||
const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData,
|
const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData,
|
||||||
bool smoothingEnabled)
|
bool smoothingEnabled)
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,13 @@ public:
|
||||||
}
|
}
|
||||||
~Level3RasterViewImpl() { threadPool_.join(); };
|
~Level3RasterViewImpl() { threadPool_.join(); };
|
||||||
|
|
||||||
|
inline std::uint8_t RemapDataMoment(std::uint8_t dataMoment) const;
|
||||||
|
|
||||||
boost::asio::thread_pool threadPool_ {1u};
|
boost::asio::thread_pool threadPool_ {1u};
|
||||||
|
|
||||||
std::vector<float> vertices_;
|
std::vector<float> vertices_ {};
|
||||||
std::vector<uint8_t> dataMoments8_;
|
std::vector<std::uint8_t> dataMoments8_ {};
|
||||||
|
std::uint8_t edgeValue_ {};
|
||||||
|
|
||||||
std::shared_ptr<wsr88d::rpg::RasterDataPacket> lastRasterData_ {};
|
std::shared_ptr<wsr88d::rpg::RasterDataPacket> lastRasterData_ {};
|
||||||
bool lastSmoothingEnabled_ {false};
|
bool lastSmoothingEnabled_ {false};
|
||||||
|
|
@ -310,6 +313,13 @@ void Level3RasterView::ComputeSweep()
|
||||||
rasterData->number_of_rows() - 1 :
|
rasterData->number_of_rows() - 1 :
|
||||||
rasterData->number_of_rows();
|
rasterData->number_of_rows();
|
||||||
|
|
||||||
|
if (smoothingEnabled)
|
||||||
|
{
|
||||||
|
// For most products other than reflectivity, the edge should not go to
|
||||||
|
// the bottom of the color table
|
||||||
|
p->edgeValue_ = ComputeEdgeValue();
|
||||||
|
}
|
||||||
|
|
||||||
for (std::size_t row = 0; row < rowCount; ++row)
|
for (std::size_t row = 0; row < rowCount; ++row)
|
||||||
{
|
{
|
||||||
const std::size_t nextRow =
|
const std::size_t nextRow =
|
||||||
|
|
@ -364,12 +374,12 @@ void Level3RasterView::ComputeSweep()
|
||||||
}
|
}
|
||||||
|
|
||||||
// The order must match the store vertices section below
|
// The order must match the store vertices section below
|
||||||
dataMoments8[mIndex++] = dm1;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm1);
|
||||||
dataMoments8[mIndex++] = dm2;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm2);
|
||||||
dataMoments8[mIndex++] = dm4;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm4);
|
||||||
dataMoments8[mIndex++] = dm1;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm1);
|
||||||
dataMoments8[mIndex++] = dm3;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm3);
|
||||||
dataMoments8[mIndex++] = dm4;
|
dataMoments8[mIndex++] = p->RemapDataMoment(dm4);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store vertices
|
// Store vertices
|
||||||
|
|
@ -411,6 +421,19 @@ void Level3RasterView::ComputeSweep()
|
||||||
Q_EMIT SweepComputed();
|
Q_EMIT SweepComputed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint8_t
|
||||||
|
Level3RasterViewImpl::RemapDataMoment(std::uint8_t dataMoment) const
|
||||||
|
{
|
||||||
|
if (dataMoment != 0)
|
||||||
|
{
|
||||||
|
return dataMoment;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return edgeValue_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<std::uint16_t>
|
std::optional<std::uint16_t>
|
||||||
Level3RasterView::GetBinLevel(const common::Coordinate& coordinate) const
|
Level3RasterView::GetBinLevel(const common::Coordinate& coordinate) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue