#include #include #include #include namespace scwx { namespace qt { namespace map { static const std::string logPrefix_ = "scwx::qt::map::radar_range_layer"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); static std::shared_ptr GetRangeCircle(float range, QMapLibreGL::Coordinate center); void RadarRangeLayer::Add(std::shared_ptr map, float range, QMapLibreGL::Coordinate center, const QString& before) { logger_->debug("Add()"); if (map->layerExists("rangeCircleLayer")) { map->removeLayer("rangeCircleLayer"); } if (map->sourceExists("rangeCircleSource")) { map->removeSource("rangeCircleSource"); } std::shared_ptr rangeCircle = GetRangeCircle(range, center); 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 map, float range, QMapLibreGL::Coordinate center) { std::shared_ptr rangeCircle = GetRangeCircle(range, center); map->updateSource("rangeCircleSource", {{"data", QVariant::fromValue(*rangeCircle)}}); } static std::shared_ptr GetRangeCircle(float range, QMapLibreGL::Coordinate center) { GeographicLib::Geodesic geodesic(GeographicLib::Constants::WGS84_a(), GeographicLib::Constants::WGS84_f()); constexpr float angleDelta = 0.5f; constexpr float angleDeltaH = angleDelta / 2.0f; float angle = -angleDeltaH; QMapLibreGL::Coordinates geometry; for (uint16_t azimuth = 0; azimuth <= 720; ++azimuth) { double latitude; double longitude; geodesic.Direct(center.first, center.second, angle, range * 1000.0f, latitude, longitude); geometry.append({latitude, longitude}); angle += angleDelta; } std::shared_ptr rangeCircle = std::make_shared( QMapLibreGL::Feature::LineStringType, std::initializer_list { std::initializer_list {geometry}}); return rangeCircle; } } // namespace map } // namespace qt } // namespace scwx