Dynamic range circle

This commit is contained in:
Dan Paulat 2021-11-14 01:28:13 -06:00
parent 77ba92ce7f
commit 87581892a7
9 changed files with 105 additions and 34 deletions

View file

@ -115,7 +115,10 @@ void MapWidget::SelectRadarProduct(common::Level2Product product)
p->radarProductView_.get(),
&view::RadarProductView::SweepComputed,
this,
[&]() { update(); },
[&]() {
RadarRangeLayer::Update(p->map_, p->radarProductView_->range());
update();
},
Qt::QueuedConnection);
if (p->map_ != nullptr)
@ -148,14 +151,6 @@ void MapWidget::changeStyle()
void MapWidget::AddLayers()
{
// TODO: Improve this
if (p->map_->layerExists("rangeCircleLayer"))
{
p->map_->removeLayer("rangeCircleLayer");
}
if (p->map_->sourceExists("rangeCircleSource"))
{
p->map_->removeSource("rangeCircleSource");
}
if (p->map_->layerExists("radar"))
{
p->map_->removeLayer("radar");
@ -185,7 +180,7 @@ void MapWidget::AddLayers()
}
p->map_->addCustomLayer("radar", pHost, before);
RadarRangeLayer::Add(p->map_, before);
RadarRangeLayer::Add(p->map_, p->radarProductView_->range(), before);
p->map_->addCustomLayer("overlay", pOverlayHost);
}

View file

@ -13,15 +13,49 @@ namespace map
static const std::string logPrefix_ = "[scwx::qt::map::radar_range_layer] ";
void RadarRangeLayer::Add(std::shared_ptr<QMapboxGL> map, const QString& before)
static std::shared_ptr<QMapbox::Feature> GetRangeCircle(float range);
void RadarRangeLayer::Add(std::shared_ptr<QMapboxGL> map,
float range,
const QString& before)
{
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Add()";
if (map->layerExists("rangeCircleLayer"))
{
map->removeLayer("rangeCircleLayer");
}
if (map->sourceExists("rangeCircleSource"))
{
map->removeSource("rangeCircleSource");
}
std::shared_ptr<QMapbox::Feature> rangeCircle = GetRangeCircle(range);
map->addSource(
"rangeCircleSource",
{{"type", "geojson"}, {"data", QVariant::fromValue(*rangeCircle)}});
map->addLayer({{"id", "rangeCircleLayer"},
{"type", "line"},
{"source", "rangeCircleSource"}},
before);
map->setPaintProperty(
"rangeCircleLayer", "line-color", "rgba(128, 128, 128, 128)");
}
void RadarRangeLayer::Update(std::shared_ptr<QMapboxGL> map, float range)
{
std::shared_ptr<QMapbox::Feature> rangeCircle = GetRangeCircle(range);
map->updateSource("rangeCircleSource",
{{"data", QVariant::fromValue(*rangeCircle)}});
}
static std::shared_ptr<QMapbox::Feature> GetRangeCircle(float range)
{
GeographicLib::Geodesic geodesic(GeographicLib::Constants::WGS84_a(),
GeographicLib::Constants::WGS84_f());
constexpr float range = 460.0f * 1000.0f;
constexpr float angleDelta = 0.5f;
constexpr float angleDeltaH = angleDelta / 2.0f;
@ -36,26 +70,25 @@ void RadarRangeLayer::Add(std::shared_ptr<QMapboxGL> map, const QString& before)
double latitude;
double longitude;
geodesic.Direct(
radar.first, radar.second, angle, range, latitude, longitude);
geodesic.Direct(radar.first,
radar.second,
angle,
range * 1000.0f,
latitude,
longitude);
geometry.append({latitude, longitude});
angle += angleDelta;
}
QMapbox::Feature rangeCircle {QMapbox::Feature::LineStringType,
{{geometry}}};
std::shared_ptr<QMapbox::Feature> rangeCircle =
std::make_shared<QMapbox::Feature>(
QMapbox::Feature::LineStringType,
std::initializer_list<QMapbox::CoordinatesCollection> {
std::initializer_list<QMapbox::Coordinates> {geometry}});
map->addSource(
"rangeCircleSource",
{{"type", "geojson"}, {"data", QVariant::fromValue(rangeCircle)}});
map->addLayer({{"id", "rangeCircleLayer"},
{"type", "line"},
{"source", "rangeCircleSource"}},
before);
map->setPaintProperty(
"rangeCircleLayer", "line-color", "rgba(128, 128, 128, 128)");
return rangeCircle;
}
} // namespace map

View file

@ -8,12 +8,15 @@ namespace qt
{
namespace map
{
namespace RadarRangeLayer
{
void Add(std::shared_ptr<QMapboxGL> map, const QString& before = QString());
};
void Add(std::shared_ptr<QMapboxGL> map,
float range,
const QString& before = QString());
void Update(std::shared_ptr<QMapboxGL> map, float range);
} // namespace RadarRangeLayer
} // namespace map
} // namespace qt
} // namespace scwx