mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 13:00:05 +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
	
	 Dan Paulat
						Dan Paulat