mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 01:40:04 +00:00 
			
		
		
		
	Handle missing level 2 radials when getting bin data
This commit is contained in:
		
							parent
							
								
									41c1125388
								
							
						
					
					
						commit
						1436b7bba6
					
				
					 1 changed files with 59 additions and 14 deletions
				
			
		|  | @ -1007,8 +1007,19 @@ Level2ProductView::GetBinLevel(const common::Coordinate& coordinate) const | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    // Find Radial
 |    // Find Radial
 | ||||||
|    const std::uint16_t numRadials = |    std::uint16_t numRadials = | ||||||
|       static_cast<std::uint16_t>(radarData->size()); |       static_cast<std::uint16_t>(radarData->crbegin()->first + 1); | ||||||
|  | 
 | ||||||
|  |    // Add an extra radial when incomplete data exists
 | ||||||
|  |    if (Level2ProductViewImpl::IsRadarDataIncomplete(radarData)) | ||||||
|  |    { | ||||||
|  |       ++numRadials; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    // Limit radials
 | ||||||
|  |    numRadials = | ||||||
|  |       std::min<std::uint16_t>(numRadials, common::MAX_0_5_DEGREE_RADIALS); | ||||||
|  | 
 | ||||||
|    auto radials = boost::irange<std::uint32_t>(0u, numRadials); |    auto radials = boost::irange<std::uint32_t>(0u, numRadials); | ||||||
| 
 | 
 | ||||||
|    auto radial = std::find_if( //
 |    auto radial = std::find_if( //
 | ||||||
|  | @ -1017,12 +1028,45 @@ Level2ProductView::GetBinLevel(const common::Coordinate& coordinate) const | ||||||
|       radials.end(), |       radials.end(), | ||||||
|       [&](std::uint32_t i) |       [&](std::uint32_t i) | ||||||
|       { |       { | ||||||
|  |          bool hasNextAngle = false; | ||||||
|          bool found        = false; |          bool found        = false; | ||||||
|          const units::degrees<float> startAngle = |  | ||||||
|             (*radarData)[i]->azimuth_angle(); |  | ||||||
|          const units::degrees<float> nextAngle = |  | ||||||
|             (*radarData)[(i + 1) % numRadials]->azimuth_angle(); |  | ||||||
| 
 | 
 | ||||||
|  |          units::degrees<float> startAngle {}; | ||||||
|  |          units::degrees<float> nextAngle {}; | ||||||
|  | 
 | ||||||
|  |          auto radialData = radarData->find(i); | ||||||
|  |          if (radialData != radarData->cend()) | ||||||
|  |          { | ||||||
|  |             startAngle = radialData->second->azimuth_angle(); | ||||||
|  | 
 | ||||||
|  |             auto nextRadial = radarData->find((i + 1) % numRadials); | ||||||
|  |             if (nextRadial != radarData->cend()) | ||||||
|  |             { | ||||||
|  |                nextAngle    = nextRadial->second->azimuth_angle(); | ||||||
|  |                hasNextAngle = true; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                // Next angle is not available, interpolate
 | ||||||
|  |                auto prevRadial = | ||||||
|  |                   radarData->find((i >= 1) ? i - 1 : numRadials - (1 - i)); | ||||||
|  | 
 | ||||||
|  |                if (prevRadial != radarData->cend()) | ||||||
|  |                { | ||||||
|  |                   const units::degrees<float> prevAngle = | ||||||
|  |                      prevRadial->second->azimuth_angle(); | ||||||
|  | 
 | ||||||
|  |                   const units::degrees<float> deltaAngle = | ||||||
|  |                      common::GetAngleDelta(startAngle, prevAngle); | ||||||
|  | 
 | ||||||
|  |                   nextAngle    = startAngle + deltaAngle; | ||||||
|  |                   hasNextAngle = true; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  | 
 | ||||||
|  |          if (hasNextAngle) | ||||||
|  |          { | ||||||
|             if (startAngle < nextAngle) |             if (startAngle < nextAngle) | ||||||
|             { |             { | ||||||
|                if (startAngle.value() <= azi1 && azi1 < nextAngle.value()) |                if (startAngle.value() <= azi1 && azi1 < nextAngle.value()) | ||||||
|  | @ -1038,6 +1082,7 @@ Level2ProductView::GetBinLevel(const common::Coordinate& coordinate) const | ||||||
|                   found = true; |                   found = true; | ||||||
|                } |                } | ||||||
|             } |             } | ||||||
|  |          } | ||||||
| 
 | 
 | ||||||
|          return found; |          return found; | ||||||
|       }); |       }); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat