mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 20:30:05 +00:00
Dynamic range circle
This commit is contained in:
parent
77ba92ce7f
commit
87581892a7
9 changed files with 105 additions and 34 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue