38QVariant q_coordinateInterpolator(
const QGeoCoordinate &from,
const QGeoCoordinate &to, qreal progress)
42 return QVariant::fromValue(from);
44 return QVariant::fromValue(to);
48 QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress);
50 return QVariant::fromValue(result);
55 const QGeoMercatorCoordinatePrivate* fromMercator =
56 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
57 const QGeoMercatorCoordinatePrivate* toMercator =
58 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
60 double toX = toMercator->m_mercatorX;
61 double toY = toMercator->m_mercatorY;
62 double fromX = fromMercator->m_mercatorX;
63 double fromY = fromMercator->m_mercatorY;
65 if (0.5 < qAbs(toX - fromX)) {
74 x = sx + (ex - sx) * progress;
80 x = fromX + (toX - fromX) * progress;
83 double y = fromY + (toY - fromY) * progress;
85 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
86 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
87 return QVariant::fromValue(result);
92 const QGeoMercatorCoordinatePrivate* fromMercator =
93 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
94 const QGeoMercatorCoordinatePrivate* toMercator =
95 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
97 double toX = toMercator->m_mercatorX;
98 double toY = toMercator->m_mercatorY;
99 double fromX = fromMercator->m_mercatorX;
100 double fromY = fromMercator->m_mercatorY;
101 double diff = toX - fromX;
108 double x = fromX + (toX - fromX) * progress;
109 double y = fromY + (toY - fromY) * progress;
114 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
115 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
117 return QVariant::fromValue(result);
122 const QGeoMercatorCoordinatePrivate* fromMercator =
123 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&from));
124 const QGeoMercatorCoordinatePrivate* toMercator =
125 static_cast<
const QGeoMercatorCoordinatePrivate*>(QGeoCoordinatePrivate::get(&to));
127 double toX = toMercator->m_mercatorX;
128 double toY = toMercator->m_mercatorY;
129 double fromX = fromMercator->m_mercatorX;
130 double fromY = fromMercator->m_mercatorY;
131 double diff = toX - fromX;
138 double x = fromX + (toX - fromX) * progress;
139 double y = fromY + (toY - fromY) * progress;
144 QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y));
145 result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress);
147 return QVariant::fromValue(result);
150QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent)
151 : QQuickPropertyAnimation(*(
new QQuickGeoCoordinateAnimationPrivate), parent)
154 Q_D(QQuickGeoCoordinateAnimation);
155 d->interpolatorType = qMetaTypeId<QGeoCoordinate>();
156 d->defaultToInterpolatorType =
true;
157 d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
174void QQuickGeoCoordinateAnimation::setFrom(
const QGeoCoordinate &f)
176 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
177 QDoubleVector2D fromVector = QWebMercator::coordToMercator(f);
178 mercator->lat = f.latitude();
179 mercator->lng = f.longitude();
180 mercator->alt = f.altitude();
181 mercator->m_mercatorX = fromVector.x();
182 mercator->m_mercatorY = fromVector.y();
183 QGeoCoordinate from(*mercator);
184 QQuickPropertyAnimation::setFrom(QVariant::fromValue(from));
197void QQuickGeoCoordinateAnimation::setTo(
const QGeoCoordinate &t)
199 QGeoMercatorCoordinatePrivate *mercator =
new QGeoMercatorCoordinatePrivate();
200 QDoubleVector2D toVector = QWebMercator::coordToMercator(t);
201 mercator->lat = t.latitude();
202 mercator->lng = t.longitude();
203 mercator->alt = t.altitude();
204 mercator->m_mercatorX = toVector.x();
205 mercator->m_mercatorY = toVector.y();
206 QGeoCoordinate to(*mercator);
207 QQuickPropertyAnimation::setTo(QVariant::fromValue(to));
237void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction)
239 Q_D( QQuickGeoCoordinateAnimation);
240 d->m_direction.removeBindingUnlessInWrapper();
241 if (d->m_direction.valueBypassingBindings() == direction)
244 d->m_direction.setValueBypassingBindings(direction);
247 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateWestInterpolator));
250 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateEastInterpolator));
254 d->interpolator =
reinterpret_cast<QVariantAnimation::Interpolator>(
reinterpret_cast<
void *>(&q_coordinateShortestInterpolator));
257 d->m_direction.notify();