/** * Parse coordinates */ protected function parseCoordinates() { foreach ($this->XML->xpath('//coordinates') as $coordinates) { $lines = preg_split('/\\r\\n|\\r|\\n/', (string) $coordinates); foreach ($lines as $line) { $parts = explode(',', $line); if (count($parts) == 3) { if (empty($this->gps['km'])) { $this->gps['km'][] = 0; } else { $this->gps['km'][] = end($this->gps['km']) + round(GpsData::distance($parts[1], $parts[0], end($this->gps['latitude']), end($this->gps['longitude'])), ParserAbstract::DISTANCE_PRECISION); } $this->gps['latitude'][] = $parts[1]; $this->gps['longitude'][] = $parts[0]; $this->gps['altitude'][] = $parts[2]; } } } }
/** * Parse log entry * @param SimpleXMLElement $Log */ protected function parseLogEntry($Log) { if ((int) $Log->timeoffset == 0) { return; } if (empty($Log->dist) && (empty($Log->lat) || empty($Log->lon))) { return; } if (!empty($Log->dist)) { $dist = (double) $Log->dist / 1000; } elseif (empty($this->gps['latitude'])) { $dist = 0; } else { $dist = end($this->gps['km']) + GpsData::distance(end($this->gps['latitude']), end($this->gps['longitude']), (double) $Log->lat, (double) $Log->lon); } $this->gps['time_in_s'][] = (int) $Log->timeoffset; $this->gps['latitude'][] = !empty($Log->lat) ? (double) $Log->lat : 0; $this->gps['longitude'][] = !empty($Log->lon) ? (double) $Log->lon : 0; $this->gps['altitude'][] = !empty($Log->alt) ? round((int) $Log->alt) : 0; $this->gps['heartrate'][] = !empty($Log->hr) ? round((int) $Log->hr) : 0; $this->gps['km'][] = round($dist, ParserAbstract::DISTANCE_PRECISION); $this->gps['rpm'][] = !empty($Log->cad) ? (int) $Log->cad : 0; $this->gps['temp'][] = !empty($Log->temp) ? round((int) $Log->temp) : 0; $this->gps['power'][] = !empty($Log->pwr) ? round((int) $Log->pwr) : 0; }
/** * Parse trackpoint * @param SimpleXMLElement $Point */ protected function parseTrackpoint($Point) { if ($this->lastTimestamp == 0) { $this->lastTimestamp = strtotime((string) $Point->time); } if (!empty($Point['lat'])) { $lat = round((double) $Point['lat'], 7); $lon = round((double) $Point['lon'], 7); $dist = empty($this->gps['latitude']) ? 0 : round(GpsData::distance($lat, $lon, end($this->gps['latitude']), end($this->gps['longitude'])), ParserAbstract::DISTANCE_PRECISION); } elseif (count($this->gps['latitude'])) { $lat = end($this->gps['latitude']); $lon = end($this->gps['longitude']); $dist = 0; } else { return; } $newTime = $this->getTimeOfPoint($Point); if ($this->lookForPauses && $this->limitForPauses > 0 && $newTime - end($this->gps['time_in_s']) > $this->limitForPauses) { $this->wasPaused = true; $this->pauseDuration += $newTime - end($this->gps['time_in_s']); return; } $this->gps['time_in_s'][] = $newTime; $this->gps['km'][] = empty($this->gps['km']) ? $dist : $dist + end($this->gps['km']); $this->gps['latitude'][] = $lat; $this->gps['longitude'][] = $lon; $this->gps['altitude'][] = isset($Point->ele) ? (int) $Point->ele : 0; $this->parseExtensionValues($Point); if ($this->wasPaused) { $num = count($this->gps['heartrate']); $this->TrainingObject->Pauses()->add(new \Runalyze\Model\Trackdata\Pause($this->gps['time_in_s'][$num - 2], $this->pauseDuration, $this->gps['heartrate'][$num - 2], $this->gps['heartrate'][$num - 1])); $this->wasPaused = false; $this->pauseDuration = 0; } }
/** * Calculate distance to trackpoint * @param SimpleXMLElement $TP * @return int */ protected function distanceToTrackpoint(SimpleXMLElement &$TP) { if (empty($this->gps['km'])) { return empty($TP->Position) ? 0 : 0.001; } if (empty($TP->Position)) { return end($this->gps['km']); } return end($this->gps['km']) + GpsData::distance(end($this->gps['latitude']), end($this->gps['longitude']), (double) $TP->Position->LatitudeDegrees, (double) $TP->Position->LongitudeDegrees); }
/** * Read trackpoint * @param string $line */ private function readTrackpoint($line) { $values = preg_split('/[\\s]+/', $line); $num = count($values); if ($num < 7) { return; } $latitude = floatval($values[2]); $longitude = floatval($values[3]); $time = strtotime($values[4] . ' ' . $values[5]) - $this->starttime - $this->pauseInSeconds; if (!$this->isStarted) { $this->isStarted = true; $this->starttime = $time; $time = 0; } if ($values[6] == 'N' && $time > 0) { $this->isPaused = true; if ($time == end($this->gps['time_in_s'])) { return; } } elseif ($this->isPaused) { $this->isPaused = false; $pause = $time > 0 ? $time - end($this->gps['time_in_s']) : 0; $time -= $pause; $this->pauseInSeconds += $pause; $this->latitude = $latitude; $this->longitude = $longitude; return; } $this->gps['time_in_s'][] = $time; $this->gps['km'][] = $this->latitude === false ? 0 : end($this->gps['km']) + round(GpsData::distance($latitude, $longitude, $this->latitude, $this->longitude), ParserAbstract::DISTANCE_PRECISION); $this->gps['latitude'][] = $latitude; $this->gps['longitude'][] = $longitude; $this->gps['altitude'][] = $num > 7 && $values[7] != '-1' ? round($values[7]) : 0; $this->gps['temp'][] = $num > 14 && $values[14] != '-1' ? round($values[14]) : 0; $this->gps['heartrate'][] = $num > 17 && $values[17] != '-1' ? round($values[17]) : 0; $this->latitude = $latitude; $this->longitude = $longitude; }
/** * Calculate distance */ private function setDistanceFromGPSdata() { if (!empty($this->gps['latitude']) && !empty($this->gps['longitude']) && empty($this->gps['km'])) { $num = count($this->gps['latitude']); $this->gps['km'] = array(0); $lastDistance = 0; for ($i = 1; $i < $num; ++$i) { $step = round(GpsData::distance($this->gps['latitude'][$i - 1], $this->gps['longitude'][$i - 1], $this->gps['latitude'][$i], $this->gps['longitude'][$i]), ParserAbstract::DISTANCE_PRECISION); $this->gps['km'][] = $lastDistance + $step; $lastDistance += $step; } $this->TrainingObject->setArrayDistance($this->gps['km']); $this->TrainingObject->setDistance(end($this->gps['km'])); } }
/** * Parse trackpoint * @param SimpleXMLElement $Point */ protected function parseTrackpoint($Point) { if (!empty($Point['lat'])) { $lat = round((double) $Point['lat'], 7); $lon = round((double) $Point['lon'], 7); $dist = empty($this->gps['latitude']) ? 0 : round(GpsData::distance($lat, $lon, end($this->gps['latitude']), end($this->gps['longitude'])), ParserAbstract::DISTANCE_PRECISION); } elseif (count($this->gps['latitude'])) { $lat = end($this->gps['latitude']); $lon = end($this->gps['longitude']); $dist = 0; } else { return; } $this->gps['time_in_s'][] = (int) $Point['tm']; $this->gps['km'][] = empty($this->gps['km']) ? $dist : $dist + end($this->gps['km']); $this->gps['latitude'][] = $lat; $this->gps['longitude'][] = $lon; $this->gps['altitude'][] = !empty($Point['ele']) ? (int) $Point['ele'] : 0; $this->gps['heartrate'][] = !empty($Point['hr']) ? (int) $Point['hr'] : 0; }