mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 16:10:04 +00:00
Add Generic Radar Data as a common base class to message types 1 and 31
This commit is contained in:
parent
b8b0812ce6
commit
571d0b2ce9
8 changed files with 191 additions and 41 deletions
|
|
@ -90,7 +90,7 @@ public:
|
||||||
float selectedElevation_;
|
float selectedElevation_;
|
||||||
|
|
||||||
std::shared_ptr<wsr88d::rda::ElevationScan> elevationScan_;
|
std::shared_ptr<wsr88d::rda::ElevationScan> elevationScan_;
|
||||||
std::shared_ptr<wsr88d::rda::DigitalRadarDataGeneric::MomentDataBlock>
|
std::shared_ptr<wsr88d::rda::GenericRadarData::MomentDataBlock>
|
||||||
momentDataBlock0_;
|
momentDataBlock0_;
|
||||||
|
|
||||||
std::vector<float> coordinates_ {};
|
std::vector<float> coordinates_ {};
|
||||||
|
|
@ -469,15 +469,15 @@ void Level2ProductView::ComputeSweep()
|
||||||
|
|
||||||
const uint32_t gates = momentData0->number_of_data_moment_gates();
|
const uint32_t gates = momentData0->number_of_data_moment_gates();
|
||||||
|
|
||||||
auto volumeData0 = radarData0->volume_data_block();
|
auto radarSite = radarProductManager->radar_site();
|
||||||
p->latitude_ = volumeData0->latitude();
|
p->latitude_ = radarSite->latitude();
|
||||||
p->longitude_ = volumeData0->longitude();
|
p->longitude_ = radarSite->longitude();
|
||||||
p->range_ =
|
p->range_ =
|
||||||
momentData0->data_moment_range() +
|
momentData0->data_moment_range() +
|
||||||
momentData0->data_moment_range_sample_interval() * (gates - 0.5f);
|
momentData0->data_moment_range_sample_interval() * (gates - 0.5f);
|
||||||
p->sweepTime_ = scwx::util::TimePoint(radarData0->modified_julian_date(),
|
p->sweepTime_ = scwx::util::TimePoint(radarData0->modified_julian_date(),
|
||||||
radarData0->collection_time());
|
radarData0->collection_time());
|
||||||
p->vcp_ = volumeData0->volume_coverage_pattern_number();
|
p->vcp_ = radarData0->volume_coverage_pattern_number();
|
||||||
|
|
||||||
// Calculate vertices
|
// Calculate vertices
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <scwx/wsr88d/nexrad_file.hpp>
|
#include <scwx/wsr88d/nexrad_file.hpp>
|
||||||
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp>
|
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
|
||||||
#include <scwx/wsr88d/rda/volume_coverage_pattern_data.hpp>
|
#include <scwx/wsr88d/rda/volume_coverage_pattern_data.hpp>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <scwx/util/iterator.hpp>
|
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
|
||||||
#include <scwx/wsr88d/rda/level2_message.hpp>
|
|
||||||
|
|
||||||
#include <units/angle.h>
|
|
||||||
#include <units/length.h>
|
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
{
|
{
|
||||||
|
|
@ -13,30 +9,7 @@ namespace wsr88d
|
||||||
namespace rda
|
namespace rda
|
||||||
{
|
{
|
||||||
|
|
||||||
enum class DataBlockType
|
class DigitalRadarDataGeneric : public GenericRadarData
|
||||||
{
|
|
||||||
Volume,
|
|
||||||
Elevation,
|
|
||||||
Radial,
|
|
||||||
MomentRef,
|
|
||||||
MomentVel,
|
|
||||||
MomentSw,
|
|
||||||
MomentZdr,
|
|
||||||
MomentPhi,
|
|
||||||
MomentRho,
|
|
||||||
MomentCfp,
|
|
||||||
Unknown
|
|
||||||
};
|
|
||||||
typedef util::
|
|
||||||
Iterator<DataBlockType, DataBlockType::MomentRef, DataBlockType::MomentCfp>
|
|
||||||
MomentDataBlockTypeIterator;
|
|
||||||
|
|
||||||
class DigitalRadarDataGeneric;
|
|
||||||
|
|
||||||
typedef std::map<std::uint16_t, std::shared_ptr<DigitalRadarDataGeneric>>
|
|
||||||
ElevationScan;
|
|
||||||
|
|
||||||
class DigitalRadarDataGeneric : public Level2Message
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class DataBlock;
|
class DataBlock;
|
||||||
|
|
@ -69,11 +42,13 @@ public:
|
||||||
std::uint8_t radial_spot_blanking_status() const;
|
std::uint8_t radial_spot_blanking_status() const;
|
||||||
std::uint8_t azimuth_indexing_mode() const;
|
std::uint8_t azimuth_indexing_mode() const;
|
||||||
std::uint16_t data_block_count() const;
|
std::uint16_t data_block_count() const;
|
||||||
|
std::uint16_t volume_coverage_pattern_number() const;
|
||||||
|
|
||||||
std::shared_ptr<ElevationDataBlock> elevation_data_block() const;
|
std::shared_ptr<ElevationDataBlock> elevation_data_block() const;
|
||||||
std::shared_ptr<RadialDataBlock> radial_data_block() const;
|
std::shared_ptr<RadialDataBlock> radial_data_block() const;
|
||||||
std::shared_ptr<VolumeDataBlock> volume_data_block() const;
|
std::shared_ptr<VolumeDataBlock> volume_data_block() const;
|
||||||
std::shared_ptr<MomentDataBlock> moment_data_block(DataBlockType type) const;
|
std::shared_ptr<GenericRadarData::MomentDataBlock>
|
||||||
|
moment_data_block(DataBlockType type) const;
|
||||||
|
|
||||||
bool Parse(std::istream& is);
|
bool Parse(std::istream& is);
|
||||||
|
|
||||||
|
|
@ -128,7 +103,9 @@ private:
|
||||||
bool Parse(std::istream& is);
|
bool Parse(std::istream& is);
|
||||||
};
|
};
|
||||||
|
|
||||||
class DigitalRadarDataGeneric::MomentDataBlock : public DataBlock
|
class DigitalRadarDataGeneric::MomentDataBlock :
|
||||||
|
public DataBlock,
|
||||||
|
public GenericRadarData::MomentDataBlock
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit MomentDataBlock(const std::string& dataBlockType,
|
explicit MomentDataBlock(const std::string& dataBlockType,
|
||||||
|
|
|
||||||
97
wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp
Normal file
97
wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <scwx/util/iterator.hpp>
|
||||||
|
#include <scwx/wsr88d/rda/level2_message.hpp>
|
||||||
|
|
||||||
|
#include <units/angle.h>
|
||||||
|
#include <units/length.h>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace wsr88d
|
||||||
|
{
|
||||||
|
namespace rda
|
||||||
|
{
|
||||||
|
|
||||||
|
enum class DataBlockType
|
||||||
|
{
|
||||||
|
Volume,
|
||||||
|
Elevation,
|
||||||
|
Radial,
|
||||||
|
MomentRef,
|
||||||
|
MomentVel,
|
||||||
|
MomentSw,
|
||||||
|
MomentZdr,
|
||||||
|
MomentPhi,
|
||||||
|
MomentRho,
|
||||||
|
MomentCfp,
|
||||||
|
Unknown
|
||||||
|
};
|
||||||
|
typedef util::
|
||||||
|
Iterator<DataBlockType, DataBlockType::MomentRef, DataBlockType::MomentCfp>
|
||||||
|
MomentDataBlockTypeIterator;
|
||||||
|
|
||||||
|
class GenericRadarData;
|
||||||
|
|
||||||
|
typedef std::map<std::uint16_t, std::shared_ptr<GenericRadarData>>
|
||||||
|
ElevationScan;
|
||||||
|
|
||||||
|
class GenericRadarData : public Level2Message
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class MomentDataBlock;
|
||||||
|
|
||||||
|
explicit GenericRadarData();
|
||||||
|
virtual ~GenericRadarData();
|
||||||
|
|
||||||
|
GenericRadarData(const GenericRadarData&) = delete;
|
||||||
|
GenericRadarData& operator=(const GenericRadarData&) = delete;
|
||||||
|
|
||||||
|
GenericRadarData(GenericRadarData&&) noexcept;
|
||||||
|
GenericRadarData& operator=(GenericRadarData&&) noexcept;
|
||||||
|
|
||||||
|
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 volume_coverage_pattern_number() const = 0;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<MomentDataBlock>
|
||||||
|
moment_data_block(DataBlockType type) const = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Impl;
|
||||||
|
std::unique_ptr<Impl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GenericRadarData::MomentDataBlock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit MomentDataBlock();
|
||||||
|
virtual ~MomentDataBlock();
|
||||||
|
|
||||||
|
MomentDataBlock(const MomentDataBlock&) = delete;
|
||||||
|
MomentDataBlock& operator=(const MomentDataBlock&) = delete;
|
||||||
|
|
||||||
|
MomentDataBlock(MomentDataBlock&&) noexcept;
|
||||||
|
MomentDataBlock& operator=(MomentDataBlock&&) noexcept;
|
||||||
|
|
||||||
|
virtual std::uint16_t number_of_data_moment_gates() const = 0;
|
||||||
|
virtual units::kilometers<float> data_moment_range() const = 0;
|
||||||
|
virtual std::uint16_t data_moment_range_raw() const = 0;
|
||||||
|
virtual units::kilometers<float>
|
||||||
|
data_moment_range_sample_interval() const = 0;
|
||||||
|
virtual std::uint16_t data_moment_range_sample_interval_raw() const = 0;
|
||||||
|
virtual std::int16_t snr_threshold_raw() const = 0;
|
||||||
|
virtual std::uint8_t data_word_size() const = 0;
|
||||||
|
virtual float scale() const = 0;
|
||||||
|
virtual float offset() const = 0;
|
||||||
|
virtual const void* data_moments() const = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Impl;
|
||||||
|
std::unique_ptr<Impl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace rda
|
||||||
|
} // namespace wsr88d
|
||||||
|
} // namespace scwx
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include <scwx/wsr88d/ar2v_file.hpp>
|
#include <scwx/wsr88d/ar2v_file.hpp>
|
||||||
|
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp>
|
||||||
#include <scwx/wsr88d/rda/level2_message_factory.hpp>
|
#include <scwx/wsr88d/rda/level2_message_factory.hpp>
|
||||||
#include <scwx/wsr88d/rda/rda_types.hpp>
|
#include <scwx/wsr88d/rda/rda_types.hpp>
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
@ -109,7 +110,7 @@ std::chrono::system_clock::time_point Ar2vFile::end_time() const
|
||||||
|
|
||||||
if (p->radarData_.size() > 0)
|
if (p->radarData_.size() > 0)
|
||||||
{
|
{
|
||||||
std::shared_ptr<rda::DigitalRadarDataGeneric> lastRadial =
|
std::shared_ptr<rda::GenericRadarData> lastRadial =
|
||||||
p->radarData_.crbegin()->second->crbegin()->second;
|
p->radarData_.crbegin()->second->crbegin()->second;
|
||||||
|
|
||||||
endTime = util::TimePoint(lastRadial->modified_julian_date(),
|
endTime = util::TimePoint(lastRadial->modified_julian_date(),
|
||||||
|
|
@ -431,7 +432,7 @@ void Ar2vFileImpl::IndexFile()
|
||||||
rda::WaveformType waveformType =
|
rda::WaveformType waveformType =
|
||||||
vcpData_->waveform_type(elevationCut.first);
|
vcpData_->waveform_type(elevationCut.first);
|
||||||
|
|
||||||
std::shared_ptr<rda::DigitalRadarDataGeneric>& radial0 =
|
std::shared_ptr<rda::GenericRadarData>& radial0 =
|
||||||
(*elevationCut.second)[0];
|
(*elevationCut.second)[0];
|
||||||
|
|
||||||
if (radial0 == nullptr)
|
if (radial0 == nullptr)
|
||||||
|
|
|
||||||
|
|
@ -501,7 +501,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
DigitalRadarDataGeneric::DigitalRadarDataGeneric() :
|
DigitalRadarDataGeneric::DigitalRadarDataGeneric() :
|
||||||
Level2Message(), p(std::make_unique<Impl>())
|
GenericRadarData(), p(std::make_unique<Impl>())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
DigitalRadarDataGeneric::~DigitalRadarDataGeneric() = default;
|
DigitalRadarDataGeneric::~DigitalRadarDataGeneric() = default;
|
||||||
|
|
@ -586,6 +586,18 @@ std::uint16_t DigitalRadarDataGeneric::data_block_count() const
|
||||||
return p->dataBlockCount_;
|
return p->dataBlockCount_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint16_t DigitalRadarDataGeneric::volume_coverage_pattern_number() const
|
||||||
|
{
|
||||||
|
std::uint16_t vcpNumber = 0;
|
||||||
|
|
||||||
|
if (p->volumeDataBlock_ != nullptr)
|
||||||
|
{
|
||||||
|
vcpNumber = p->volumeDataBlock_->volume_coverage_pattern_number();
|
||||||
|
}
|
||||||
|
|
||||||
|
return vcpNumber;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<DigitalRadarDataGeneric::ElevationDataBlock>
|
std::shared_ptr<DigitalRadarDataGeneric::ElevationDataBlock>
|
||||||
DigitalRadarDataGeneric::elevation_data_block() const
|
DigitalRadarDataGeneric::elevation_data_block() const
|
||||||
{
|
{
|
||||||
|
|
@ -604,7 +616,7 @@ DigitalRadarDataGeneric::volume_data_block() const
|
||||||
return p->volumeDataBlock_;
|
return p->volumeDataBlock_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<DigitalRadarDataGeneric::MomentDataBlock>
|
std::shared_ptr<GenericRadarData::MomentDataBlock>
|
||||||
DigitalRadarDataGeneric::moment_data_block(DataBlockType type) const
|
DigitalRadarDataGeneric::moment_data_block(DataBlockType type) const
|
||||||
{
|
{
|
||||||
std::shared_ptr<MomentDataBlock> momentDataBlock = nullptr;
|
std::shared_ptr<MomentDataBlock> momentDataBlock = nullptr;
|
||||||
|
|
|
||||||
61
wxdata/source/scwx/wsr88d/rda/generic_radar_data.cpp
Normal file
61
wxdata/source/scwx/wsr88d/rda/generic_radar_data.cpp
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
|
||||||
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace wsr88d
|
||||||
|
{
|
||||||
|
namespace rda
|
||||||
|
{
|
||||||
|
|
||||||
|
static const std::string logPrefix_ = "scwx::wsr88d::rda::generic_radar_data";
|
||||||
|
|
||||||
|
static const std::unordered_map<std::string, DataBlockType> strToDataBlock_ {
|
||||||
|
{"VOL", DataBlockType::Volume},
|
||||||
|
{"ELV", DataBlockType::Elevation},
|
||||||
|
{"RAD", DataBlockType::Radial},
|
||||||
|
{"REF", DataBlockType::MomentRef},
|
||||||
|
{"VEL", DataBlockType::MomentVel},
|
||||||
|
{"SW ", DataBlockType::MomentSw},
|
||||||
|
{"ZDR", DataBlockType::MomentZdr},
|
||||||
|
{"PHI", DataBlockType::MomentPhi},
|
||||||
|
{"RHO", DataBlockType::MomentRho},
|
||||||
|
{"CFP", DataBlockType::MomentCfp}};
|
||||||
|
|
||||||
|
class GenericRadarData::MomentDataBlock::Impl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Impl() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
GenericRadarData::MomentDataBlock::MomentDataBlock() :
|
||||||
|
p(std::make_unique<Impl>())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
GenericRadarData::MomentDataBlock::~MomentDataBlock() = default;
|
||||||
|
|
||||||
|
GenericRadarData::MomentDataBlock::MomentDataBlock(MomentDataBlock&&) noexcept =
|
||||||
|
default;
|
||||||
|
GenericRadarData::MomentDataBlock& GenericRadarData::MomentDataBlock::operator=(
|
||||||
|
MomentDataBlock&&) noexcept = default;
|
||||||
|
|
||||||
|
class GenericRadarData::Impl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Impl() {};
|
||||||
|
~Impl() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
GenericRadarData::GenericRadarData() :
|
||||||
|
Level2Message(), p(std::make_unique<Impl>())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
GenericRadarData::~GenericRadarData() = default;
|
||||||
|
|
||||||
|
GenericRadarData::GenericRadarData(GenericRadarData&&) noexcept = default;
|
||||||
|
GenericRadarData&
|
||||||
|
GenericRadarData::operator=(GenericRadarData&&) noexcept = default;
|
||||||
|
|
||||||
|
} // namespace rda
|
||||||
|
} // namespace wsr88d
|
||||||
|
} // namespace scwx
|
||||||
|
|
@ -104,6 +104,7 @@ set(HDR_WSR88D_RDA include/scwx/wsr88d/rda/clutter_filter_bypass_map.hpp
|
||||||
include/scwx/wsr88d/rda/clutter_filter_map.hpp
|
include/scwx/wsr88d/rda/clutter_filter_map.hpp
|
||||||
include/scwx/wsr88d/rda/digital_radar_data.hpp
|
include/scwx/wsr88d/rda/digital_radar_data.hpp
|
||||||
include/scwx/wsr88d/rda/digital_radar_data_generic.hpp
|
include/scwx/wsr88d/rda/digital_radar_data_generic.hpp
|
||||||
|
include/scwx/wsr88d/rda/generic_radar_data.hpp
|
||||||
include/scwx/wsr88d/rda/level2_message.hpp
|
include/scwx/wsr88d/rda/level2_message.hpp
|
||||||
include/scwx/wsr88d/rda/level2_message_factory.hpp
|
include/scwx/wsr88d/rda/level2_message_factory.hpp
|
||||||
include/scwx/wsr88d/rda/level2_message_header.hpp
|
include/scwx/wsr88d/rda/level2_message_header.hpp
|
||||||
|
|
@ -116,6 +117,7 @@ set(SRC_WSR88D_RDA source/scwx/wsr88d/rda/clutter_filter_bypass_map.cpp
|
||||||
source/scwx/wsr88d/rda/clutter_filter_map.cpp
|
source/scwx/wsr88d/rda/clutter_filter_map.cpp
|
||||||
source/scwx/wsr88d/rda/digital_radar_data.cpp
|
source/scwx/wsr88d/rda/digital_radar_data.cpp
|
||||||
source/scwx/wsr88d/rda/digital_radar_data_generic.cpp
|
source/scwx/wsr88d/rda/digital_radar_data_generic.cpp
|
||||||
|
source/scwx/wsr88d/rda/generic_radar_data.cpp
|
||||||
source/scwx/wsr88d/rda/level2_message.cpp
|
source/scwx/wsr88d/rda/level2_message.cpp
|
||||||
source/scwx/wsr88d/rda/level2_message_factory.cpp
|
source/scwx/wsr88d/rda/level2_message_factory.cpp
|
||||||
source/scwx/wsr88d/rda/level2_message_header.cpp
|
source/scwx/wsr88d/rda/level2_message_header.cpp
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue