mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 10:10:05 +00:00 
			
		
		
		
	Index multiple level 2 elevation scans
This commit is contained in:
		
							parent
							
								
									50b6a8dd9b
								
							
						
					
					
						commit
						b466ac818c
					
				
					 1 changed files with 31 additions and 16 deletions
				
			
		|  | @ -65,7 +65,9 @@ public: | ||||||
|    std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>> radarData_ {}; |    std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>> radarData_ {}; | ||||||
| 
 | 
 | ||||||
|    std::map<rda::DataBlockType, |    std::map<rda::DataBlockType, | ||||||
|             std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>>> |             std::map<std::uint16_t, | ||||||
|  |                      std::map<std::chrono::system_clock::time_point, | ||||||
|  |                               std::shared_ptr<rda::ElevationScan>>>> | ||||||
|       index_ {}; |       index_ {}; | ||||||
| 
 | 
 | ||||||
|    std::list<std::stringstream> rawRecords_ {}; |    std::list<std::stringstream> rawRecords_ {}; | ||||||
|  | @ -130,9 +132,9 @@ std::shared_ptr<const rda::VolumeCoveragePatternData> Ar2vFile::vcp_data() const | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::tuple<std::shared_ptr<rda::ElevationScan>, float, std::vector<float>> | 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 | ||||||
| { | { | ||||||
|    logger_->debug("GetElevationScan: {} degrees", elevation); |    logger_->debug("GetElevationScan: {} degrees", elevation); | ||||||
| 
 | 
 | ||||||
|  | @ -152,6 +154,7 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, | ||||||
|       std::uint16_t lowerBound = scans.cbegin()->first; |       std::uint16_t lowerBound = scans.cbegin()->first; | ||||||
|       std::uint16_t upperBound = scans.crbegin()->first; |       std::uint16_t upperBound = scans.crbegin()->first; | ||||||
| 
 | 
 | ||||||
|  |       // Find closest elevation match
 | ||||||
|       for (auto& scan : scans) |       for (auto& scan : scans) | ||||||
|       { |       { | ||||||
|          if (scan.first > lowerBound && scan.first <= codedElevation) |          if (scan.first > lowerBound && scan.first <= codedElevation) | ||||||
|  | @ -173,15 +176,25 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, | ||||||
|          std::abs(static_cast<std::int32_t>(codedElevation) - |          std::abs(static_cast<std::int32_t>(codedElevation) - | ||||||
|                   static_cast<std::int32_t>(upperBound)); |                   static_cast<std::int32_t>(upperBound)); | ||||||
| 
 | 
 | ||||||
|       if (lowerDelta < upperDelta) |       // Select closest elevation match
 | ||||||
|  |       std::uint16_t elevationIndex = | ||||||
|  |          (lowerDelta < upperDelta) ? lowerBound : upperBound; | ||||||
|  |       elevationCut = elevationIndex / scaleFactor; | ||||||
|  | 
 | ||||||
|  |       // Select closest time match, not newer than the selected time
 | ||||||
|  |       std::chrono::system_clock::time_point foundTime {}; | ||||||
|  |       auto& elevationScans = scans.at(elevationIndex); | ||||||
|  | 
 | ||||||
|  |       for (auto& scan : elevationScans) | ||||||
|       { |       { | ||||||
|          elevationScan = scans.at(lowerBound); |          auto& scanTime = scan.first; | ||||||
|          elevationCut  = lowerBound / scaleFactor; | 
 | ||||||
|       } |          if (elevationScan == nullptr || | ||||||
|       else |              (scanTime <= time && scanTime > foundTime)) | ||||||
|       { |          { | ||||||
|          elevationScan = scans.at(upperBound); |             elevationScan = scan.second; | ||||||
|          elevationCut  = upperBound / scaleFactor; |             foundTime     = scanTime; | ||||||
|  |          } | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|  | @ -460,8 +473,8 @@ void Ar2vFileImpl::IndexFile() | ||||||
|          waveformType   = vcpData_->waveform_type(elevationCut.first); |          waveformType   = vcpData_->waveform_type(elevationCut.first); | ||||||
|       } |       } | ||||||
|       else if ((digitalRadarData0 = |       else if ((digitalRadarData0 = | ||||||
|                    std::dynamic_pointer_cast<rda::DigitalRadarData>( |                    std::dynamic_pointer_cast<rda::DigitalRadarData>(radial0)) != | ||||||
|                       (*elevationCut.second)[0])) != nullptr) |                nullptr) | ||||||
|       { |       { | ||||||
|          elevationAngle = digitalRadarData0->elevation_angle_raw(); |          elevationAngle = digitalRadarData0->elevation_angle_raw(); | ||||||
|       } |       } | ||||||
|  | @ -488,8 +501,10 @@ void Ar2vFileImpl::IndexFile() | ||||||
| 
 | 
 | ||||||
|          if (momentData != nullptr) |          if (momentData != nullptr) | ||||||
|          { |          { | ||||||
|             // TODO: Handle multiple elevation scans
 |             auto time = util::TimePoint(radial0->modified_julian_date(), | ||||||
|             index_[dataBlockType][elevationAngle] = elevationCut.second; |                                         radial0->collection_time()); | ||||||
|  | 
 | ||||||
|  |             index_[dataBlockType][elevationAngle][time] = elevationCut.second; | ||||||
|          } |          } | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat