Marble

PlacemarkPositionProviderPlugin.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2011 Guillaume Martres <[email protected]>
4 // SPDX-FileCopyrightText: 2011, 2012 Bernhard Beschow <[email protected]>
5 //
6 
7 #include "PlacemarkPositionProviderPlugin.h"
8 
9 #include "GeoDataPlacemark.h"
10 #include "MarbleClock.h"
11 #include "MarbleModel.h"
12 #include "MarbleDebug.h"
13 
14 #include <QIcon>
15 
16 using namespace Marble;
17 
18 PlacemarkPositionProviderPlugin::PlacemarkPositionProviderPlugin( MarbleModel *marbleModel, QObject* parent )
19  : PositionProviderPlugin(parent),
20  m_marbleModel( marbleModel ),
21  m_placemark( nullptr ),
22  m_speed( 0 ),
23  m_direction( 0.0 ),
24  m_status( PositionProviderStatusUnavailable ),
25  m_isInitialized( false )
26 {
27  m_accuracy.level = GeoDataAccuracy::Detailed;
28 }
29 
30 QString PlacemarkPositionProviderPlugin::name() const
31 {
32  return tr( "Placemark position provider Plugin" );
33 }
34 
35 QString PlacemarkPositionProviderPlugin::nameId() const
36 {
37  return QStringLiteral("Placemark");
38 }
39 
40 QString PlacemarkPositionProviderPlugin::guiString() const
41 {
42  return tr( "Placemark" );
43 }
44 
45 QString PlacemarkPositionProviderPlugin::version() const
46 {
47  return QStringLiteral("1.0");
48 }
49 
50 QString PlacemarkPositionProviderPlugin::description() const
51 {
52  return tr( "Reports the position of a placemark" );
53 }
54 
55 QString PlacemarkPositionProviderPlugin::copyrightYears() const
56 {
57  return QStringLiteral("2011, 2012");
58 }
59 
60 QVector<PluginAuthor> PlacemarkPositionProviderPlugin::pluginAuthors() const
61 {
62  return QVector<PluginAuthor>()
63  << PluginAuthor(QStringLiteral("Guillaume Martres"), QStringLiteral("[email protected]"))
64  << PluginAuthor(QStringLiteral("Bernhard Beschow"), QStringLiteral("[email protected]"));
65 }
66 
67 QIcon PlacemarkPositionProviderPlugin::icon() const
68 {
69  return QIcon();
70 }
71 
72 void PlacemarkPositionProviderPlugin::initialize()
73 {
74  if ( m_marbleModel ) {
75  setPlacemark( m_marbleModel->trackedPlacemark() );
76  connect( m_marbleModel, SIGNAL(trackedPlacemarkChanged(const GeoDataPlacemark*)),
77  this, SLOT(setPlacemark(const GeoDataPlacemark*)) );
78  } else {
79  mDebug() << "PlacemarkPositionProviderPlugin: MarbleModel not set, cannot track placemarks.";
80  }
81  m_isInitialized = true;
82 }
83 
84 bool PlacemarkPositionProviderPlugin::isInitialized() const
85 {
86  return m_isInitialized;
87 }
88 
89 PositionProviderPlugin* PlacemarkPositionProviderPlugin::newInstance() const
90 {
91  return new PlacemarkPositionProviderPlugin( m_marbleModel );
92 }
93 
94 PositionProviderStatus PlacemarkPositionProviderPlugin::status() const
95 {
96  return m_status;
97 }
98 
99 GeoDataCoordinates PlacemarkPositionProviderPlugin::position() const
100 {
101  return m_coordinates;
102 }
103 
104 GeoDataAccuracy PlacemarkPositionProviderPlugin::accuracy() const
105 {
106  return m_accuracy;
107 }
108 
109 qreal PlacemarkPositionProviderPlugin::speed() const
110 {
111  return m_speed;
112 }
113 
114 qreal PlacemarkPositionProviderPlugin::direction() const
115 {
116  return m_direction;
117 }
118 
119 QDateTime PlacemarkPositionProviderPlugin::timestamp() const
120 {
121  return m_marbleModel->clockDateTime();
122 }
123 
124 void PlacemarkPositionProviderPlugin::setPlacemark( const GeoDataPlacemark *placemark )
125 {
126  const GeoDataPlacemark *const oldPlacemark = m_placemark;
127 
128  if ( oldPlacemark != nullptr ) {
129  emit statusChanged( PositionProviderStatusUnavailable );
130  }
131 
132  m_placemark = placemark;
133  m_timestamp = placemark ? m_marbleModel->clockDateTime() : QDateTime();
134  GeoDataCoordinates const newCoordinates = placemark ? placemark->coordinate( m_timestamp ) : GeoDataCoordinates();
135  if ( m_coordinates.isValid() && newCoordinates.isValid() ) {
136  m_direction = m_coordinates.bearing( newCoordinates, GeoDataCoordinates::Degree, GeoDataCoordinates::FinalBearing );
137  }
138  m_coordinates = newCoordinates;
139  m_status = placemark ? PositionProviderStatusAvailable : PositionProviderStatusUnavailable;
140  m_speed = 0.0;
141 
142  disconnect( m_marbleModel->clock(), SIGNAL(timeChanged()), this, SLOT(updatePosition()) );
143  if ( placemark ) {
144  connect( m_marbleModel->clock(), SIGNAL(timeChanged()), this, SLOT(updatePosition()) );
145  }
146 
147  if ( oldPlacemark != m_placemark && m_placemark != nullptr ) {
148  emit statusChanged( m_status );
149  }
150 
151  if ( m_status == PositionProviderStatusAvailable ) {
152  emit positionChanged( m_coordinates, m_accuracy );
153  }
154 }
155 
156 void PlacemarkPositionProviderPlugin::updatePosition()
157 {
158  if ( m_placemark == nullptr ) {
159  return;
160  }
161 
162  Q_ASSERT( m_marbleModel && "MarbleModel missing in PlacemarkPositionProviderPlugin" );
163 
164  const GeoDataCoordinates previousCoordinates = m_coordinates;
165  m_coordinates = m_placemark->coordinate( m_marbleModel->clock()->dateTime() );
166  m_direction = previousCoordinates.bearing( m_coordinates, GeoDataCoordinates::Degree, GeoDataCoordinates::FinalBearing );
167 
168  if ( m_timestamp.isValid() ) {
169  const qreal averageAltitude = ( m_coordinates.altitude() + m_coordinates.altitude() ) / 2.0 + m_marbleModel->planetRadius();
170  const qreal distance = previousCoordinates.sphericalDistanceTo(m_coordinates) * averageAltitude;
171  const qreal seconds = m_timestamp.msecsTo( m_marbleModel->clockDateTime() ) / 1000.0;
172  m_speed = ( seconds > 0 ) ? ( distance / seconds ) : 0;
173  }
174  else {
175  m_speed = 0;
176  }
177 
178  m_timestamp = m_marbleModel->clockDateTime();
179 
180  emit positionChanged( m_coordinates, m_accuracy );
181 }
182 
183 #include "moc_PlacemarkPositionProviderPlugin.cpp"
A 3d point representation.
The abstract class that provides position information.
KOSM_EXPORT double distance(const std::vector< const OSM::Node * > &path, Coordinate coord)
GeoDataCoordinates coordinate(const QDateTime &dateTime=QDateTime(), bool *iconAtCoordinates=nullptr) const
Return the coordinates of the placemark at time dateTime as a GeoDataCoordinates.
Q_SCRIPTABLE CaptureState status()
Binds a QML item to a specific geodetic location in screen coordinates.
bool isValid() const
Returns.
a class representing a point of interest on the map
qreal sphericalDistanceTo(const GeoDataCoordinates &other) const
This method calculates the shortest distance between two points on a sphere.
qreal bearing(const GeoDataCoordinates &other, Unit unit=Radian, BearingType type=InitialBearing) const
Returns the bearing (true bearing, the angle between the line defined by this point and the other and...
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:86
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Sep 21 2023 04:12:27 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.