From 3620bfd13ac22b82caa5a30ec09f99f4e7ddf01b Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 2 Feb 2022 11:07:25 -0600 Subject: [PATCH] Get coordinates from radar site configuration --- scwx-qt/source/scwx/qt/config/radar_site.cpp | 11 ++++ scwx-qt/source/scwx/qt/config/radar_site.hpp | 1 + scwx-qt/source/scwx/qt/main/main.cpp | 2 + .../scwx/qt/manager/radar_product_manager.cpp | 60 ++++++++++++------- .../scwx/qt/manager/radar_product_manager.hpp | 4 +- scwx-qt/source/scwx/qt/map/map_widget.cpp | 23 +++++-- .../source/scwx/qt/map/radar_range_layer.cpp | 23 ++++--- .../source/scwx/qt/map/radar_range_layer.hpp | 5 +- 8 files changed, 93 insertions(+), 36 deletions(-) diff --git a/scwx-qt/source/scwx/qt/config/radar_site.cpp b/scwx-qt/source/scwx/qt/config/radar_site.cpp index 14e50530..6a0c28a8 100644 --- a/scwx-qt/source/scwx/qt/config/radar_site.cpp +++ b/scwx-qt/source/scwx/qt/config/radar_site.cpp @@ -14,6 +14,9 @@ namespace config static const std::string logPrefix_ = "[scwx::qt::settings::radar_site] "; +static const std::string defaultRadarSiteFile_ = + ":/res/config/radar_sites.json"; + static std::unordered_map> radarSiteMap_; @@ -97,8 +100,16 @@ std::shared_ptr RadarSite::Get(const std::string& id) return radarSite; } +void RadarSite::Initialize() +{ + ReadConfig(defaultRadarSiteFile_); +} + size_t RadarSite::ReadConfig(const std::string& path) { + BOOST_LOG_TRIVIAL(info) << logPrefix_ << "Loading radar sites from \"" + << path << "\"..."; + bool dataValid = true; size_t sitesAdded = 0; diff --git a/scwx-qt/source/scwx/qt/config/radar_site.hpp b/scwx-qt/source/scwx/qt/config/radar_site.hpp index 91d7fdf4..c67594c4 100644 --- a/scwx-qt/source/scwx/qt/config/radar_site.hpp +++ b/scwx-qt/source/scwx/qt/config/radar_site.hpp @@ -34,6 +34,7 @@ public: static std::shared_ptr Get(const std::string& id); + static void Initialize(); static size_t ReadConfig(const std::string& path); private: diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index c70dbff0..56b9ffe1 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -13,6 +14,7 @@ int main(int argc, char* argv[]) QCoreApplication::setApplicationName("Supercell Wx"); + scwx::qt::config::RadarSite::Initialize(); scwx::qt::manager::SettingsManager::Initialize(); scwx::qt::manager::ResourceManager::PreLoad(); diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp index 334b47ac..277a32b9 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -38,15 +39,25 @@ static std::unordered_map> class RadarProductManagerImpl { public: - explicit RadarProductManagerImpl(const std::string& radarSite) : - radarSite_ {radarSite}, initialized_ {false} + explicit RadarProductManagerImpl(const std::string& radarId) : + radarId_ {radarId}, + initialized_ {false}, + radarSite_ {config::RadarSite::Get(radarId)} { + if (radarSite_ == nullptr) + { + BOOST_LOG_TRIVIAL(warning) + << logPrefix_ << "Radar site not found: \"" << radarId_ << "\""; + radarSite_ = std::make_shared(); + } } ~RadarProductManagerImpl() = default; - std::string radarSite_; + std::string radarId_; bool initialized_; + std::shared_ptr radarSite_; + std::vector coordinates0_5Degree_; std::vector coordinates1Degree_; @@ -57,8 +68,8 @@ public: std::mutex fileLoadMutex_; }; -RadarProductManager::RadarProductManager(const std::string& radarSite) : - p(std::make_unique(radarSite)) +RadarProductManager::RadarProductManager(const std::string& radarId) : + p(std::make_unique(radarId)) { } RadarProductManager::~RadarProductManager() = default; @@ -75,6 +86,11 @@ RadarProductManager::coordinates(common::RadialSize radialSize) const throw std::exception("Invalid radial size"); } +std::shared_ptr RadarProductManager::radar_site() const +{ + return p->radarSite_; +} + std::shared_ptr RadarProductManager::level2_data() const { std::shared_ptr level2Data = nullptr; @@ -101,8 +117,8 @@ void RadarProductManager::Initialize() GeographicLib::Geodesic geodesic(GeographicLib::Constants::WGS84_a(), GeographicLib::Constants::WGS84_f()); - // TODO: This should be retrieved from configuration - const QMapbox::Coordinate radar(38.6986, -90.6828); + const QMapbox::Coordinate radar(p->radarSite_->latitude(), + p->radarSite_->longitude()); // Calculate half degree azimuth coordinates timer.start(); @@ -117,7 +133,8 @@ void RadarProductManager::Initialize() std::execution::par_unseq, radialGates0_5Degree.begin(), radialGates0_5Degree.end(), - [&](uint32_t radialGate) { + [&](uint32_t radialGate) + { const uint16_t gate = static_cast(radialGate % common::MAX_DATA_MOMENT_GATES); const uint16_t radial = @@ -154,7 +171,8 @@ void RadarProductManager::Initialize() std::execution::par_unseq, radialGates1Degree.begin(), radialGates1Degree.end(), - [&](uint32_t radialGate) { + [&](uint32_t radialGate) + { const uint16_t gate = static_cast(radialGate % common::MAX_DATA_MOMENT_GATES); const uint16_t radial = @@ -221,19 +239,21 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, } else { - scwx::util::async([&]() { - std::lock_guard guard(p->fileLoadMutex_); - - BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Start load"; - - QString filename = qgetenv("AR2V_FILE"); - if (!filename.isEmpty() && p->level2VolumeScans_.size() == 0) + scwx::util::async( + [&]() { - LoadLevel2Data(filename.toUtf8().constData()); - } + std::lock_guard guard(p->fileLoadMutex_); - BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "End load"; - }); + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Start load"; + + QString filename = qgetenv("AR2V_FILE"); + if (!filename.isEmpty() && p->level2VolumeScans_.size() == 0) + { + LoadLevel2Data(filename.toUtf8().constData()); + } + + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "End load"; + }); } return std::tie(radarData, elevationCut, elevationCuts); diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp index ba16c112..73d54b30 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -22,10 +23,11 @@ class RadarProductManager : public QObject Q_OBJECT public: - explicit RadarProductManager(const std::string& radarSite); + explicit RadarProductManager(const std::string& radarId); ~RadarProductManager(); const std::vector& coordinates(common::RadialSize radialSize) const; + std::shared_ptr radar_site() const; // TODO: Improve this interface std::shared_ptr level2_data() const; diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 5d27d97f..bc355d49 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -211,7 +211,13 @@ void MapWidget::SelectRadarProduct(common::Level2Product product) this, [&]() { - RadarRangeLayer::Update(p->map_, radarProductView->range()); + std::shared_ptr radarSite = + p->radarProductManager_->radar_site(); + + RadarRangeLayer::Update( + p->map_, + radarProductView->range(), + {radarSite->latitude(), radarSite->longitude()}); update(); emit RadarSweepUpdated(); }, @@ -301,6 +307,9 @@ void MapWidget::AddLayers() std::unique_ptr pColorTableHost = std::make_unique(p->colorTableLayer_); + std::shared_ptr radarSite = + p->radarProductManager_->radar_site(); + QString before = "ferry"; for (const QString& layer : p->map_->layerIds()) @@ -315,8 +324,9 @@ void MapWidget::AddLayers() } p->map_->addCustomLayer("radar", std::move(pHost), before); - RadarRangeLayer::Add( - p->map_, p->context_->radarProductView_->range(), before); + RadarRangeLayer::Add(p->map_, + p->context_->radarProductView_->range(), + {radarSite->latitude(), radarSite->longitude()}); p->map_->addCustomLayer("colorTable", std::move(pColorTableHost)); p->map_->addCustomLayer("overlay", std::move(pOverlayHost)); } @@ -421,8 +431,11 @@ void MapWidget::initializeGL() p.get(), &MapWidgetImpl::Update); - // Set default location to KLSX. - p->map_->setCoordinateZoom(QMapbox::Coordinate(38.6986, -90.6828), 9); + // Set default location to radar site + std::shared_ptr radarSite = + p->radarProductManager_->radar_site(); + p->map_->setCoordinateZoom({radarSite->latitude(), radarSite->longitude()}, + 9); p->UpdateStoredMapParameters(); QString styleUrl = qgetenv("MAPBOX_STYLE_URL"); diff --git a/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp index de171913..96798080 100644 --- a/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_range_layer.cpp @@ -13,10 +13,12 @@ namespace map static const std::string logPrefix_ = "[scwx::qt::map::radar_range_layer] "; -static std::shared_ptr GetRangeCircle(float range); +static std::shared_ptr +GetRangeCircle(float range, QMapbox::Coordinate center); void RadarRangeLayer::Add(std::shared_ptr map, float range, + QMapbox::Coordinate center, const QString& before) { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Add()"; @@ -30,7 +32,8 @@ void RadarRangeLayer::Add(std::shared_ptr map, map->removeSource("rangeCircleSource"); } - std::shared_ptr rangeCircle = GetRangeCircle(range); + std::shared_ptr rangeCircle = + GetRangeCircle(range, center); map->addSource( "rangeCircleSource", @@ -43,15 +46,19 @@ void RadarRangeLayer::Add(std::shared_ptr map, "rangeCircleLayer", "line-color", "rgba(128, 128, 128, 128)"); } -void RadarRangeLayer::Update(std::shared_ptr map, float range) +void RadarRangeLayer::Update(std::shared_ptr map, + float range, + QMapbox::Coordinate center) { - std::shared_ptr rangeCircle = GetRangeCircle(range); + std::shared_ptr rangeCircle = + GetRangeCircle(range, center); map->updateSource("rangeCircleSource", {{"data", QVariant::fromValue(*rangeCircle)}}); } -static std::shared_ptr GetRangeCircle(float range) +static std::shared_ptr +GetRangeCircle(float range, QMapbox::Coordinate center) { GeographicLib::Geodesic geodesic(GeographicLib::Constants::WGS84_a(), GeographicLib::Constants::WGS84_f()); @@ -59,8 +66,6 @@ static std::shared_ptr GetRangeCircle(float range) constexpr float angleDelta = 0.5f; constexpr float angleDeltaH = angleDelta / 2.0f; - const QMapbox::Coordinate radar {38.6986, -90.6828}; - float angle = -angleDeltaH; QMapbox::Coordinates geometry; @@ -70,8 +75,8 @@ static std::shared_ptr GetRangeCircle(float range) double latitude; double longitude; - geodesic.Direct(radar.first, - radar.second, + geodesic.Direct(center.first, + center.second, angle, range * 1000.0f, latitude, diff --git a/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp b/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp index 8b892c31..b1f5f066 100644 --- a/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp +++ b/scwx-qt/source/scwx/qt/map/radar_range_layer.hpp @@ -13,8 +13,11 @@ namespace RadarRangeLayer void Add(std::shared_ptr map, float range, + QMapbox::Coordinate center, const QString& before = QString()); -void Update(std::shared_ptr map, float range); +void Update(std::shared_ptr map, + float range, + QMapbox::Coordinate center); } // namespace RadarRangeLayer } // namespace map