36QVariant q_coordinateInterpolator(
const QGeoCoordinate &from,
const QGeoCoordinate &to, qreal progress)
40 return QVariant::fromValue(from);
42 return QVariant::fromValue(to);
46 QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress);
48 return QVariant::fromValue(result);
53 const QGeoMercatorCoordinatePrivate* fromMercator =
54 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
55 const QGeoMercatorCoordinatePrivate* toMercator =
56 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
58 double toX = toMercator->m_mercatorX;
59 double toY = toMercator->m_mercatorY;
60 double fromX = fromMercator->m_mercatorX;
61 double fromY = fromMercator->m_mercatorY;
63 if (0.5 < qAbs(toX - fromX)) {
72 x = sx + (ex - sx) * progress;
78 x = fromX + (toX - fromX) * progress;
81 double y = fromY + (toY - fromY) * progress;
83 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
84 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
85 return QVariant::fromValue(result);
90 const QGeoMercatorCoordinatePrivate* fromMercator =
91 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
92 const QGeoMercatorCoordinatePrivate* toMercator =
93 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
95 double toX = toMercator->m_mercatorX;
96 double toY = toMercator->m_mercatorY;
97 double fromX = fromMercator->m_mercatorX;
98 double fromY = fromMercator->m_mercatorY;
99 double diff = toX - fromX;
106 double x = fromX + (toX - fromX) * progress;
107 double y = fromY + (toY - fromY) * progress;
112 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
113 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
115 return QVariant::fromValue(result);
120 const QGeoMercatorCoordinatePrivate* fromMercator =
121 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
122 const QGeoMercatorCoordinatePrivate* toMercator =
123 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
125 double toX = toMercator->m_mercatorX;
126 double toY = toMercator->m_mercatorY;
127 double fromX = fromMercator->m_mercatorX;
128 double fromY = fromMercator->m_mercatorY;
129 double diff = toX - fromX;
136 double x = fromX + (toX - fromX) * progress;
137 double y = fromY + (toY - fromY) * progress;
142 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
143 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
145 return QVariant::fromValue(result);
148QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent)
149 : QQuickPropertyAnimation(*(
new QQuickGeoCoordinateAnimationPrivate), parent)
152 Q_D(QQuickGeoCoordinateAnimation);
153 d->interpolatorType = qMetaTypeId<QGeoCoordinate>();
154 d->defaultToInterpolatorType =
true;
155 d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
172void QQuickGeoCoordinateAnimation::setFrom(
const QGeoCoordinate &f)
174 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
175 QDoubleVector2D fromVector = QWebMercator::coordToMercator(f);
176 mercator->lat = f.latitude();
177 mercator->lng = f.longitude();
178 mercator->alt = f.altitude();
179 mercator->m_mercatorX = fromVector.x();
180 mercator->m_mercatorY = fromVector.y();
181 QGeoCoordinate from(*mercator);
182 QQuickPropertyAnimation::setFrom(QVariant::fromValue(from));
195void QQuickGeoCoordinateAnimation::setTo(
const QGeoCoordinate &t)
197 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
198 QDoubleVector2D toVector = QWebMercator::coordToMercator(t);
199 mercator->lat = t.latitude();
200 mercator->lng = t.longitude();
201 mercator->alt = t.altitude();
202 mercator->m_mercatorX = toVector.x();
203 mercator->m_mercatorY = toVector.y();
204 QGeoCoordinate to(*mercator);
205 QQuickPropertyAnimation::setTo(QVariant::fromValue(to));
232void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction)
234 Q_D( QQuickGeoCoordinateAnimation);
235 d->m_direction.removeBindingUnlessInWrapper();
236 if (d->m_direction.valueBypassingBindings() == direction)
239 d->m_direction.setValueBypassingBindings(direction);
242 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateWestInterpolator));
245 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateEastInterpolator));
249 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateShortestInterpolator));
252 d->m_direction.notify();