mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:10:04 +00:00 
			
		
		
		
	Infrastructure updates for multiple elevations
This commit is contained in:
		
							parent
							
								
									87581892a7
								
							
						
					
					
						commit
						19f1207384
					
				
					 8 changed files with 85 additions and 32 deletions
				
			
		|  | @ -180,16 +180,18 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename) | ||||||
|    emit Level2DataLoaded(); |    emit Level2DataLoaded(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::shared_ptr<wsr88d::rda::ElevationScan> | std::pair<float, std::shared_ptr<wsr88d::rda::ElevationScan>> | ||||||
| RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, | RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, | ||||||
|                                    uint16_t                   elevation, |                                    float                      elevation, | ||||||
|                                    std::chrono::system_clock::time_point time) |                                    std::chrono::system_clock::time_point time) | ||||||
| { | { | ||||||
|  |    float                                       elevationFound = 0.0f; | ||||||
|    std::shared_ptr<wsr88d::rda::ElevationScan> radarData      = nullptr; |    std::shared_ptr<wsr88d::rda::ElevationScan> radarData      = nullptr; | ||||||
| 
 | 
 | ||||||
|    if (p->level2VolumeScans_.size() > 0) |    if (p->level2VolumeScans_.size() > 0) | ||||||
|    { |    { | ||||||
|       radarData = p->level2VolumeScans_.crbegin()->second->GetElevationScan( |       std::tie(elevationFound, radarData) = | ||||||
|  |          p->level2VolumeScans_.crbegin()->second->GetElevationScan( | ||||||
|             dataBlockType, elevation, time); |             dataBlockType, elevation, time); | ||||||
|    } |    } | ||||||
|    else |    else | ||||||
|  | @ -203,7 +205,7 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, | ||||||
|       }); |       }); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    return radarData; |    return std::make_pair(elevationFound, radarData); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace manager
 | } // namespace manager
 | ||||||
|  |  | ||||||
|  | @ -33,9 +33,9 @@ public: | ||||||
|    void Initialize(); |    void Initialize(); | ||||||
|    void LoadLevel2Data(const std::string& filename); |    void LoadLevel2Data(const std::string& filename); | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<wsr88d::rda::ElevationScan> |    std::pair<float, std::shared_ptr<wsr88d::rda::ElevationScan>> | ||||||
|    GetLevel2Data(wsr88d::rda::DataBlockType            dataBlockType, |    GetLevel2Data(wsr88d::rda::DataBlockType            dataBlockType, | ||||||
|                  uint16_t                              elevation, |                  float                                 elevation, | ||||||
|                  std::chrono::system_clock::time_point time = {}); |                  std::chrono::system_clock::time_point time = {}); | ||||||
| 
 | 
 | ||||||
| signals: | signals: | ||||||
|  |  | ||||||
|  | @ -44,8 +44,10 @@ public: | ||||||
|       std::shared_ptr<manager::RadarProductManager> radarProductManager) : |       std::shared_ptr<manager::RadarProductManager> radarProductManager) : | ||||||
|        product_ {product}, |        product_ {product}, | ||||||
|        radarProductManager_ {radarProductManager}, |        radarProductManager_ {radarProductManager}, | ||||||
|  |        momentDataBlock0_ {nullptr}, | ||||||
|        latitude_ {}, |        latitude_ {}, | ||||||
|        longitude_ {}, |        longitude_ {}, | ||||||
|  |        elevation_ {}, | ||||||
|        range_ {}, |        range_ {}, | ||||||
|        sweepTime_ {}, |        sweepTime_ {}, | ||||||
|        colorTable_ {}, |        colorTable_ {}, | ||||||
|  | @ -81,6 +83,7 @@ public: | ||||||
| 
 | 
 | ||||||
|    float latitude_; |    float latitude_; | ||||||
|    float longitude_; |    float longitude_; | ||||||
|  |    float elevation_; | ||||||
|    float range_; |    float range_; | ||||||
| 
 | 
 | ||||||
|    std::chrono::system_clock::time_point sweepTime_; |    std::chrono::system_clock::time_point sweepTime_; | ||||||
|  | @ -122,6 +125,11 @@ Level2ProductView::color_table(uint16_t& minValue, uint16_t& maxValue) const | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | float Level2ProductView::elevation() const | ||||||
|  | { | ||||||
|  |    return p->elevation_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| float Level2ProductView::range() const | float Level2ProductView::range() const | ||||||
| { | { | ||||||
|    return p->range_; |    return p->range_; | ||||||
|  | @ -276,8 +284,10 @@ void Level2ProductView::ComputeSweep() | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    // TODO: Pick this based on view settings
 |    // TODO: Pick this based on view settings
 | ||||||
|    auto radarData = |    float                                       elevation; | ||||||
|       p->radarProductManager_->GetLevel2Data(p->dataBlockType_, 0); |    std::shared_ptr<wsr88d::rda::ElevationScan> radarData; | ||||||
|  |    std::tie(elevation, radarData) = | ||||||
|  |       p->radarProductManager_->GetLevel2Data(p->dataBlockType_, 0.0f); | ||||||
|    if (radarData == nullptr) |    if (radarData == nullptr) | ||||||
|    { |    { | ||||||
|       return; |       return; | ||||||
|  | @ -308,6 +318,7 @@ void Level2ProductView::ComputeSweep() | ||||||
|    auto volumeData0 = radarData0->volume_data_block(); |    auto volumeData0 = radarData0->volume_data_block(); | ||||||
|    p->latitude_     = volumeData0->latitude(); |    p->latitude_     = volumeData0->latitude(); | ||||||
|    p->longitude_    = volumeData0->longitude(); |    p->longitude_    = volumeData0->longitude(); | ||||||
|  |    p->elevation_    = elevation; | ||||||
|    p->range_ = |    p->range_ = | ||||||
|       momentData0->data_moment_range() + |       momentData0->data_moment_range() + | ||||||
|       momentData0->data_moment_range_sample_interval() * (gates - 0.5f); |       momentData0->data_moment_range_sample_interval() * (gates - 0.5f); | ||||||
|  | @ -464,13 +475,12 @@ void Level2ProductView::ComputeSweep() | ||||||
|          { |          { | ||||||
|             const uint16_t baseCoord = gate - 1; |             const uint16_t baseCoord = gate - 1; | ||||||
| 
 | 
 | ||||||
|             size_t offset1 = ((startRadial + radial) % common::MAX_RADIALS * |             size_t offset1 = ((startRadial + radial) % radials * | ||||||
|                                  common::MAX_DATA_MOMENT_GATES + |                                  common::MAX_DATA_MOMENT_GATES + | ||||||
|                               baseCoord) * |                               baseCoord) * | ||||||
|                              2; |                              2; | ||||||
|             size_t offset2 = offset1 + gateSize * 2; |             size_t offset2 = offset1 + gateSize * 2; | ||||||
|             size_t offset3 = |             size_t offset3 = (((startRadial + radial + 1) % radials) * | ||||||
|                (((startRadial + radial + 1) % common::MAX_RADIALS) * |  | ||||||
|                                  common::MAX_DATA_MOMENT_GATES + |                                  common::MAX_DATA_MOMENT_GATES + | ||||||
|                               baseCoord) * |                               baseCoord) * | ||||||
|                              2; |                              2; | ||||||
|  | @ -500,12 +510,11 @@ void Level2ProductView::ComputeSweep() | ||||||
|          { |          { | ||||||
|             const uint16_t baseCoord = gate; |             const uint16_t baseCoord = gate; | ||||||
| 
 | 
 | ||||||
|             size_t offset1 = ((startRadial + radial) % common::MAX_RADIALS * |             size_t offset1 = ((startRadial + radial) % radials * | ||||||
|                                  common::MAX_DATA_MOMENT_GATES + |                                  common::MAX_DATA_MOMENT_GATES + | ||||||
|                               baseCoord) * |                               baseCoord) * | ||||||
|                              2; |                              2; | ||||||
|             size_t offset2 = |             size_t offset2 = (((startRadial + radial + 1) % radials) * | ||||||
|                (((startRadial + radial + 1) % common::MAX_RADIALS) * |  | ||||||
|                                  common::MAX_DATA_MOMENT_GATES + |                                  common::MAX_DATA_MOMENT_GATES + | ||||||
|                               baseCoord) * |                               baseCoord) * | ||||||
|                              2; |                              2; | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ public: | ||||||
| 
 | 
 | ||||||
|    const std::vector<boost::gil::rgba8_pixel_t>& |    const std::vector<boost::gil::rgba8_pixel_t>& | ||||||
|          color_table(uint16_t& minValue, uint16_t& maxValue) const override; |          color_table(uint16_t& minValue, uint16_t& maxValue) const override; | ||||||
|  |    float elevation() const override; | ||||||
|    float range() const override; |    float range() const override; | ||||||
|    std::chrono::system_clock::time_point sweep_time() const override; |    std::chrono::system_clock::time_point sweep_time() const override; | ||||||
|    const std::vector<float>&             vertices() const override; |    const std::vector<float>&             vertices() const override; | ||||||
|  |  | ||||||
|  | @ -40,6 +40,11 @@ RadarProductView::color_table(uint16_t& minValue, uint16_t& maxValue) const | ||||||
|    return DEFAULT_COLOR_TABLE; |    return DEFAULT_COLOR_TABLE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | float RadarProductView::elevation() const | ||||||
|  | { | ||||||
|  |    return 0.0f; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| float RadarProductView::range() const | float RadarProductView::range() const | ||||||
| { | { | ||||||
|    return 0.0f; |    return 0.0f; | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ public: | ||||||
| 
 | 
 | ||||||
|    virtual const std::vector<boost::gil::rgba8_pixel_t>& |    virtual const std::vector<boost::gil::rgba8_pixel_t>& | ||||||
|                  color_table(uint16_t& minValue, uint16_t& maxValue) const; |                  color_table(uint16_t& minValue, uint16_t& maxValue) const; | ||||||
|  |    virtual float elevation() const; | ||||||
|    virtual float range() const; |    virtual float range() const; | ||||||
|    virtual std::chrono::system_clock::time_point sweep_time() const; |    virtual std::chrono::system_clock::time_point sweep_time() const; | ||||||
|    virtual const std::vector<float>&             vertices() const = 0; |    virtual const std::vector<float>&             vertices() const = 0; | ||||||
|  |  | ||||||
|  | @ -40,9 +40,9 @@ public: | ||||||
|    std::map<uint16_t, std::shared_ptr<rda::ElevationScan>> radar_data() const; |    std::map<uint16_t, std::shared_ptr<rda::ElevationScan>> radar_data() const; | ||||||
|    std::shared_ptr<const rda::VolumeCoveragePatternData>   vcp_data() const; |    std::shared_ptr<const rda::VolumeCoveragePatternData>   vcp_data() const; | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<rda::ElevationScan> |    std::pair<float, std::shared_ptr<rda::ElevationScan>> | ||||||
|    GetElevationScan(rda::DataBlockType                    dataBlockType, |    GetElevationScan(rda::DataBlockType                    dataBlockType, | ||||||
|                     uint16_t                              elevation, |                     float                                 elevation, | ||||||
|                     std::chrono::system_clock::time_point time) const; |                     std::chrono::system_clock::time_point time) const; | ||||||
| 
 | 
 | ||||||
|    bool LoadFile(const std::string& filename); |    bool LoadFile(const std::string& filename); | ||||||
|  |  | ||||||
|  | @ -106,21 +106,56 @@ std::shared_ptr<const rda::VolumeCoveragePatternData> Ar2vFile::vcp_data() const | ||||||
|    return p->vcpData_; |    return p->vcpData_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::shared_ptr<rda::ElevationScan> | std::pair<float, std::shared_ptr<rda::ElevationScan>> | ||||||
| Ar2vFile::GetElevationScan(rda::DataBlockType                    dataBlockType, | Ar2vFile::GetElevationScan(rda::DataBlockType                    dataBlockType, | ||||||
|                            uint16_t                              elevation, |                            float                                 elevation, | ||||||
|                            std::chrono::system_clock::time_point time) const |                            std::chrono::system_clock::time_point time) const | ||||||
| { | { | ||||||
|  |    constexpr float scaleFactor = 8.0f / 0.043945f; | ||||||
|  | 
 | ||||||
|  |    float                               elevationFound = 0.0f; | ||||||
|    std::shared_ptr<rda::ElevationScan> elevationScan  = nullptr; |    std::shared_ptr<rda::ElevationScan> elevationScan  = nullptr; | ||||||
| 
 | 
 | ||||||
|    // TODO: 88 = 0.5 degrees - this should be parameterized and searched
 |    uint16_t codedElevation = | ||||||
|    if (p->index_.contains(dataBlockType) && |       static_cast<uint16_t>(std::lroundf(elevation * scaleFactor)); | ||||||
|        p->index_.at(dataBlockType).contains(88)) | 
 | ||||||
|  |    if (p->index_.contains(dataBlockType)) | ||||||
|    { |    { | ||||||
|       return p->index_.at(dataBlockType).at(88); |       auto scans = p->index_.at(dataBlockType); | ||||||
|  | 
 | ||||||
|  |       uint16_t lowerBound = scans.cbegin()->first; | ||||||
|  |       uint16_t upperBound = scans.crbegin()->first; | ||||||
|  | 
 | ||||||
|  |       for (auto scan : scans) | ||||||
|  |       { | ||||||
|  |          if (scan.first > lowerBound && scan.first < codedElevation) | ||||||
|  |          { | ||||||
|  |             lowerBound = scan.first; | ||||||
|  |          } | ||||||
|  |          if (scan.first < upperBound && scan.first > codedElevation) | ||||||
|  |          { | ||||||
|  |             upperBound = scan.first; | ||||||
|  |          } | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|    return elevationScan; |       uint16_t lowerDelta = std::abs(static_cast<int32_t>(codedElevation) - | ||||||
|  |                                      static_cast<int32_t>(lowerBound)); | ||||||
|  |       uint16_t upperDelta = std::abs(static_cast<int32_t>(codedElevation) - | ||||||
|  |                                      static_cast<int32_t>(upperBound)); | ||||||
|  | 
 | ||||||
|  |       if (lowerDelta < upperDelta) | ||||||
|  |       { | ||||||
|  |          elevationFound = lowerBound / scaleFactor; | ||||||
|  |          elevationScan  = scans.at(lowerBound); | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          elevationFound = upperBound / scaleFactor; | ||||||
|  |          elevationScan  = scans.at(upperBound); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return std::make_pair(elevationFound, elevationScan); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool Ar2vFile::LoadFile(const std::string& filename) | bool Ar2vFile::LoadFile(const std::string& filename) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat