39QVariant q_coordinateInterpolator(
const QGeoCoordinate &from,
const QGeoCoordinate &to, qreal progress)
43 return QVariant::fromValue(from);
45 return QVariant::fromValue(to);
49 QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress);
51 return QVariant::fromValue(result);
56 const QGeoMercatorCoordinatePrivate* fromMercator =
57 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
58 const QGeoMercatorCoordinatePrivate* toMercator =
59 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
61 double toX = toMercator->m_mercatorX;
62 double toY = toMercator->m_mercatorY;
63 double fromX = fromMercator->m_mercatorX;
64 double fromY = fromMercator->m_mercatorY;
66 if (0.5 < qAbs(toX - fromX)) {
75 x = sx + (ex - sx) * progress;
81 x = fromX + (toX - fromX) * progress;
84 double y = fromY + (toY - fromY) * progress;
86 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
87 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
88 return QVariant::fromValue(result);
93 const QGeoMercatorCoordinatePrivate* fromMercator =
94 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
95 const QGeoMercatorCoordinatePrivate* toMercator =
96 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
98 double toX = toMercator->m_mercatorX;
99 double toY = toMercator->m_mercatorY;
100 double fromX = fromMercator->m_mercatorX;
101 double fromY = fromMercator->m_mercatorY;
102 double diff = toX - fromX;
109 double x = fromX + (toX - fromX) * progress;
110 double y = fromY + (toY - fromY) * progress;
115 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
116 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
118 return QVariant::fromValue(result);
123 const QGeoMercatorCoordinatePrivate* fromMercator =
124 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
125 const QGeoMercatorCoordinatePrivate* toMercator =
126 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
128 double toX = toMercator->m_mercatorX;
129 double toY = toMercator->m_mercatorY;
130 double fromX = fromMercator->m_mercatorX;
131 double fromY = fromMercator->m_mercatorY;
132 double diff = toX - fromX;
139 double x = fromX + (toX - fromX) * progress;
140 double y = fromY + (toY - fromY) * progress;
145 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
146 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
148 return QVariant::fromValue(result);
151QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent)
152 : QQuickPropertyAnimation(*(
new QQuickGeoCoordinateAnimationPrivate), parent)
155 Q_D(QQuickGeoCoordinateAnimation);
156 d->interpolatorType = qMetaTypeId<QGeoCoordinate>();
157 d->defaultToInterpolatorType =
true;
158 d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
175void QQuickGeoCoordinateAnimation::setFrom(
const QGeoCoordinate &f)
177 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
178 QDoubleVector2D fromVector = QWebMercator::coordToMercator(f);
179 mercator->lat = f.latitude();
180 mercator->lng = f.longitude();
181 mercator->alt = f.altitude();
182 mercator->m_mercatorX = fromVector.x();
183 mercator->m_mercatorY = fromVector.y();
184 QGeoCoordinate from(*mercator);
185 QQuickPropertyAnimation::setFrom(QVariant::fromValue(from));
198void QQuickGeoCoordinateAnimation::setTo(
const QGeoCoordinate &t)
200 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
201 QDoubleVector2D toVector = QWebMercator::coordToMercator(t);
202 mercator->lat = t.latitude();
203 mercator->lng = t.longitude();
204 mercator->alt = t.altitude();
205 mercator->m_mercatorX = toVector.x();
206 mercator->m_mercatorY = toVector.y();
207 QGeoCoordinate to(*mercator);
208 QQuickPropertyAnimation::setTo(QVariant::fromValue(to));
238void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction)
240 Q_D( QQuickGeoCoordinateAnimation);
241 d->m_direction.removeBindingUnlessInWrapper();
242 if (d->m_direction.valueBypassingBindings() == direction)
245 d->m_direction.setValueBypassingBindings(direction);
248 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateWestInterpolator));
251 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateEastInterpolator));
255 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateShortestInterpolator));
258 d->m_direction.notify();