mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 08:20:05 +00:00 
			
		
		
		
	Calculate distance to each radar site from current location
This commit is contained in:
		
							parent
							
								
									6e7a13494a
								
							
						
					
					
						commit
						3a4819aeff
					
				
					 7 changed files with 192 additions and 70 deletions
				
			
		|  | @ -4,6 +4,10 @@ | |||
| #include <scwx/common/geographic.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <format> | ||||
| 
 | ||||
| #include <GeographicLib/Geodesic.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
|  | @ -14,7 +18,7 @@ namespace model | |||
| static const std::string logPrefix_ = "scwx::qt::model::radar_site_model"; | ||||
| static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||
| 
 | ||||
| static constexpr size_t kNumColumns = 7u; | ||||
| static constexpr size_t kNumColumns = 8u; | ||||
| 
 | ||||
| class RadarSiteModelImpl | ||||
| { | ||||
|  | @ -23,6 +27,12 @@ public: | |||
|    ~RadarSiteModelImpl() = default; | ||||
| 
 | ||||
|    QList<std::shared_ptr<config::RadarSite>> radarSites_; | ||||
| 
 | ||||
|    GeographicLib::Geodesic geodesic_; | ||||
| 
 | ||||
|    std::unordered_map<std::string, double> distanceMap_; | ||||
|    scwx::common::DistanceType              distanceDisplay_; | ||||
|    scwx::common::Coordinate                previousPosition_; | ||||
| }; | ||||
| 
 | ||||
| RadarSiteModel::RadarSiteModel(QObject* parent) : | ||||
|  | @ -81,6 +91,26 @@ QVariant RadarSiteModel::data(const QModelIndex& index, int role) const | |||
|          } | ||||
|       case 6: | ||||
|          return QString::fromStdString(site->type_name()); | ||||
|       case 7: | ||||
|          if (role == Qt::DisplayRole) | ||||
|          { | ||||
|             if (p->distanceDisplay_ == scwx::common::DistanceType::Miles) | ||||
|             { | ||||
|                return QString("%1 mi").arg( | ||||
|                   static_cast<uint32_t>(p->distanceMap_.at(site->id()) * | ||||
|                                         scwx::common::kMilesPerMeter)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                return QString("%1 km").arg( | ||||
|                   static_cast<uint32_t>(p->distanceMap_.at(site->id()) * | ||||
|                                         scwx::common::kKilometersPerMeter)); | ||||
|             } | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             return p->distanceMap_.at(site->id()); | ||||
|          } | ||||
|       default: | ||||
|          break; | ||||
|       } | ||||
|  | @ -113,6 +143,8 @@ QVariant RadarSiteModel::headerData(int             section, | |||
|             return tr("Longitude"); | ||||
|          case 6: | ||||
|             return tr("Type"); | ||||
|          case 7: | ||||
|             return tr("Distance"); | ||||
|          default: | ||||
|             break; | ||||
|          } | ||||
|  | @ -122,7 +154,30 @@ QVariant RadarSiteModel::headerData(int             section, | |||
|    return QVariant(); | ||||
| } | ||||
| 
 | ||||
| RadarSiteModelImpl::RadarSiteModelImpl() : radarSites_ {} | ||||
| void RadarSiteModel::HandleMapUpdate(double latitude, double longitude) | ||||
| { | ||||
|    logger_->trace("Handle map update: {}, {}", latitude, longitude); | ||||
| 
 | ||||
|    double distanceInMeters; | ||||
| 
 | ||||
|    for (const auto& site : p->radarSites_) | ||||
|    { | ||||
|       p->geodesic_.Inverse(latitude, | ||||
|                            longitude, | ||||
|                            site->latitude(), | ||||
|                            site->longitude(), | ||||
|                            distanceInMeters); | ||||
|       p->distanceMap_[site->id()] = distanceInMeters; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| RadarSiteModelImpl::RadarSiteModelImpl() : | ||||
|     radarSites_ {}, | ||||
|     geodesic_(GeographicLib::Constants::WGS84_a(), | ||||
|               GeographicLib::Constants::WGS84_f()), | ||||
|     distanceMap_ {}, | ||||
|     distanceDisplay_ {scwx::common::DistanceType::Miles}, | ||||
|     previousPosition_ {} | ||||
| { | ||||
|    // Get all loaded radar sites
 | ||||
|    std::vector<std::shared_ptr<config::RadarSite>> radarSites = | ||||
|  | @ -131,6 +186,7 @@ RadarSiteModelImpl::RadarSiteModelImpl() : radarSites_ {} | |||
|    // Setup radar site list
 | ||||
|    for (auto& site : radarSites) | ||||
|    { | ||||
|       distanceMap_[site->id()] = 0.0; | ||||
|       radarSites_.emplace_back(std::move(site)); | ||||
|    } | ||||
| } | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ public: | |||
|                        Qt::Orientation orientation, | ||||
|                        int             role = Qt::DisplayRole) const override; | ||||
| 
 | ||||
|    void HandleMapUpdate(double latitude, double longitude); | ||||
| 
 | ||||
| private: | ||||
|    std::unique_ptr<RadarSiteModelImpl> p; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat