QGeoCoordinate QGeoProjection::coordinateInterpolation(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) { QDoubleVector2D s = QGeoProjection::coordToMercator(from); QDoubleVector2D e = QGeoProjection::coordToMercator(to); double x = s.x(); if (0.5 < qAbs(e.x() - s.x())) { // handle dateline crossing double ex = e.x(); double sx = s.x(); if (ex < sx) sx -= 1.0; else if (sx < ex) ex -= 1.0; x = (1.0 - progress) * sx + progress * ex; if (!qFuzzyIsNull(x) && (x < 0.0)) x += 1.0; } else { x = (1.0 - progress) * s.x() + progress * e.x(); } double y = (1.0 - progress) * s.y() + progress * e.y(); QGeoCoordinate result = QGeoProjection::mercatorToCoord(QDoubleVector2D(x, y)); result.setAltitude((1.0 - progress) * from.altitude() + progress * to.altitude()); return result; }
void altitude() { QFETCH(double, value); QGeoCoordinate c; c.setAltitude(value); QCOMPARE(c.altitude(), value); QGeoCoordinate c2 = c; QCOMPARE(c.altitude(), value); QCOMPARE(c2, c); }
void GeolocationClientQt::positionUpdated(const QGeoPositionInfo &geoPosition) { if (!geoPosition.isValid()) return; QGeoCoordinate coord = geoPosition.coordinate(); double latitude = coord.latitude(); double longitude = coord.longitude(); bool providesAltitude = (geoPosition.coordinate().type() == QGeoCoordinate::Coordinate3D); double altitude = coord.altitude(); double accuracy = geoPosition.attribute(QGeoPositionInfo::HorizontalAccuracy); bool providesAltitudeAccuracy = geoPosition.hasAttribute(QGeoPositionInfo::VerticalAccuracy); double altitudeAccuracy = geoPosition.attribute(QGeoPositionInfo::VerticalAccuracy); bool providesHeading = geoPosition.hasAttribute(QGeoPositionInfo::Direction); double heading = geoPosition.attribute(QGeoPositionInfo::Direction); bool providesSpeed = geoPosition.hasAttribute(QGeoPositionInfo::GroundSpeed); double speed = geoPosition.attribute(QGeoPositionInfo::GroundSpeed); double timeStampInSeconds = geoPosition.timestamp().toMSecsSinceEpoch() / 1000; m_lastPosition = GeolocationPosition::create(timeStampInSeconds, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed); WebCore::Page* page = QWebPagePrivate::core(m_page); page->geolocationController()->positionChanged(m_lastPosition.get()); }
void QTMLocationProvider::positionUpdated(const QGeoPositionInfo &geoPosition) { if (!geoPosition.isValid()) { NS_WARNING("Invalida geoposition received"); return; } QGeoCoordinate coord = geoPosition.coordinate(); double latitude = coord.latitude(); double longitude = coord.longitude(); double altitude = coord.altitude(); double accuracy = geoPosition.attribute(QGeoPositionInfo::HorizontalAccuracy); double altitudeAccuracy = geoPosition.attribute(QGeoPositionInfo::VerticalAccuracy); double heading = geoPosition.attribute(QGeoPositionInfo::Direction); bool providesSpeed = geoPosition.hasAttribute(QGeoPositionInfo::GroundSpeed); double speed = geoPosition.attribute(QGeoPositionInfo::GroundSpeed); nsRefPtr<nsGeoPosition> p = new nsGeoPosition(latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed, geoPosition.timestamp().toTime_t()); if (mCallback) { mCallback->Update(p); } }
/*! \internal */ void QDeclarativeRectangleMapItem::dragEnded() { QPointF newTopLeftPoint = QPointF(x(),y()); QGeoCoordinate newTopLeft = map()->screenPositionToCoordinate(newTopLeftPoint, false); if (newTopLeft.isValid()) { // calculate new geo width while checking for dateline crossing const double lonW = bottomRight_.longitude() > topLeft_.longitude() ? bottomRight_.longitude() - topLeft_.longitude() : bottomRight_.longitude() + 360 - topLeft_.longitude(); const double latH = qAbs(bottomRight_.latitude() - topLeft_.latitude()); QGeoCoordinate newBottomRight; // prevent dragging over valid min and max latitudes if (QLocationUtils::isValidLat(newTopLeft.latitude() - latH)) { newBottomRight.setLatitude(newTopLeft.latitude() - latH); } else { newBottomRight.setLatitude(QLocationUtils::clipLat(newTopLeft.latitude() - latH)); newTopLeft.setLatitude(newBottomRight.latitude() + latH); } // handle dateline crossing newBottomRight.setLongitude(QLocationUtils::wrapLong(newTopLeft.longitude() + lonW)); newBottomRight.setAltitude(newTopLeft.altitude()); topLeft_ = newTopLeft; bottomRight_ = newBottomRight; geometry_.setPreserveGeometry(true, newTopLeft); borderGeometry_.setPreserveGeometry(true, newTopLeft); geometry_.markSourceDirty(); borderGeometry_.markSourceDirty(); updateMapItem(); emit topLeftChanged(topLeft_); emit bottomRightChanged(bottomRight_); } }
void PointInPolygonWidget::positionUpdated(const QGeoPositionInfo &info) { QGeoPositionInfo pos_info = info; QGeoCoordinate pos = pos_info.coordinate(); if (pos.isValid()) { ui->xNewPoint->setValue(pos.latitude()); ui->yNewPoint->setValue(pos.longitude()); ui->xPoint->setValue(pos.latitude()); ui->yPoint->setValue(pos.longitude()); double dist = 0; if (is_first_distance_) { dist_acc_ = 0; is_first_distance_ = false; } else { if (std::fabs(pos.altitude()) < 1e-3) { pos.setAltitude(last_position_.coordinate().altitude()); pos_info.setCoordinate(pos); } dist = pos_info.coordinate().distanceTo(last_position_.coordinate()); if (dist > 10) { dist_acc_ += dist; } } last_position_ = pos_info; } }
static void calculatePeripheralPoints(QList<QGeoCoordinate> &path, const QGeoCoordinate ¢er, qreal distance, int steps) { // Calculate points based on great-circle distance // Calculation is the same as GeoCoordinate's atDistanceAndAzimuth function // but tweaked here for computing multiple points // pre-calculate qreal latRad = qgeocoordinate_degToRad(center.latitude()); qreal lonRad = qgeocoordinate_degToRad(center.longitude()); qreal cosLatRad = std::cos(latRad); qreal sinLatRad = std::sin(latRad); qreal ratio = (distance / (qgeocoordinate_EARTH_MEAN_RADIUS * 1000.0)); qreal cosRatio = std::cos(ratio); qreal sinRatio = std::sin(ratio); qreal sinLatRad_x_cosRatio = sinLatRad * cosRatio; qreal cosLatRad_x_sinRatio = cosLatRad * sinRatio; for (int i = 0; i < steps; ++i) { qreal azimuthRad = 2 * M_PI * i / steps; qreal resultLatRad = std::asin(sinLatRad_x_cosRatio + cosLatRad_x_sinRatio * std::cos(azimuthRad)); qreal resultLonRad = lonRad + std::atan2(std::sin(azimuthRad) * cosLatRad_x_sinRatio, cosRatio - sinLatRad * std::sin(resultLatRad)); qreal lat2 = qgeocoordinate_radToDeg(resultLatRad); qreal lon2 = qgeocoordinate_radToDeg(resultLonRad); if (lon2 < -180.0) { lon2 += 360.0; } else if (lon2 > 180.0) { lon2 -= 360.0; } path << QGeoCoordinate(lat2, lon2, center.altitude()); } }
void QDeclarativeCoordinate::setCoordinate(const QGeoCoordinate &coordinate) { QGeoCoordinate previousCoordinate = m_coordinate; m_coordinate = coordinate; // Comparing two NotANumbers is false which is not wanted here if (coordinate.altitude() != previousCoordinate.altitude() && !(qIsNaN(coordinate.altitude()) && qIsNaN(previousCoordinate.altitude()))) { emit altitudeChanged(m_coordinate.altitude()); } if (coordinate.latitude() != previousCoordinate.latitude() && !(qIsNaN(coordinate.latitude()) && qIsNaN(previousCoordinate.latitude()))) { emit latitudeChanged(m_coordinate.latitude()); } if (coordinate.longitude() != previousCoordinate.longitude() && !(qIsNaN(coordinate.longitude()) && qIsNaN(previousCoordinate.longitude()))) { emit longitudeChanged(m_coordinate.longitude()); } }
QGeoCoordinate QGeoCoordinateInterpolator2D::interpolate(const QGeoCoordinate &start, const QGeoCoordinate &end, qreal progress) { if (start == end) { if (progress < 0.5) { return start; } else { return end; } } QGeoCoordinate s2 = start; QGeoCoordinate e2 = end; QDoubleVector2D s = QGeoProjection::coordToMercator(s2); QDoubleVector2D e = QGeoProjection::coordToMercator(e2); double x = s.x(); if (0.5 < qAbs(e.x() - s.x())) { // handle dateline crossing double ex = e.x(); double sx = s.x(); if (ex < sx) sx -= 1.0; else if (sx < ex) ex -= 1.0; x = (1.0 - progress) * sx + progress * ex; if (!qFuzzyIsNull(x) && (x < 0.0)) x += 1.0; } else { x = (1.0 - progress) * s.x() + progress * e.x(); } double y = (1.0 - progress) * s.y() + progress * e.y(); QGeoCoordinate result = QGeoProjection::mercatorToCoord(QDoubleVector2D(x, y)); result.setAltitude((1.0 - progress) * start.altitude() + progress * end.altitude()); return result; }
QDebug operator<<(QDebug dbg, const QGeoCoordinate &coord) { double lat = coord.latitude(); double lng = coord.longitude(); dbg.nospace() << "QGeoCoordinate("; if (qIsNaN(lat)) dbg.nospace() << '?'; else dbg.nospace() << lat; dbg.nospace() << ", "; if (qIsNaN(lng)) dbg.nospace() << '?'; else dbg.nospace() << lng; if (coord.type() == QGeoCoordinate::Coordinate3D) { dbg.nospace() << ", "; dbg.nospace() << coord.altitude(); } dbg.nospace() << ')'; return dbg; }
/*! \internal */ void QDeclarativeRectangleMapItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { if (updatingGeometry_ || newGeometry.topLeft() == oldGeometry.topLeft()) { QDeclarativeGeoMapItemBase::geometryChanged(newGeometry, oldGeometry); return; } QDoubleVector2D newTopLeftPoint = QDoubleVector2D(x(),y()); QGeoCoordinate newTopLeft = map()->itemPositionToCoordinate(newTopLeftPoint, false); if (newTopLeft.isValid()) { // calculate new geo width while checking for dateline crossing const double lonW = bottomRight_.longitude() > topLeft_.longitude() ? bottomRight_.longitude() - topLeft_.longitude() : bottomRight_.longitude() + 360 - topLeft_.longitude(); const double latH = qAbs(bottomRight_.latitude() - topLeft_.latitude()); QGeoCoordinate newBottomRight; // prevent dragging over valid min and max latitudes if (QLocationUtils::isValidLat(newTopLeft.latitude() - latH)) { newBottomRight.setLatitude(newTopLeft.latitude() - latH); } else { newBottomRight.setLatitude(QLocationUtils::clipLat(newTopLeft.latitude() - latH)); newTopLeft.setLatitude(newBottomRight.latitude() + latH); } // handle dateline crossing newBottomRight.setLongitude(QLocationUtils::wrapLong(newTopLeft.longitude() + lonW)); newBottomRight.setAltitude(newTopLeft.altitude()); topLeft_ = newTopLeft; bottomRight_ = newBottomRight; geometry_.setPreserveGeometry(true, newTopLeft); borderGeometry_.setPreserveGeometry(true, newTopLeft); markSourceDirtyAndUpdate(); emit topLeftChanged(topLeft_); emit bottomRightChanged(bottomRight_); } // Not calling QDeclarativeGeoMapItemBase::geometryChanged() as it will be called from a nested // call to this function. }
void TRMainWindow::newLocationInfoReceived(const QGeoPositionInfo positionInfo) { QGeoCoordinate currentCoords = positionInfo.coordinate(); if(m_lastKnownPosition || !(currentCoords == *m_lastKnownPosition)) { // We need to write to the file, let's initialize it if(m_outputKMLFile == NULL) { // File initialization QString timeStamp = positionInfo.timestamp().toString(Qt::ISODate); QString fileTimeStamp = positionInfo.timestamp().toString("hhmmssddMMyy"); m_outputKMLFile = new QFile("c://Data//trackroute_"+fileTimeStamp+".kml"); m_outputKMLFile->open(QIODevice::WriteOnly | QIODevice::Text); // File writer initialization if(m_kmlFileWriter == NULL) { // Header m_kmlFileWriter = new QXmlStreamWriter(m_outputKMLFile); m_kmlFileWriter->writeStartDocument(); m_kmlFileWriter->writeNamespace("http://www.opengis.net/kml/2.2","kml"); // Document m_kmlFileWriter->writeStartElement("Document"); m_kmlFileWriter->writeTextElement("name","TrackRoute Path File"); m_kmlFileWriter->writeTextElement("description","Pathfile generated by Trackroute on: "+timeStamp); // Style m_kmlFileWriter->writeStartElement("Style"); m_kmlFileWriter->writeAttribute("id","yellowLineGreenPoly"); // LineStyle m_kmlFileWriter->writeStartElement("LineStyle"); m_kmlFileWriter->writeTextElement("color","7f00ffff"); m_kmlFileWriter->writeTextElement("width","4"); m_kmlFileWriter->writeEndElement(); // PolyStyle m_kmlFileWriter->writeStartElement("PolyStyle"); m_kmlFileWriter->writeTextElement("color","7f00ff00"); m_kmlFileWriter->writeEndElement(); // End Style m_kmlFileWriter->writeEndElement(); // Placemark m_kmlFileWriter->writeStartElement("Placemark"); m_kmlFileWriter->writeTextElement("name","TrackRoute Path "+timeStamp); m_kmlFileWriter->writeTextElement("description","Path generated by Trackroute on: "+timeStamp); m_kmlFileWriter->writeTextElement("styleUrl","#yellowLineGreenPoly"); // LineString m_kmlFileWriter->writeStartElement("LineString"); m_kmlFileWriter->writeTextElement("extrude","1"); m_kmlFileWriter->writeTextElement("tessellate","1"); m_kmlFileWriter->writeTextElement("altitudeMode","absolute"); // Coordinates m_kmlFileWriter->writeStartElement("coordinates"); } } // Update data m_numberOfUpdatesReceived++; m_currentSpeed = positionInfo.attribute(QGeoPositionInfo::GroundSpeed); m_currentSpeed = m_currentSpeed > 0 ? m_currentSpeed:0; m_totalSpeed += m_currentSpeed; m_averageSpeed = m_totalSpeed / m_numberOfUpdatesReceived; QString coordString = currentCoords.toString(); // Update UI ui->latLonDataLabel->setText(coordString.left(coordString.lastIndexOf(","))); ui->altitudeDataLabel->setText(QString::number(currentCoords.altitude())+" m"); ui->wptNumberDataLabel->setText(QString::number(m_numberOfUpdatesReceived)); ui->currentSpdDataLabel->setText(QString::number(m_currentSpeed)+" km/h"); ui->averageSpdDataLabel->setText(QString::number(m_averageSpeed)+" km/h"); // Write to the KML file QString locationData = QString::number(currentCoords.latitude()).append(",").append(QString::number(currentCoords.longitude())) .append(",").append(QString::number(currentCoords.altitude())).append(" "); m_kmlFileWriter->writeCharacters(locationData); m_outputKMLFile->flush(); } m_lastKnownPosition = ¤tCoords; }
void QDeclarativePosition::setPosition(const QGeoPositionInfo &info) { // timestamp const QDateTime pTimestamp = m_info.timestamp(); const QDateTime timestamp = info.timestamp(); bool emitTimestampChanged = pTimestamp != timestamp; // coordinate const QGeoCoordinate pCoordinate = m_info.coordinate(); const QGeoCoordinate coordinate = info.coordinate(); bool emitCoordinateChanged = pCoordinate != coordinate; bool emitLatitudeValidChanged = exclusiveNaN(pCoordinate.latitude(), coordinate.latitude()); bool emitLongitudeValidChanged = exclusiveNaN(pCoordinate.longitude(), coordinate.longitude()); bool emitAltitudeValidChanged = exclusiveNaN(pCoordinate.altitude(), coordinate.altitude()); // direction const qreal pDirection = m_info.attribute(QGeoPositionInfo::Direction); const qreal direction = info.attribute(QGeoPositionInfo::Direction); bool emitDirectionChanged = !equalOrNaN(pDirection, direction); bool emitDirectionValidChanged = exclusiveNaN(pDirection, direction); // ground speed const qreal pSpeed = m_info.attribute(QGeoPositionInfo::GroundSpeed); const qreal speed = info.attribute(QGeoPositionInfo::GroundSpeed); bool emitSpeedChanged = !equalOrNaN(pSpeed, speed); bool emitSpeedValidChanged = exclusiveNaN(pSpeed, speed); // vertical speed const qreal pVerticalSpeed = m_info.attribute(QGeoPositionInfo::VerticalSpeed); const qreal verticalSpeed = info.attribute(QGeoPositionInfo::VerticalSpeed); bool emitVerticalSpeedChanged = !equalOrNaN(pVerticalSpeed, verticalSpeed); bool emitVerticalSpeedValidChanged = exclusiveNaN(pVerticalSpeed, verticalSpeed); // magnetic variation const qreal pMagneticVariation = m_info.attribute(QGeoPositionInfo::MagneticVariation); const qreal magneticVariation = info.attribute(QGeoPositionInfo::MagneticVariation); bool emitMagneticVariationChanged = !equalOrNaN(pMagneticVariation, magneticVariation); bool emitMagneticVariationValidChanged = exclusiveNaN(pMagneticVariation, magneticVariation); // horizontal accuracy const qreal pHorizontalAccuracy = m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); const qreal horizontalAccuracy = info.attribute(QGeoPositionInfo::HorizontalAccuracy); bool emitHorizontalAccuracyChanged = !equalOrNaN(pHorizontalAccuracy, horizontalAccuracy); bool emitHorizontalAccuracyValidChanged = exclusiveNaN(pHorizontalAccuracy, horizontalAccuracy); // vertical accuracy const qreal pVerticalAccuracy = m_info.attribute(QGeoPositionInfo::VerticalAccuracy); const qreal verticalAccuracy = info.attribute(QGeoPositionInfo::VerticalAccuracy); bool emitVerticalAccuracyChanged = !equalOrNaN(pVerticalAccuracy, verticalAccuracy); bool emitVerticalAccuracyValidChanged = exclusiveNaN(pVerticalAccuracy, verticalAccuracy); m_info = info; if (emitTimestampChanged) emit timestampChanged(); if (emitCoordinateChanged) emit coordinateChanged(); if (emitLatitudeValidChanged) emit latitudeValidChanged(); if (emitLongitudeValidChanged) emit longitudeValidChanged(); if (emitAltitudeValidChanged) emit altitudeValidChanged(); if (emitDirectionChanged) emit directionChanged(); if (emitDirectionValidChanged) emit directionValidChanged(); if (emitSpeedChanged) emit speedChanged(); if (emitSpeedValidChanged) emit speedValidChanged(); if (emitVerticalSpeedChanged) emit verticalSpeedChanged(); if (emitVerticalSpeedValidChanged) emit verticalSpeedValidChanged(); if (emitHorizontalAccuracyChanged) emit horizontalAccuracyChanged(); if (emitHorizontalAccuracyValidChanged) emit horizontalAccuracyValidChanged(); if (emitVerticalAccuracyChanged) emit verticalAccuracyChanged(); if (emitVerticalAccuracyValidChanged) emit verticalAccuracyValidChanged(); if (emitMagneticVariationChanged) emit magneticVariationChanged(); if (emitMagneticVariationValidChanged) emit magneticVariationValidChanged(); }