Process and index Digital Radar Data

This commit is contained in:
Dan Paulat 2024-01-23 00:22:56 -06:00
parent 730c1a9ba7
commit 835e8d8f0d
4 changed files with 31 additions and 17 deletions

View file

@ -36,7 +36,7 @@ public:
std::uint16_t radial_length() const;
std::uint8_t azimuth_resolution_spacing() const;
std::uint8_t radial_status() const;
std::uint8_t elevation_number() const;
std::uint16_t elevation_number() const;
std::uint8_t cut_sector_number() const;
units::degrees<float> elevation_angle() const;
std::uint8_t radial_spot_blanking_status() const;

View file

@ -53,6 +53,8 @@ public:
virtual std::uint32_t collection_time() const = 0;
virtual std::uint16_t modified_julian_date() const = 0;
virtual units::degrees<float> azimuth_angle() const = 0;
virtual std::uint16_t azimuth_number() const = 0;
virtual std::uint16_t elevation_number() const = 0;
virtual std::uint16_t volume_coverage_pattern_number() const = 0;
virtual std::shared_ptr<MomentDataBlock>

View file

@ -1,5 +1,5 @@
#include <scwx/wsr88d/ar2v_file.hpp>
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp>
#include <scwx/wsr88d/rda/digital_radar_data.hpp>
#include <scwx/wsr88d/rda/level2_message_factory.hpp>
#include <scwx/wsr88d/rda/rda_types.hpp>
#include <scwx/util/logger.hpp>
@ -59,8 +59,7 @@ public:
void IndexFile();
void ParseLDMRecords();
void ParseLDMRecord(std::istream& is);
void ProcessRadarData(
const std::shared_ptr<rda::DigitalRadarDataGeneric>& message);
void ProcessRadarData(const std::shared_ptr<rda::GenericRadarData>& message);
std::string tapeFilename_;
std::string extensionNumber_;
@ -391,9 +390,10 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr<rda::Level2Message>& message)
std::static_pointer_cast<rda::VolumeCoveragePatternData>(message);
break;
case static_cast<std::uint8_t>(rda::MessageId::DigitalRadarData):
case static_cast<std::uint8_t>(rda::MessageId::DigitalRadarDataGeneric):
ProcessRadarData(
std::static_pointer_cast<rda::DigitalRadarDataGeneric>(message));
std::static_pointer_cast<rda::GenericRadarData>(message));
break;
default:
@ -402,7 +402,7 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr<rda::Level2Message>& message)
}
void Ar2vFileImpl::ProcessRadarData(
const std::shared_ptr<rda::DigitalRadarDataGeneric>& message)
const std::shared_ptr<rda::GenericRadarData>& message)
{
std::uint16_t azimuthIndex = message->azimuth_number() - 1;
std::uint16_t elevationIndex = message->elevation_number() - 1;
@ -419,18 +419,10 @@ void Ar2vFileImpl::IndexFile()
{
logger_->debug("Indexing file");
if (vcpData_ == nullptr)
{
logger_->warn("Cannot index file without VCP data");
return;
}
for (auto& elevationCut : radarData_)
{
std::uint16_t elevationAngle =
vcpData_->elevation_angle_raw(elevationCut.first);
rda::WaveformType waveformType =
vcpData_->waveform_type(elevationCut.first);
std::uint16_t elevationAngle {};
rda::WaveformType waveformType = rda::WaveformType::Unknown;
std::shared_ptr<rda::GenericRadarData>& radial0 =
(*elevationCut.second)[0];
@ -441,6 +433,26 @@ void Ar2vFileImpl::IndexFile()
continue;
}
std::shared_ptr<rda::DigitalRadarData> digitalRadarData0 = nullptr;
if (vcpData_ != nullptr)
{
elevationAngle = vcpData_->elevation_angle_raw(elevationCut.first);
waveformType = vcpData_->waveform_type(elevationCut.first);
}
else if ((digitalRadarData0 =
std::dynamic_pointer_cast<rda::DigitalRadarData>(
(*elevationCut.second)[0])) != nullptr)
{
elevationAngle = digitalRadarData0->elevation_angle_raw();
}
else
{
// Return here, because we should only have a single message type
logger_->warn("Cannot index file without VCP data");
return;
}
for (rda::DataBlockType dataBlockType :
rda::MomentDataBlockTypeIterator())
{

View file

@ -556,7 +556,7 @@ std::uint8_t DigitalRadarDataGeneric::radial_status() const
return p->radialStatus_;
}
std::uint8_t DigitalRadarDataGeneric::elevation_number() const
std::uint16_t DigitalRadarDataGeneric::elevation_number() const
{
return p->elevationNumber_;
}