Infrastructure updates for multiple elevations

This commit is contained in:
Dan Paulat 2021-11-14 14:20:24 -06:00
parent 87581892a7
commit 19f1207384
8 changed files with 85 additions and 32 deletions

View file

@ -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

View file

@ -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:

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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)