QDateTime GPSDataParser::findPrevDate(const QDateTime& dateTime, int secs) { // We will find the item in GPS data list where the time is // at the maximum smaller than 'secs' mn of the value to match. QDateTime itemFound = dateTime.addSecs((-1)*secs); bool found = false; for (GPSDataMap::ConstIterator it = m_GPSDataMap.constBegin(); it != m_GPSDataMap.constEnd(); ++it ) { if (it.key() < dateTime) { if (it.key() > itemFound) { itemFound = it.key(); found = true; } } } if (found) return itemFound; return QDateTime(); }
void KMLGPSDataParser::CreateTrackPoints(QDomElement& parent, QDomDocument& root, int timeZone, int altitudeMode) { kmlDocument = &root; //kDebug(AREA_CODE_LOADING) << "creation d'un trackpoint" ; // create the points QDomElement kmlPointsFolder = addKmlElement(parent, QLatin1String("Folder")); addKmlTextElement(kmlPointsFolder, QLatin1String("name"), i18n("Points")); addKmlTextElement(kmlPointsFolder, QLatin1String("visibility"), QLatin1String("0")); addKmlTextElement(kmlPointsFolder, QLatin1String("open"), QLatin1String("0")); int i = 0; // cache the end to not recalculate it with large number of points GPSDataMap::ConstIterator end (m_GPSDataMap.constEnd()); for (GPSDataMap::ConstIterator it = m_GPSDataMap.constBegin(); it != end; ++it, ++i) { QDomElement kmlPointPlacemark = addKmlElement(kmlPointsFolder, QLatin1String("Placemark")); addKmlTextElement(kmlPointPlacemark, QLatin1String("name"), QString::fromUtf8("%1 %2 ").arg(i18n("Point")).arg(i)); addKmlTextElement(kmlPointPlacemark, QLatin1String("styleUrl"), QLatin1String("#track")); QDomElement kmlTimeStamp = addKmlElement(kmlPointPlacemark, QLatin1String("TimeStamp")); // GPS device are sync in time by satellite using GMT time. // If the camera time is different than GMT time, we want to // convert the GPS time to localtime of the picture to be display // in the same timeframe QDateTime GPSLocalizedTime = it.key().addSecs(timeZone*3600); addKmlTextElement(kmlTimeStamp, QLatin1String("when"), GPSLocalizedTime.toString(QLatin1String("yyyy-MM-ddThh:mm:ssZ"))); QDomElement kmlGeometry = addKmlElement(kmlPointPlacemark, QLatin1String("Point")); addKmlTextElement(kmlPointPlacemark, QLatin1String("visibility"), QLatin1String("0")); if (it.value().latitude()) { addKmlTextElement(kmlGeometry, QLatin1String("coordinates"), QString::fromUtf8("%1,%2,%3 ") .arg(it.value().longitude()).arg(it.value().latitude()).arg(it.value().altitude())); } else { addKmlTextElement(kmlGeometry, QLatin1String("coordinates"), QString::fromUtf8("%1,%2 ").arg(it.value().longitude()).arg(it.value().latitude())); } if (altitudeMode == 2 ) { addKmlTextElement(kmlGeometry, QLatin1String("altitudeMode"), QLatin1String("absolute")); } else if (altitudeMode == 1 ) { addKmlTextElement(kmlGeometry, QLatin1String("altitudeMode"), QLatin1String("relativeToGround")); } else { addKmlTextElement(kmlGeometry, QLatin1String("altitudeMode"), QLatin1String("clampToGround")); } } }
QString KMLGPSDataParser::lineString() { QString line = QLatin1String(""); // cache the end to not recalculate it with large number of points GPSDataMap::ConstIterator end (m_GPSDataMap.constEnd()); for (GPSDataMap::ConstIterator it = m_GPSDataMap.constBegin(); it != end; ++it ) { line += QString::fromUtf8("%1,%2,%3 ").arg(it.value().longitude()).arg(it.value().latitude()).arg(it.value().altitude()); } return line; }
bool GPSDataParser::matchDate(const QDateTime& photoDateTime, int maxGapTime, int timeZone, bool interpolate, int interpolationDstTime, GPSDataContainer& gpsData) { // GPS device are sync in time by satelite using GMT time. // If the camera time is different than GMT time, we need to convert it to GMT time // Using the time zone. QDateTime cameraGMTDateTime = photoDateTime.addSecs(timeZone*(-1)); kDebug( 51000 ) << "cameraGMTDateTime: " << cameraGMTDateTime << endl; // We trying to find the right date in the GPS points list. bool findItem = false; int nbSecItem = maxGapTime; int nbSecs; for (GPSDataMap::ConstIterator it = m_GPSDataMap.constBegin(); it != m_GPSDataMap.constEnd(); ++it ) { // Here we check a possible accuracy in seconds between the // Camera GMT time and the GPS device GMT time. nbSecs = abs(cameraGMTDateTime.secsTo( it.key() )); // We tring to find the minimal accuracy. if( nbSecs < maxGapTime && nbSecs < nbSecItem) { gpsData = m_GPSDataMap[it.key()]; findItem = true; nbSecItem = nbSecs; } } if (findItem) return true; // If we can't find it, we will trying to interpolate the GPS point. if (interpolate) { // The interpolate GPS point will be separate by at the maximum of 'interpolationDstTime' // seconds before and after the next and previous real GPS point found. QDateTime prevDateTime = findPrevDate(cameraGMTDateTime, interpolationDstTime); QDateTime nextDateTime = findNextDate(cameraGMTDateTime, interpolationDstTime); if (!nextDateTime.isNull() && !prevDateTime.isNull()) { GPSDataContainer prevGPSPoint = m_GPSDataMap[prevDateTime]; GPSDataContainer nextGPSPoint = m_GPSDataMap[nextDateTime]; double alt1 = prevGPSPoint.altitude(); double lon1 = prevGPSPoint.longitude(); double lat1 = prevGPSPoint.latitude(); uint t1 = prevDateTime.toTime_t(); double alt2 = nextGPSPoint.altitude(); double lon2 = nextGPSPoint.longitude(); double lat2 = nextGPSPoint.latitude(); uint t2 = nextDateTime.toTime_t(); uint tCor = cameraGMTDateTime.toTime_t(); if (tCor-t1 != 0) { gpsData.setAltitude(alt1 + (alt2-alt1) * (tCor-t1)/(t2-t1)); gpsData.setLatitude(lat1 + (lat2-lat1) * (tCor-t1)/(t2-t1)); gpsData.setLongitude(lon1 + (lon2-lon1) * (tCor-t1)/(t2-t1)); gpsData.setInterpolated(true); return true; } } } return false; }