mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 20:50:06 +00:00
Add partial handling for missing level 2 radials
- Need to handle additional cases (1999-05-03 @ KTLX is a good sample) - Still crashes on getting bin level for hover text
This commit is contained in:
parent
50cf49568d
commit
a548497767
1 changed files with 75 additions and 31 deletions
|
|
@ -536,7 +536,7 @@ void Level2ProductView::ComputeSweep()
|
|||
return;
|
||||
}
|
||||
|
||||
const size_t radials = radarData->size();
|
||||
const std::size_t radials = radarData->crbegin()->first;
|
||||
|
||||
p->ComputeCoordinates(radarData);
|
||||
|
||||
|
|
@ -829,7 +829,7 @@ void Level2ProductViewImpl::ComputeCoordinates(
|
|||
auto momentData0 = radarData0->moment_data_block(dataBlockType_);
|
||||
|
||||
const std::uint16_t numRadials =
|
||||
static_cast<std::uint16_t>(radarData->size());
|
||||
static_cast<std::uint16_t>(radarData->crbegin()->first + 1);
|
||||
const std::uint16_t numRangeBins =
|
||||
std::max(momentData0->number_of_data_moment_gates() + 1u,
|
||||
common::MAX_DATA_MOMENT_GATES);
|
||||
|
|
@ -837,13 +837,58 @@ void Level2ProductViewImpl::ComputeCoordinates(
|
|||
auto radials = boost::irange<std::uint32_t>(0u, numRadials);
|
||||
auto gates = boost::irange<std::uint32_t>(0u, numRangeBins);
|
||||
|
||||
std::for_each(std::execution::par_unseq,
|
||||
std::for_each(
|
||||
std::execution::par_unseq,
|
||||
radials.begin(),
|
||||
radials.end(),
|
||||
[&](std::uint32_t radial)
|
||||
{
|
||||
const units::degrees<float> angle =
|
||||
(*radarData)[radial]->azimuth_angle();
|
||||
units::degrees<float> angle {};
|
||||
|
||||
auto radialData = radarData->find(radial);
|
||||
if (radialData != radarData->cend())
|
||||
{
|
||||
angle = radialData->second->azimuth_angle();
|
||||
}
|
||||
else
|
||||
{
|
||||
auto prevRadial1 = radarData->find(
|
||||
(radial >= 1) ? radial - 1 : numRadials - (1 - radial));
|
||||
auto prevRadial2 = radarData->find(
|
||||
(radial >= 2) ? radial - 2 : numRadials - (2 - radial));
|
||||
|
||||
if (prevRadial1 != radarData->cend() &&
|
||||
prevRadial2 != radarData->cend())
|
||||
{
|
||||
const units::degrees<float> prevAngle1 =
|
||||
prevRadial1->second->azimuth_angle();
|
||||
const units::degrees<float> prevAngle2 =
|
||||
prevRadial2->second->azimuth_angle();
|
||||
|
||||
// No wrapping required since angle is only used for geodesic
|
||||
// calculation
|
||||
const units::degrees<float> deltaAngle = prevAngle1 - prevAngle2;
|
||||
|
||||
angle = prevAngle1 + deltaAngle;
|
||||
}
|
||||
else if (prevRadial1 != radarData->cend())
|
||||
{
|
||||
const units::degrees<float> prevAngle1 =
|
||||
prevRadial1->second->azimuth_angle();
|
||||
|
||||
// Assume a half degree delta if there aren't enough angles
|
||||
// to determine a delta angle
|
||||
constexpr units::degrees<float> deltaAngle =
|
||||
units::degrees<float> {0.5};
|
||||
|
||||
angle = prevAngle1 + deltaAngle;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not enough angles present to determine an angle
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
std::for_each(std::execution::par_unseq,
|
||||
gates.begin(),
|
||||
|
|
@ -851,8 +896,7 @@ void Level2ProductViewImpl::ComputeCoordinates(
|
|||
[&](std::uint32_t gate)
|
||||
{
|
||||
const std::uint32_t radialGate =
|
||||
radial * common::MAX_DATA_MOMENT_GATES +
|
||||
gate;
|
||||
radial * common::MAX_DATA_MOMENT_GATES + gate;
|
||||
const float range = (gate + 1) * gateSize;
|
||||
const std::size_t offset = radialGate * 2;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue