mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-11-04 14:10:06 +00:00 
			
		
		
		
	partiallaly complete merging of radar data
This commit is contained in:
		
							parent
							
								
									ac6d6093ec
								
							
						
					
					
						commit
						8b7a3e9781
					
				
					 4 changed files with 157 additions and 2 deletions
				
			
		| 
						 | 
					@ -1525,6 +1525,16 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
 | 
				
			||||||
   //TODO decide when to use chunked vs archived data.
 | 
					   //TODO decide when to use chunked vs archived data.
 | 
				
			||||||
   if (true)
 | 
					   if (true)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
 | 
					      auto currentFile = std::dynamic_pointer_cast<wsr88d::Ar2vFile>(
 | 
				
			||||||
 | 
					         p->level2ChunksProviderManager_->provider_->LoadLatestObject());
 | 
				
			||||||
 | 
					      auto lastFile = std::dynamic_pointer_cast<wsr88d::Ar2vFile>(
 | 
				
			||||||
 | 
					         p->level2ChunksProviderManager_->provider_->LoadSecondLatestObject());
 | 
				
			||||||
 | 
					      auto radarFile =
 | 
				
			||||||
 | 
					         std::make_shared<wsr88d::Ar2vFile>(currentFile, lastFile);
 | 
				
			||||||
 | 
					      std::tie(radarData, elevationCut, elevationCuts) =
 | 
				
			||||||
 | 
					         radarFile->GetElevationScan(dataBlockType, elevation, time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*
 | 
				
			||||||
      auto currentFile = std::dynamic_pointer_cast<wsr88d::Ar2vFile>(
 | 
					      auto currentFile = std::dynamic_pointer_cast<wsr88d::Ar2vFile>(
 | 
				
			||||||
         p->level2ChunksProviderManager_->provider_->LoadLatestObject());
 | 
					         p->level2ChunksProviderManager_->provider_->LoadLatestObject());
 | 
				
			||||||
      std::shared_ptr<wsr88d::rda::ElevationScan> currentRadarData = nullptr;
 | 
					      std::shared_ptr<wsr88d::rda::ElevationScan> currentRadarData = nullptr;
 | 
				
			||||||
| 
						 | 
					@ -1587,6 +1597,7 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
 | 
				
			||||||
         elevationCuts = std::move(lastElevationCuts);
 | 
					         elevationCuts = std::move(lastElevationCuts);
 | 
				
			||||||
         foundTime     = collectionTime;
 | 
					         foundTime     = collectionTime;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      */
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   else
 | 
					   else
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,8 @@ public:
 | 
				
			||||||
   Ar2vFile(Ar2vFile&&) noexcept;
 | 
					   Ar2vFile(Ar2vFile&&) noexcept;
 | 
				
			||||||
   Ar2vFile& operator=(Ar2vFile&&) noexcept;
 | 
					   Ar2vFile& operator=(Ar2vFile&&) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Ar2vFile(std::shared_ptr<Ar2vFile> current, std::shared_ptr<Ar2vFile> last);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   std::uint32_t julian_date() const;
 | 
					   std::uint32_t julian_date() const;
 | 
				
			||||||
   std::uint32_t milliseconds() const;
 | 
					   std::uint32_t milliseconds() const;
 | 
				
			||||||
   std::string   icao() const;
 | 
					   std::string   icao() const;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -676,12 +676,10 @@ std::pair<size_t, size_t> AwsLevel2ChunksDataProvider::Refresh()
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   if (p->lastScan_.valid_)
 | 
					   if (p->lastScan_.valid_)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      /*
 | 
					 | 
				
			||||||
      if (p->LoadScan(p->lastScan_))
 | 
					      if (p->LoadScan(p->lastScan_))
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         newObjects += 1;
 | 
					         newObjects += 1;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      */
 | 
					 | 
				
			||||||
      totalObjects += 1;
 | 
					      totalObjects += 1;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,9 +5,11 @@
 | 
				
			||||||
#include <scwx/util/logger.hpp>
 | 
					#include <scwx/util/logger.hpp>
 | 
				
			||||||
#include <scwx/util/rangebuf.hpp>
 | 
					#include <scwx/util/rangebuf.hpp>
 | 
				
			||||||
#include <scwx/util/time.hpp>
 | 
					#include <scwx/util/time.hpp>
 | 
				
			||||||
 | 
					#include <scwx/common/geographic.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <fstream>
 | 
					#include <fstream>
 | 
				
			||||||
#include <sstream>
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					#include <set>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
#   pragma warning(push)
 | 
					#   pragma warning(push)
 | 
				
			||||||
| 
						 | 
					@ -539,5 +541,147 @@ bool Ar2vFile::IndexFile()
 | 
				
			||||||
   return true;
 | 
					   return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO not good
 | 
				
			||||||
 | 
					bool IsRadarDataIncomplete(
 | 
				
			||||||
 | 
					   const std::shared_ptr<const rda::ElevationScan>& radarData)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   // Assume the data is incomplete when the delta between the first and last
 | 
				
			||||||
 | 
					   // angles is greater than 2.5 degrees.
 | 
				
			||||||
 | 
					   constexpr units::degrees<float> kIncompleteDataAngleThreshold_ {2.5};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   const units::degrees<float> firstAngle =
 | 
				
			||||||
 | 
					      radarData->cbegin()->second->azimuth_angle();
 | 
				
			||||||
 | 
					   const units::degrees<float> lastAngle =
 | 
				
			||||||
 | 
					      radarData->crbegin()->second->azimuth_angle();
 | 
				
			||||||
 | 
					   const units::degrees<float> angleDelta =
 | 
				
			||||||
 | 
					      common::GetAngleDelta(firstAngle, lastAngle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   return angleDelta > kIncompleteDataAngleThreshold_;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ar2vFile::Ar2vFile(std::shared_ptr<Ar2vFile> current,
 | 
				
			||||||
 | 
					                   std::shared_ptr<Ar2vFile> last) :
 | 
				
			||||||
 | 
					   Ar2vFile()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   /*p->vcpData_ = std::make_shared<rda::VolumeCoveragePatternData>(
 | 
				
			||||||
 | 
					      *current->vcp_data());*/
 | 
				
			||||||
 | 
					   p->vcpData_ = nullptr; // TODO
 | 
				
			||||||
 | 
					   /*
 | 
				
			||||||
 | 
					      use index_ to go through each block type, and elevation.
 | 
				
			||||||
 | 
					      get the latest time.
 | 
				
			||||||
 | 
					      if the latest time is not complete, get the previous time (possibly in
 | 
				
			||||||
 | 
					      last), and merge
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (current == nullptr)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for (const auto& type : current->p->index_)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      for (const auto& elevation : type.second)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         const auto& mostRecent = elevation.second.crbegin();
 | 
				
			||||||
 | 
					         if (mostRecent == elevation.second.crend())
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         if (IsRadarDataIncomplete(mostRecent->second))
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            std::shared_ptr<rda::ElevationScan> secondMostRecent =
 | 
				
			||||||
 | 
					               nullptr;
 | 
				
			||||||
 | 
					            auto maybe = elevation.second.rbegin();
 | 
				
			||||||
 | 
					            ++maybe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (maybe == elevation.second.rend())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               if (last == nullptr)
 | 
				
			||||||
 | 
					               {
 | 
				
			||||||
 | 
					                  // Nothing to merge with
 | 
				
			||||||
 | 
					                  p->index_[type.first][elevation.first][mostRecent->first] =
 | 
				
			||||||
 | 
					                     mostRecent->second;
 | 
				
			||||||
 | 
					                  continue;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               auto elevationScan =
 | 
				
			||||||
 | 
					                  std::get<std::shared_ptr<rda::ElevationScan>>(
 | 
				
			||||||
 | 
					                     last->GetElevationScan(type.first, elevation.first, {}));
 | 
				
			||||||
 | 
					               if (elevationScan == nullptr)
 | 
				
			||||||
 | 
					               {
 | 
				
			||||||
 | 
					                  // Nothing to merge with
 | 
				
			||||||
 | 
					                  p->index_[type.first][elevation.first][mostRecent->first] =
 | 
				
			||||||
 | 
					                     mostRecent->second;
 | 
				
			||||||
 | 
					                  continue;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               secondMostRecent = elevationScan;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               secondMostRecent = maybe->second;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            auto newScan = std::make_shared<rda::ElevationScan>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Convert old into new coords
 | 
				
			||||||
 | 
					            logger_->error(
 | 
				
			||||||
 | 
					               "old {}, new {}",
 | 
				
			||||||
 | 
					               secondMostRecent->cbegin()->second->azimuth_angle().value(),
 | 
				
			||||||
 | 
					               mostRecent->second->cbegin()->second->azimuth_angle().value());
 | 
				
			||||||
 | 
					            // TODO Ordering these correctly
 | 
				
			||||||
 | 
					            for (const auto& radial : *secondMostRecent)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               (*newScan)[radial.first] = radial.second;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            for (const auto& radial : *(mostRecent->second))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               (*newScan)[radial.first] = radial.second;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            p->index_[type.first][elevation.first][mostRecent->first] =
 | 
				
			||||||
 | 
					               newScan;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         else
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            p->index_[type.first][elevation.first][mostRecent->first] =
 | 
				
			||||||
 | 
					               mostRecent->second;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   // Go though last, adding other elevations TODO
 | 
				
			||||||
 | 
					   if (last != nullptr)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      for (const auto& type : last->p->index_)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         float highestCurrentElevation = -90;
 | 
				
			||||||
 | 
					         const auto& maybe1 = p->index_.find(type.first);
 | 
				
			||||||
 | 
					         if (maybe1 != p->index_.cend())
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            const auto& maybe2 = maybe1->second.crbegin();
 | 
				
			||||||
 | 
					            if (maybe2 != maybe1->second.crend()) {
 | 
				
			||||||
 | 
					               highestCurrentElevation = maybe2->first + 0.01;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         for (const auto& elevation : type.second)
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            if (elevation.first > highestCurrentElevation)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               const auto& mostRecent = elevation.second.crbegin();
 | 
				
			||||||
 | 
					               if (mostRecent == elevation.second.crend())
 | 
				
			||||||
 | 
					               {
 | 
				
			||||||
 | 
					                  continue;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					               p->index_[type.first][elevation.first][mostRecent->first] =
 | 
				
			||||||
 | 
					                  mostRecent->second;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace wsr88d
 | 
					} // namespace wsr88d
 | 
				
			||||||
} // namespace scwx
 | 
					} // namespace scwx
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue