mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21:10:04 +00:00
Selectable elevation cuts
This commit is contained in:
parent
19f1207384
commit
e76ac3bc36
15 changed files with 230 additions and 51 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <scwx/qt/map/map_widget.hpp>
|
#include <scwx/qt/map/map_widget.hpp>
|
||||||
#include <scwx/qt/ui/flow_layout.hpp>
|
#include <scwx/qt/ui/flow_layout.hpp>
|
||||||
|
#include <scwx/common/characters.hpp>
|
||||||
#include <scwx/common/products.hpp>
|
#include <scwx/common/products.hpp>
|
||||||
|
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
|
@ -18,16 +19,25 @@ namespace main
|
||||||
|
|
||||||
static const std::string logPrefix_ = "[scwx::qt::main::main_window] ";
|
static const std::string logPrefix_ = "[scwx::qt::main::main_window] ";
|
||||||
|
|
||||||
class MainWindowImpl
|
class MainWindowImpl : public QObject
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainWindowImpl(MainWindow* mainWindow) : mainWindow_(mainWindow) {}
|
explicit MainWindowImpl(MainWindow* mainWindow) :
|
||||||
|
mainWindow_ {mainWindow}, map_ {nullptr}, elevationCuts_ {}
|
||||||
|
{
|
||||||
|
}
|
||||||
~MainWindowImpl() = default;
|
~MainWindowImpl() = default;
|
||||||
|
|
||||||
|
void InitializeConnections();
|
||||||
void SelectRadarProduct(common::Level2Product product);
|
void SelectRadarProduct(common::Level2Product product);
|
||||||
|
void UpdateRadarProductSettings(map::MapWidget* mapWidget);
|
||||||
|
|
||||||
MainWindow* mainWindow_;
|
MainWindow* mainWindow_;
|
||||||
map::MapWidget* map_;
|
map::MapWidget* map_;
|
||||||
|
|
||||||
|
std::vector<float> elevationCuts_;
|
||||||
};
|
};
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget* parent) :
|
MainWindow::MainWindow(QWidget* parent) :
|
||||||
|
|
@ -62,6 +72,11 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||||
p->SelectRadarProduct(product);
|
p->SelectRadarProduct(product);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QLayout* elevationLayout = new ui::FlowLayout();
|
||||||
|
ui->elevationSettings->setLayout(elevationLayout);
|
||||||
|
|
||||||
|
p->InitializeConnections();
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
|
|
@ -96,6 +111,16 @@ void MainWindow::showEvent(QShowEvent* event)
|
||||||
resizeDocks({ui->radarToolboxDock}, {150}, Qt::Horizontal);
|
resizeDocks({ui->radarToolboxDock}, {150}, Qt::Horizontal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindowImpl::InitializeConnections()
|
||||||
|
{
|
||||||
|
connect(
|
||||||
|
map_,
|
||||||
|
&map::MapWidget::RadarSweepUpdated,
|
||||||
|
this,
|
||||||
|
[this]() { UpdateRadarProductSettings(map_); },
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindowImpl::SelectRadarProduct(common::Level2Product product)
|
void MainWindowImpl::SelectRadarProduct(common::Level2Product product)
|
||||||
{
|
{
|
||||||
const std::string& productName = common::GetLevel2Name(product);
|
const std::string& productName = common::GetLevel2Name(product);
|
||||||
|
|
@ -121,6 +146,61 @@ void MainWindowImpl::SelectRadarProduct(common::Level2Product product)
|
||||||
map_->SelectRadarProduct(product);
|
map_->SelectRadarProduct(product);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindowImpl::UpdateRadarProductSettings(map::MapWidget* mapWidget)
|
||||||
|
{
|
||||||
|
float currentElevation = mapWidget->GetElevation();
|
||||||
|
std::vector<float> elevationCuts = mapWidget->GetElevationCuts();
|
||||||
|
|
||||||
|
if (elevationCuts_ == elevationCuts)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (QToolButton* toolButton :
|
||||||
|
mainWindow_->ui->elevationSettings->findChildren<QToolButton*>())
|
||||||
|
{
|
||||||
|
delete toolButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLayout* layout = mainWindow_->ui->elevationSettings->layout();
|
||||||
|
|
||||||
|
// Create elevation cut tool buttons
|
||||||
|
for (float elevationCut : elevationCuts)
|
||||||
|
{
|
||||||
|
QToolButton* toolButton = new QToolButton();
|
||||||
|
toolButton->setText(QString::number(elevationCut, 'f', 1) +
|
||||||
|
common::Characters::DEGREE);
|
||||||
|
layout->addWidget(toolButton);
|
||||||
|
|
||||||
|
connect(toolButton, &QToolButton::clicked, this, [=]() {
|
||||||
|
mapWidget->SelectElevation(elevationCut);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update toolbox active item to render
|
||||||
|
QToolBox* toolbox = mainWindow_->ui->radarToolbox;
|
||||||
|
int currentIndex = toolbox->currentIndex();
|
||||||
|
toolbox->setCurrentWidget(mainWindow_->ui->productSettingsPage);
|
||||||
|
toolbox->setCurrentIndex(currentIndex);
|
||||||
|
|
||||||
|
// Set each elevation cut's tool button to the same size
|
||||||
|
int elevationCutMaxWidth = 0;
|
||||||
|
for (QToolButton* widget :
|
||||||
|
mainWindow_->ui->elevationSettings->findChildren<QToolButton*>())
|
||||||
|
{
|
||||||
|
elevationCutMaxWidth = std::max(elevationCutMaxWidth, widget->width());
|
||||||
|
}
|
||||||
|
for (QToolButton* widget :
|
||||||
|
mainWindow_->ui->elevationSettings->findChildren<QToolButton*>())
|
||||||
|
{
|
||||||
|
widget->setMinimumWidth(elevationCutMaxWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
elevationCuts_ = elevationCuts;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace main
|
} // namespace main
|
||||||
} // namespace qt
|
} // namespace qt
|
||||||
} // namespace scwx
|
} // namespace scwx
|
||||||
|
|
||||||
|
#include "main_window.moc"
|
||||||
|
|
|
||||||
|
|
@ -180,17 +180,20 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename)
|
||||||
emit Level2DataLoaded();
|
emit Level2DataLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<float, std::shared_ptr<wsr88d::rda::ElevationScan>>
|
std::tuple<std::shared_ptr<wsr88d::rda::ElevationScan>,
|
||||||
|
float,
|
||||||
|
std::vector<float>>
|
||||||
RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
||||||
float 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;
|
float elevationCut = 0.0f;
|
||||||
|
std::vector<float> elevationCuts;
|
||||||
|
|
||||||
if (p->level2VolumeScans_.size() > 0)
|
if (p->level2VolumeScans_.size() > 0)
|
||||||
{
|
{
|
||||||
std::tie(elevationFound, radarData) =
|
std::tie(radarData, elevationCut, elevationCuts) =
|
||||||
p->level2VolumeScans_.crbegin()->second->GetElevationScan(
|
p->level2VolumeScans_.crbegin()->second->GetElevationScan(
|
||||||
dataBlockType, elevation, time);
|
dataBlockType, elevation, time);
|
||||||
}
|
}
|
||||||
|
|
@ -205,7 +208,7 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair(elevationFound, radarData);
|
return std::tie(radarData, elevationCut, elevationCuts);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace manager
|
} // namespace manager
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,9 @@ public:
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void LoadLevel2Data(const std::string& filename);
|
void LoadLevel2Data(const std::string& filename);
|
||||||
|
|
||||||
std::pair<float, std::shared_ptr<wsr88d::rda::ElevationScan>>
|
std::tuple<std::shared_ptr<wsr88d::rda::ElevationScan>,
|
||||||
|
float,
|
||||||
|
std::vector<float>>
|
||||||
GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
||||||
float elevation,
|
float elevation,
|
||||||
std::chrono::system_clock::time_point time = {});
|
std::chrono::system_clock::time_point time = {});
|
||||||
|
|
|
||||||
|
|
@ -88,23 +88,33 @@ MapWidget::~MapWidget()
|
||||||
makeCurrent();
|
makeCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float MapWidget::GetElevation() const
|
||||||
|
{
|
||||||
|
return p->radarProductView_->elevation();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<float> MapWidget::GetElevationCuts() const
|
||||||
|
{
|
||||||
|
return p->radarProductView_->GetElevationCuts();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWidget::SelectElevation(float elevation)
|
||||||
|
{
|
||||||
|
p->radarProductView_->SelectElevation(elevation);
|
||||||
|
}
|
||||||
|
|
||||||
void MapWidget::SelectRadarProduct(common::Level2Product product)
|
void MapWidget::SelectRadarProduct(common::Level2Product product)
|
||||||
{
|
{
|
||||||
p->radarProductView_ =
|
float currentElevation = 0.0f;
|
||||||
view::RadarProductViewFactory::Create(product, p->radarProductManager_);
|
|
||||||
|
|
||||||
p->radarProductView_->Initialize();
|
if (p->radarProductView_ != nullptr)
|
||||||
|
|
||||||
std::string colorTableFile =
|
|
||||||
manager::SettingsManager::palette_settings()->palette(
|
|
||||||
common::GetLevel2Palette(product));
|
|
||||||
if (!colorTableFile.empty())
|
|
||||||
{
|
{
|
||||||
std::shared_ptr<common::ColorTable> colorTable =
|
currentElevation = p->radarProductView_->elevation();
|
||||||
common::ColorTable::Load(colorTableFile);
|
|
||||||
p->radarProductView_->LoadColorTable(colorTable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->radarProductView_ = view::RadarProductViewFactory::Create(
|
||||||
|
product, currentElevation, p->radarProductManager_);
|
||||||
|
|
||||||
connect(
|
connect(
|
||||||
p->radarProductView_.get(),
|
p->radarProductView_.get(),
|
||||||
&view::RadarProductView::ColorTableUpdated,
|
&view::RadarProductView::ColorTableUpdated,
|
||||||
|
|
@ -118,9 +128,22 @@ void MapWidget::SelectRadarProduct(common::Level2Product product)
|
||||||
[&]() {
|
[&]() {
|
||||||
RadarRangeLayer::Update(p->map_, p->radarProductView_->range());
|
RadarRangeLayer::Update(p->map_, p->radarProductView_->range());
|
||||||
update();
|
update();
|
||||||
|
emit RadarSweepUpdated();
|
||||||
},
|
},
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
|
|
||||||
|
p->radarProductView_->Initialize();
|
||||||
|
|
||||||
|
std::string colorTableFile =
|
||||||
|
manager::SettingsManager::palette_settings()->palette(
|
||||||
|
common::GetLevel2Palette(product));
|
||||||
|
if (!colorTableFile.empty())
|
||||||
|
{
|
||||||
|
std::shared_ptr<common::ColorTable> colorTable =
|
||||||
|
common::ColorTable::Load(colorTableFile);
|
||||||
|
p->radarProductView_->LoadColorTable(colorTable);
|
||||||
|
}
|
||||||
|
|
||||||
if (p->map_ != nullptr)
|
if (p->map_ != nullptr)
|
||||||
{
|
{
|
||||||
AddLayers();
|
AddLayers();
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,10 @@ public:
|
||||||
explicit MapWidget(const QMapboxGLSettings&);
|
explicit MapWidget(const QMapboxGLSettings&);
|
||||||
~MapWidget();
|
~MapWidget();
|
||||||
|
|
||||||
void SelectRadarProduct(common::Level2Product product);
|
float GetElevation() const;
|
||||||
|
std::vector<float> GetElevationCuts() const;
|
||||||
|
void SelectElevation(float elevation);
|
||||||
|
void SelectRadarProduct(common::Level2Product product);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void changeStyle();
|
void changeStyle();
|
||||||
|
|
@ -53,6 +56,9 @@ private:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void mapChanged(QMapboxGL::MapChange);
|
void mapChanged(QMapboxGL::MapChange);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void RadarSweepUpdated();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace map
|
} // namespace map
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <scwx/qt/view/level2_product_view.hpp>
|
#include <scwx/qt/view/level2_product_view.hpp>
|
||||||
#include <scwx/common/constants.hpp>
|
#include <scwx/common/constants.hpp>
|
||||||
|
#include <scwx/util/threads.hpp>
|
||||||
#include <scwx/util/time.hpp>
|
#include <scwx/util/time.hpp>
|
||||||
|
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
|
@ -41,13 +42,17 @@ class Level2ProductViewImpl
|
||||||
public:
|
public:
|
||||||
explicit Level2ProductViewImpl(
|
explicit Level2ProductViewImpl(
|
||||||
common::Level2Product product,
|
common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
|
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
|
||||||
product_ {product},
|
product_ {product},
|
||||||
radarProductManager_ {radarProductManager},
|
radarProductManager_ {radarProductManager},
|
||||||
|
selectedElevation_ {elevation},
|
||||||
|
elevationScan_ {nullptr},
|
||||||
momentDataBlock0_ {nullptr},
|
momentDataBlock0_ {nullptr},
|
||||||
latitude_ {},
|
latitude_ {},
|
||||||
longitude_ {},
|
longitude_ {},
|
||||||
elevation_ {},
|
elevationCut_ {},
|
||||||
|
elevationCuts_ {},
|
||||||
range_ {},
|
range_ {},
|
||||||
sweepTime_ {},
|
sweepTime_ {},
|
||||||
colorTable_ {},
|
colorTable_ {},
|
||||||
|
|
@ -74,6 +79,9 @@ public:
|
||||||
wsr88d::rda::DataBlockType dataBlockType_;
|
wsr88d::rda::DataBlockType dataBlockType_;
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager_;
|
std::shared_ptr<manager::RadarProductManager> radarProductManager_;
|
||||||
|
|
||||||
|
float selectedElevation_;
|
||||||
|
|
||||||
|
std::shared_ptr<wsr88d::rda::ElevationScan> elevationScan_;
|
||||||
std::shared_ptr<wsr88d::rda::MomentDataBlock> momentDataBlock0_;
|
std::shared_ptr<wsr88d::rda::MomentDataBlock> momentDataBlock0_;
|
||||||
|
|
||||||
std::vector<float> vertices_;
|
std::vector<float> vertices_;
|
||||||
|
|
@ -81,10 +89,11 @@ public:
|
||||||
std::vector<uint16_t> dataMoments16_;
|
std::vector<uint16_t> dataMoments16_;
|
||||||
std::vector<uint8_t> cfpMoments_;
|
std::vector<uint8_t> cfpMoments_;
|
||||||
|
|
||||||
float latitude_;
|
float latitude_;
|
||||||
float longitude_;
|
float longitude_;
|
||||||
float elevation_;
|
float elevationCut_;
|
||||||
float range_;
|
std::vector<float> elevationCuts_;
|
||||||
|
float range_;
|
||||||
|
|
||||||
std::chrono::system_clock::time_point sweepTime_;
|
std::chrono::system_clock::time_point sweepTime_;
|
||||||
|
|
||||||
|
|
@ -100,8 +109,10 @@ public:
|
||||||
|
|
||||||
Level2ProductView::Level2ProductView(
|
Level2ProductView::Level2ProductView(
|
||||||
common::Level2Product product,
|
common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
|
std::shared_ptr<manager::RadarProductManager> radarProductManager) :
|
||||||
p(std::make_unique<Level2ProductViewImpl>(product, radarProductManager))
|
p(std::make_unique<Level2ProductViewImpl>(
|
||||||
|
product, elevation, radarProductManager))
|
||||||
{
|
{
|
||||||
connect(radarProductManager.get(),
|
connect(radarProductManager.get(),
|
||||||
&manager::RadarProductManager::Level2DataLoaded,
|
&manager::RadarProductManager::Level2DataLoaded,
|
||||||
|
|
@ -127,7 +138,7 @@ Level2ProductView::color_table(uint16_t& minValue, uint16_t& maxValue) const
|
||||||
|
|
||||||
float Level2ProductView::elevation() const
|
float Level2ProductView::elevation() const
|
||||||
{
|
{
|
||||||
return p->elevation_;
|
return p->elevationCut_;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Level2ProductView::range() const
|
float Level2ProductView::range() const
|
||||||
|
|
@ -145,6 +156,11 @@ const std::vector<float>& Level2ProductView::vertices() const
|
||||||
return p->vertices_;
|
return p->vertices_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<float> Level2ProductView::GetElevationCuts() const
|
||||||
|
{
|
||||||
|
return p->elevationCuts_;
|
||||||
|
}
|
||||||
|
|
||||||
std::tuple<const void*, size_t, size_t> Level2ProductView::GetMomentData() const
|
std::tuple<const void*, size_t, size_t> Level2ProductView::GetMomentData() const
|
||||||
{
|
{
|
||||||
const void* data;
|
const void* data;
|
||||||
|
|
@ -190,6 +206,12 @@ void Level2ProductView::LoadColorTable(
|
||||||
UpdateColorTable();
|
UpdateColorTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Level2ProductView::SelectElevation(float elevation)
|
||||||
|
{
|
||||||
|
p->selectedElevation_ = elevation;
|
||||||
|
util::async([=]() { ComputeSweep(); });
|
||||||
|
}
|
||||||
|
|
||||||
void Level2ProductView::UpdateColorTable()
|
void Level2ProductView::UpdateColorTable()
|
||||||
{
|
{
|
||||||
if (p->momentDataBlock0_ == nullptr || //
|
if (p->momentDataBlock0_ == nullptr || //
|
||||||
|
|
@ -246,6 +268,7 @@ void Level2ProductView::UpdateColorTable()
|
||||||
|
|
||||||
std::vector<boost::gil::rgba8_pixel_t>& lut = p->colorTableLut_;
|
std::vector<boost::gil::rgba8_pixel_t>& lut = p->colorTableLut_;
|
||||||
lut.resize(rangeMax - rangeMin + 1);
|
lut.resize(rangeMax - rangeMin + 1);
|
||||||
|
lut.shrink_to_fit();
|
||||||
|
|
||||||
std::for_each(std::execution::par_unseq,
|
std::for_each(std::execution::par_unseq,
|
||||||
dataRange.begin(),
|
dataRange.begin(),
|
||||||
|
|
@ -283,12 +306,12 @@ void Level2ProductView::ComputeSweep()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Pick this based on view settings
|
|
||||||
float elevation;
|
float elevation;
|
||||||
std::shared_ptr<wsr88d::rda::ElevationScan> radarData;
|
std::shared_ptr<wsr88d::rda::ElevationScan> radarData;
|
||||||
std::tie(elevation, radarData) =
|
std::tie(radarData, p->elevationCut_, p->elevationCuts_) =
|
||||||
p->radarProductManager_->GetLevel2Data(p->dataBlockType_, 0.0f);
|
p->radarProductManager_->GetLevel2Data(p->dataBlockType_,
|
||||||
if (radarData == nullptr)
|
p->selectedElevation_);
|
||||||
|
if (radarData == nullptr || radarData == p->elevationScan_)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -303,6 +326,7 @@ void Level2ProductView::ComputeSweep()
|
||||||
|
|
||||||
auto radarData0 = (*radarData)[0];
|
auto radarData0 = (*radarData)[0];
|
||||||
auto momentData0 = radarData0->moment_data_block(p->dataBlockType_);
|
auto momentData0 = radarData0->moment_data_block(p->dataBlockType_);
|
||||||
|
p->elevationScan_ = radarData;
|
||||||
p->momentDataBlock0_ = momentData0;
|
p->momentDataBlock0_ = momentData0;
|
||||||
|
|
||||||
if (momentData0 == nullptr)
|
if (momentData0 == nullptr)
|
||||||
|
|
@ -318,7 +342,6 @@ 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);
|
||||||
|
|
@ -533,19 +556,23 @@ void Level2ProductView::ComputeSweep()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vertices.resize(vIndex);
|
vertices.resize(vIndex);
|
||||||
|
vertices.shrink_to_fit();
|
||||||
|
|
||||||
if (momentData0->data_word_size() == 8)
|
if (momentData0->data_word_size() == 8)
|
||||||
{
|
{
|
||||||
dataMoments8.resize(mIndex);
|
dataMoments8.resize(mIndex);
|
||||||
|
dataMoments8.shrink_to_fit();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dataMoments16.resize(mIndex);
|
dataMoments16.resize(mIndex);
|
||||||
|
dataMoments16.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfpMoments.size() > 0)
|
if (cfpMoments.size() > 0)
|
||||||
{
|
{
|
||||||
cfpMoments.resize(mIndex);
|
cfpMoments.resize(mIndex);
|
||||||
|
cfpMoments.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
timer.stop();
|
timer.stop();
|
||||||
|
|
@ -559,9 +586,11 @@ void Level2ProductView::ComputeSweep()
|
||||||
|
|
||||||
std::shared_ptr<Level2ProductView> Level2ProductView::Create(
|
std::shared_ptr<Level2ProductView> Level2ProductView::Create(
|
||||||
common::Level2Product product,
|
common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
||||||
{
|
{
|
||||||
return std::make_shared<Level2ProductView>(product, radarProductManager);
|
return std::make_shared<Level2ProductView>(
|
||||||
|
product, elevation, radarProductManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace view
|
} // namespace view
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ class Level2ProductView : public RadarProductView
|
||||||
public:
|
public:
|
||||||
explicit Level2ProductView(
|
explicit Level2ProductView(
|
||||||
common::Level2Product product,
|
common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
||||||
~Level2ProductView();
|
~Level2ProductView();
|
||||||
|
|
||||||
|
|
@ -36,12 +37,15 @@ public:
|
||||||
const std::vector<float>& vertices() const override;
|
const std::vector<float>& vertices() const override;
|
||||||
|
|
||||||
void LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) override;
|
void LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) override;
|
||||||
|
void SelectElevation(float elevation) override;
|
||||||
|
|
||||||
|
std::vector<float> GetElevationCuts() const override;
|
||||||
std::tuple<const void*, size_t, size_t> GetMomentData() const override;
|
std::tuple<const void*, size_t, size_t> GetMomentData() const override;
|
||||||
std::tuple<const void*, size_t, size_t> GetCfpMomentData() const override;
|
std::tuple<const void*, size_t, size_t> GetCfpMomentData() const override;
|
||||||
|
|
||||||
static std::shared_ptr<Level2ProductView>
|
static std::shared_ptr<Level2ProductView>
|
||||||
Create(common::Level2Product product,
|
Create(common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,13 @@ void RadarProductView::Initialize()
|
||||||
ComputeSweep();
|
ComputeSweep();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RadarProductView::SelectElevation(float elevation) {}
|
||||||
|
|
||||||
|
std::vector<float> RadarProductView::GetElevationCuts() const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
std::tuple<const void*, size_t, size_t>
|
std::tuple<const void*, size_t, size_t>
|
||||||
RadarProductView::GetCfpMomentData() const
|
RadarProductView::GetCfpMomentData() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,9 @@ public:
|
||||||
void Initialize();
|
void Initialize();
|
||||||
virtual void
|
virtual void
|
||||||
LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) = 0;
|
LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) = 0;
|
||||||
|
virtual void SelectElevation(float elevation);
|
||||||
|
|
||||||
|
virtual std::vector<float> GetElevationCuts() const;
|
||||||
virtual std::tuple<const void*, size_t, size_t> GetMomentData() const = 0;
|
virtual std::tuple<const void*, size_t, size_t> GetMomentData() const = 0;
|
||||||
virtual std::tuple<const void*, size_t, size_t> GetCfpMomentData() const;
|
virtual std::tuple<const void*, size_t, size_t> GetCfpMomentData() const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ typedef std::function<std::shared_ptr<RadarProductView>(
|
||||||
std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
||||||
const std::string& productGroup,
|
const std::string& productGroup,
|
||||||
const std::string& productName,
|
const std::string& productName,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
||||||
{
|
{
|
||||||
std::shared_ptr<RadarProductView> view = nullptr;
|
std::shared_ptr<RadarProductView> view = nullptr;
|
||||||
|
|
@ -36,7 +37,7 @@ std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
view = Create(product, radarProductManager);
|
view = Create(product, elevation, radarProductManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -50,9 +51,10 @@ std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
||||||
|
|
||||||
std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
std::shared_ptr<RadarProductView> RadarProductViewFactory::Create(
|
||||||
common::Level2Product product,
|
common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
std::shared_ptr<manager::RadarProductManager> radarProductManager)
|
||||||
{
|
{
|
||||||
return Level2ProductView::Create(product, radarProductManager);
|
return Level2ProductView::Create(product, elevation, radarProductManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace view
|
} // namespace view
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,11 @@ public:
|
||||||
static std::shared_ptr<RadarProductView>
|
static std::shared_ptr<RadarProductView>
|
||||||
Create(const std::string& productGroup,
|
Create(const std::string& productGroup,
|
||||||
const std::string& productName,
|
const std::string& productName,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
||||||
static std::shared_ptr<RadarProductView>
|
static std::shared_ptr<RadarProductView>
|
||||||
Create(common::Level2Product product,
|
Create(common::Level2Product product,
|
||||||
|
float elevation,
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
std::shared_ptr<manager::RadarProductManager> radarProductManager);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
14
wxdata/include/scwx/common/characters.hpp
Normal file
14
wxdata/include/scwx/common/characters.hpp
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace common
|
||||||
|
{
|
||||||
|
namespace Characters
|
||||||
|
{
|
||||||
|
|
||||||
|
constexpr char DEGREE = static_cast<char>(0xb0);
|
||||||
|
|
||||||
|
} // namespace Characters
|
||||||
|
} // namespace common
|
||||||
|
} // namespace scwx
|
||||||
|
|
@ -40,7 +40,7 @@ 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::pair<float, std::shared_ptr<rda::ElevationScan>>
|
std::tuple<std::shared_ptr<rda::ElevationScan>, float, std::vector<float>>
|
||||||
GetElevationScan(rda::DataBlockType dataBlockType,
|
GetElevationScan(rda::DataBlockType dataBlockType,
|
||||||
float elevation,
|
float elevation,
|
||||||
std::chrono::system_clock::time_point time) const;
|
std::chrono::system_clock::time_point time) const;
|
||||||
|
|
|
||||||
|
|
@ -106,15 +106,19 @@ std::shared_ptr<const rda::VolumeCoveragePatternData> Ar2vFile::vcp_data() const
|
||||||
return p->vcpData_;
|
return p->vcpData_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<float, std::shared_ptr<rda::ElevationScan>>
|
std::tuple<std::shared_ptr<rda::ElevationScan>, float, std::vector<float>>
|
||||||
Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
|
Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
|
||||||
float elevation,
|
float elevation,
|
||||||
std::chrono::system_clock::time_point time) const
|
std::chrono::system_clock::time_point time) const
|
||||||
{
|
{
|
||||||
|
BOOST_LOG_TRIVIAL(debug)
|
||||||
|
<< logPrefix_ << "GetElevationScan: " << elevation << " degrees";
|
||||||
|
|
||||||
constexpr float scaleFactor = 8.0f / 0.043945f;
|
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;
|
float elevationCut = 0.0f;
|
||||||
|
std::vector<float> elevationCuts;
|
||||||
|
|
||||||
uint16_t codedElevation =
|
uint16_t codedElevation =
|
||||||
static_cast<uint16_t>(std::lroundf(elevation * scaleFactor));
|
static_cast<uint16_t>(std::lroundf(elevation * scaleFactor));
|
||||||
|
|
@ -128,14 +132,16 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
|
||||||
|
|
||||||
for (auto scan : scans)
|
for (auto scan : scans)
|
||||||
{
|
{
|
||||||
if (scan.first > lowerBound && scan.first < codedElevation)
|
if (scan.first > lowerBound && scan.first <= codedElevation)
|
||||||
{
|
{
|
||||||
lowerBound = scan.first;
|
lowerBound = scan.first;
|
||||||
}
|
}
|
||||||
if (scan.first < upperBound && scan.first > codedElevation)
|
if (scan.first < upperBound && scan.first >= codedElevation)
|
||||||
{
|
{
|
||||||
upperBound = scan.first;
|
upperBound = scan.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elevationCuts.push_back(scan.first / scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t lowerDelta = std::abs(static_cast<int32_t>(codedElevation) -
|
uint16_t lowerDelta = std::abs(static_cast<int32_t>(codedElevation) -
|
||||||
|
|
@ -145,17 +151,17 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
|
||||||
|
|
||||||
if (lowerDelta < upperDelta)
|
if (lowerDelta < upperDelta)
|
||||||
{
|
{
|
||||||
elevationFound = lowerBound / scaleFactor;
|
elevationScan = scans.at(lowerBound);
|
||||||
elevationScan = scans.at(lowerBound);
|
elevationCut = lowerBound / scaleFactor;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elevationFound = upperBound / scaleFactor;
|
elevationScan = scans.at(upperBound);
|
||||||
elevationScan = scans.at(upperBound);
|
elevationCut = upperBound / scaleFactor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair(elevationFound, elevationScan);
|
return std::tie(elevationScan, elevationCut, elevationCuts);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ar2vFile::LoadFile(const std::string& filename)
|
bool Ar2vFile::LoadFile(const std::string& filename)
|
||||||
|
|
@ -373,10 +379,8 @@ void Ar2vFileImpl::IndexFile()
|
||||||
rda::MomentDataBlockTypeIterator())
|
rda::MomentDataBlockTypeIterator())
|
||||||
{
|
{
|
||||||
if (dataBlockType == rda::DataBlockType::MomentRef &&
|
if (dataBlockType == rda::DataBlockType::MomentRef &&
|
||||||
(waveformType ==
|
waveformType ==
|
||||||
rda::WaveformType::ContiguousDopplerWithAmbiguityResolution ||
|
rda::WaveformType::ContiguousDopplerWithAmbiguityResolution)
|
||||||
waveformType == rda::WaveformType::
|
|
||||||
ContiguousDopplerWithoutAmbiguityResolution))
|
|
||||||
{
|
{
|
||||||
// Reflectivity data is contained within both surveillance and
|
// Reflectivity data is contained within both surveillance and
|
||||||
// doppler modes. Surveillance mode produces a better image.
|
// doppler modes. Surveillance mode produces a better image.
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@ project(scwx-data)
|
||||||
|
|
||||||
find_package(Boost)
|
find_package(Boost)
|
||||||
|
|
||||||
set(HDR_COMMON include/scwx/common/color_table.hpp
|
set(HDR_COMMON include/scwx/common/characters.hpp
|
||||||
|
include/scwx/common/color_table.hpp
|
||||||
include/scwx/common/constants.hpp
|
include/scwx/common/constants.hpp
|
||||||
include/scwx/common/products.hpp
|
include/scwx/common/products.hpp
|
||||||
include/scwx/common/types.hpp)
|
include/scwx/common/types.hpp)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue