mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 08:10:06 +00:00 
			
		
		
		
	use non-standard coordinates for tdwr and optimize there generation
This commit is contained in:
		
							parent
							
								
									8dfb2fe69c
								
							
						
					
					
						commit
						f0ba7296d5
					
				
					 3 changed files with 49 additions and 17 deletions
				
			
		|  | @ -428,9 +428,16 @@ const scwx::util::time_zone* RadarProductManager::default_time_zone() const | |||
|    } | ||||
| } | ||||
| 
 | ||||
| bool RadarProductManager::is_tdwr() const | ||||
| { | ||||
|    return p->radarSite_->type() == "tdwr"; | ||||
| } | ||||
| 
 | ||||
| float RadarProductManager::gate_size() const | ||||
| { | ||||
|    return (p->radarSite_->type() == "tdwr") ? 150.0f : 250.0f; | ||||
|    // tdwr is 150 meter per gate, wsr88d is 250 meter per gate
 | ||||
|    // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers)
 | ||||
|    return (is_tdwr()) ? 150.0f : 250.0f; | ||||
| } | ||||
| 
 | ||||
| std::string RadarProductManager::radar_id() const | ||||
|  | @ -454,6 +461,12 @@ void RadarProductManager::Initialize() | |||
| 
 | ||||
|    logger_->debug("Initialize()"); | ||||
| 
 | ||||
|    if (is_tdwr()) | ||||
|    { | ||||
|       p->initialized_ = true; | ||||
|       return; | ||||
|    } | ||||
| 
 | ||||
|    boost::timer::cpu_timer timer; | ||||
| 
 | ||||
|    // Calculate half degree azimuth coordinates
 | ||||
|  |  | |||
|  | @ -44,6 +44,7 @@ public: | |||
|    [[nodiscard]] const std::vector<float>& | ||||
|    coordinates(common::RadialSize radialSize, bool smoothingEnabled) const; | ||||
|    [[nodiscard]] const scwx::util::time_zone*       default_time_zone() const; | ||||
|    [[nodiscard]] bool                               is_tdwr() const; | ||||
|    [[nodiscard]] float                              gate_size() const; | ||||
|    [[nodiscard]] std::string                        radar_id() const; | ||||
|    [[nodiscard]] std::shared_ptr<config::RadarSite> radar_site() const; | ||||
|  |  | |||
|  | @ -45,7 +45,8 @@ public: | |||
| 
 | ||||
|    void ComputeCoordinates( | ||||
|       const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData, | ||||
|       bool smoothingEnabled); | ||||
|       bool smoothingEnabled, | ||||
|       float gateSize); | ||||
| 
 | ||||
|    [[nodiscard]] inline std::uint8_t | ||||
|    RemapDataMoment(std::uint8_t dataMoment) const; | ||||
|  | @ -269,17 +270,24 @@ void Level3RadialView::ComputeSweep() | |||
|    } | ||||
| 
 | ||||
|    common::RadialSize radialSize; | ||||
|    if (radials == common::MAX_0_5_DEGREE_RADIALS) | ||||
|    if (radarProductManager->is_tdwr()) | ||||
|    { | ||||
|       radialSize = common::RadialSize::_0_5Degree; | ||||
|    } | ||||
|    else if (radials == common::MAX_1_DEGREE_RADIALS) | ||||
|    { | ||||
|       radialSize = common::RadialSize::_1Degree; | ||||
|       radialSize = common::RadialSize::NonStandard; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       radialSize = common::RadialSize::NonStandard; | ||||
|       if (radials == common::MAX_0_5_DEGREE_RADIALS) | ||||
|       { | ||||
|          radialSize = common::RadialSize::_0_5Degree; | ||||
|       } | ||||
|       else if (radials == common::MAX_1_DEGREE_RADIALS) | ||||
|       { | ||||
|          radialSize = common::RadialSize::_1Degree; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          radialSize = common::RadialSize::NonStandard; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    const std::vector<float>& coordinates = | ||||
|  | @ -323,11 +331,21 @@ void Level3RadialView::ComputeSweep() | |||
|    // Compute threshold at which to display an individual bin
 | ||||
|    const uint16_t snrThreshold = descriptionBlock->threshold(); | ||||
| 
 | ||||
|    // Compute gate interval
 | ||||
|    const std::uint16_t dataMomentInterval = | ||||
|       descriptionBlock->x_resolution_raw(); | ||||
| 
 | ||||
|    // Get the gate length in meters. Use dataMomentInterval for NonStandard to
 | ||||
|    // avoid generating >1 base gates per bin.
 | ||||
|    const float gateLength = radialSize == common::RadialSize::NonStandard ? | ||||
|                                static_cast<float>(dataMomentInterval) : | ||||
|                                radarProductManager->gate_size(); | ||||
| 
 | ||||
|    // Determine which radial to start at
 | ||||
|    std::uint16_t startRadial; | ||||
|    if (radialSize == common::RadialSize::NonStandard) | ||||
|    { | ||||
|       p->ComputeCoordinates(radialData, smoothingEnabled); | ||||
|       p->ComputeCoordinates(radialData, smoothingEnabled, gateLength); | ||||
|       startRadial = 0; | ||||
|    } | ||||
|    else | ||||
|  | @ -337,15 +355,11 @@ void Level3RadialView::ComputeSweep() | |||
|       startRadial = std::lroundf(startAngle * radialMultiplier); | ||||
|    } | ||||
| 
 | ||||
|    // Compute gate interval
 | ||||
|    const std::uint16_t dataMomentInterval = | ||||
|       descriptionBlock->x_resolution_raw(); | ||||
| 
 | ||||
|    // Compute gate size (number of base gates per bin)
 | ||||
|    const std::uint16_t gateSize = std::max<std::uint16_t>( | ||||
|       1, | ||||
|       dataMomentInterval / | ||||
|          static_cast<std::uint16_t>(radarProductManager->gate_size())); | ||||
|          static_cast<std::uint16_t>(gateLength)); | ||||
| 
 | ||||
|    // Compute gate range [startGate, endGate)
 | ||||
|    std::uint16_t       startGate = 0; | ||||
|  | @ -526,7 +540,8 @@ Level3RadialView::Impl::RemapDataMoment(std::uint8_t dataMoment) const | |||
| 
 | ||||
| void Level3RadialView::Impl::ComputeCoordinates( | ||||
|    const std::shared_ptr<wsr88d::rpg::GenericRadialDataPacket>& radialData, | ||||
|    bool smoothingEnabled) | ||||
|    bool smoothingEnabled, | ||||
|    float gateSize) | ||||
| { | ||||
|    logger_->debug("ComputeCoordinates()"); | ||||
| 
 | ||||
|  | @ -537,7 +552,6 @@ void Level3RadialView::Impl::ComputeCoordinates( | |||
| 
 | ||||
|    auto         radarProductManager = self_->radar_product_manager(); | ||||
|    auto         radarSite           = radarProductManager->radar_site(); | ||||
|    const float  gateSize            = radarProductManager->gate_size(); | ||||
|    const double radarLatitude       = radarSite->latitude(); | ||||
|    const double radarLongitude      = radarSite->longitude(); | ||||
| 
 | ||||
|  | @ -583,6 +597,10 @@ void Level3RadialView::Impl::ComputeCoordinates( | |||
|                const float range = | ||||
|                   (static_cast<float>(gate) + gateRangeOffset) * gateSize; | ||||
|                const std::size_t offset = static_cast<size_t>(radialGate) * 2; | ||||
|                if (offset + 1 >= coordinates_.size()) | ||||
|                { | ||||
|                   return; | ||||
|                } | ||||
| 
 | ||||
|                double latitude  = 0.0; | ||||
|                double longitude = 0.0; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AdenKoperczak
						AdenKoperczak