From 41b491314b62b6a77459c65afb18111ac67084e2 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 8 Apr 2022 18:37:47 -0500 Subject: [PATCH] TDWR range updates --- .../scwx/qt/manager/radar_product_manager.cpp | 17 +++++++++++++---- .../scwx/qt/manager/radar_product_manager.hpp | 1 + .../scwx/qt/view/level2_product_view.cpp | 13 ++++++++++--- .../source/scwx/qt/view/level3_radial_view.cpp | 18 +++++++++--------- .../source/scwx/qt/view/level3_radial_view.hpp | 1 - .../wsr88d/rpg/product_description_block.cpp | 4 ++-- 6 files changed, 35 insertions(+), 19 deletions(-) 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 1497bcf0..a2bb45c5 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -104,13 +104,20 @@ RadarProductManager::coordinates(common::RadialSize radialSize) const { switch (radialSize) { - case common::RadialSize::_0_5Degree: return p->coordinates0_5Degree_; - case common::RadialSize::_1Degree: return p->coordinates1Degree_; + case common::RadialSize::_0_5Degree: + return p->coordinates0_5Degree_; + case common::RadialSize::_1Degree: + return p->coordinates1Degree_; } throw std::exception("Invalid radial size"); } +float RadarProductManager::gate_size() const +{ + return (p->radarSite_->type() == "tdwr") ? 150.0f : 250.0f; +} + std::shared_ptr RadarProductManager::radar_site() const { return p->radarSite_; @@ -133,6 +140,8 @@ void RadarProductManager::Initialize() const QMapbox::Coordinate radar(p->radarSite_->latitude(), p->radarSite_->longitude()); + const float gateSize = gate_size(); + // Calculate half degree azimuth coordinates timer.start(); std::vector& coordinates0_5Degree = p->coordinates0_5Degree_; @@ -154,7 +163,7 @@ void RadarProductManager::Initialize() static_cast(radialGate / common::MAX_DATA_MOMENT_GATES); const float angle = radial * 0.5f - 0.25f; // 0.5 degree radial - const float range = (gate + 1) * 250.0f; // 0.25km gate size + const float range = (gate + 1) * gateSize; const size_t offset = radialGate * 2; double latitude; @@ -192,7 +201,7 @@ void RadarProductManager::Initialize() static_cast(radialGate / common::MAX_DATA_MOMENT_GATES); const float angle = radial * 1.0f - 0.5f; // 1 degree radial - const float range = (gate + 1) * 250.0f; // 0.25km gate size + const float range = (gate + 1) * gateSize; const size_t offset = radialGate * 2; double latitude; 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 fa73c810..c58bb705 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -30,6 +30,7 @@ public: ~RadarProductManager(); const std::vector& coordinates(common::RadialSize radialSize) const; + float gate_size() const; std::shared_ptr radar_site() const; void Initialize(); diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index 15028e82..6158da0c 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -60,7 +60,10 @@ public: colorTable_ {}, colorTableLut_ {}, colorTableMin_ {2}, - colorTableMax_ {254} + colorTableMax_ {254}, + savedColorTable_ {nullptr}, + savedScale_ {0.0f}, + savedOffset_ {0.0f} { auto it = blockTypes_.find(product); @@ -471,10 +474,14 @@ void Level2ProductView::ComputeSweep() const uint16_t dataMomentIntervalH = dataMomentInterval / 2; // Compute gate size (number of base 250m gates per bin) - const uint16_t gateSize = std::max(1, dataMomentInterval / 250); + const uint16_t gateSizeMeters = + static_cast(p->radarProductManager_->gate_size()); + const uint16_t gateSize = + std::max(1, dataMomentInterval / gateSizeMeters); // Compute gate range [startGate, endGate) - const uint16_t startGate = (dataMomentRange - dataMomentIntervalH) / 250; + const uint16_t startGate = + (dataMomentRange - dataMomentIntervalH) / gateSizeMeters; const uint16_t numberOfDataMomentGates = std::min(momentData->number_of_data_moment_gates(), static_cast(gates)); diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp index 63df3a25..a0953ec3 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -40,7 +40,10 @@ public: colorTable_ {}, colorTableLut_ {}, colorTableMin_ {2}, - colorTableMax_ {254} + colorTableMax_ {254}, + savedColorTable_ {nullptr}, + savedScale_ {0.0f}, + savedOffset_ {0.0f} { } ~Level3RadialViewImpl() = default; @@ -48,7 +51,6 @@ public: std::string product_; std::shared_ptr radarProductManager_; - float selectedElevation_; std::chrono::system_clock::time_point selectedTime_; std::shared_ptr graphicMessage_; @@ -168,11 +170,6 @@ void Level3RadialView::LoadColorTable( UpdateColorTable(); } -void Level3RadialView::SelectElevation(float elevation) -{ - p->selectedElevation_ = elevation; -} - void Level3RadialView::SelectTime(std::chrono::system_clock::time_point time) { p->selectedTime_ = time; @@ -435,8 +432,11 @@ void Level3RadialView::ComputeSweep() const uint16_t dataMomentIntervalH = dataMomentInterval / 2; const uint16_t dataMomentRange = dataMomentIntervalH; - // Compute gate size (number of base 250m gates per bin) - const uint16_t gateSize = std::max(1, dataMomentInterval / 250); + // Compute gate size (number of base gates per bin) + const uint16_t gateSize = std::max( + 1, + dataMomentInterval / + static_cast(p->radarProductManager_->gate_size())); // Compute gate range [startGate, endGate) const uint16_t startGate = 0; diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp index d6756963..a1134d80 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -37,7 +37,6 @@ public: const std::vector& vertices() const override; void LoadColorTable(std::shared_ptr colorTable) override; - void SelectElevation(float elevation) override; void SelectTime(std::chrono::system_clock::time_point time) override; void Update() override; diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 791177a0..1cee8fd3 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -35,8 +35,8 @@ static const std::unordered_map rangeMap_ { {151, 230}, {153, 460}, {154, 300}, {155, 300}, {159, 300}, {161, 300}, {163, 300}, {165, 300}, {166, 230}, {167, 300}, {168, 300}, {169, 230}, {170, 230}, {171, 230}, {172, 230}, {173, 230}, {174, 230}, {175, 230}, - {176, 230}, {177, 230}, {178, 300}, {179, 300}, {180, 90}, {181, 90}, - {182, 90}, {184, 90}, {186, 415}, {193, 460}, {195, 460}, {196, 50}}; + {176, 230}, {177, 230}, {178, 300}, {179, 300}, {180, 89}, {181, 89}, + {182, 89}, {184, 89}, {186, 412}, {193, 460}, {195, 460}, {196, 50}}; static const std::unordered_map xResolutionMap_ { {19, 1000}, {20, 2000}, {27, 1000}, {30, 1000}, {31, 2000}, {32, 1000},