public static function getRouteData() { $node_id = $_GET['nid']; $activity = self::loadActivity($node_id); module_load_include('inc', 'openfit_api', 'openfit_api.ActivityDataTrack'); // TODO: Store a binary version of this data so it only gets calculated once. $reader = new ActivityDataTrackReader($activity['activity_id'], 'full'); $data = $reader->readTracks(array(ActivityDataTrackAccess::LOCATION)); $data = isset($data[ActivityDataTrackAccess::LOCATION]) ? $data[ActivityDataTrackAccess::LOCATION] : null; $route = self::getViewRouteData($activity, $data); header('Content-type: application/json'); $json = (object) array('nid' => (int) $node_id, 'route' => (object) $route); die(print_r(json_encode($json), true)); }
private static function exportGpx($activity) { $info = $activity->openfit_info; $filename = str_replace(' ', '_', $info['activity']->activity_start) . '.gpx'; header("Content-Type: text/gpx/force-download"); header("Content-Disposition: attachment; filename={$filename}"); $startTime = new DateTime($info['activity']->activity_start, new DateTimeZone('UTC')); $reader = new ActivityDataTrackReader($info['activity']->activity_id, 'full'); $data = $reader->readTracks(array(ActivityDataTrackAccess::LOCATION, ActivityDataTrackAccess::ELEVATION)); $lIter = new OpenFitTrackIterator($data[ActivityDataTrackAccess::LOCATION], $startTime); $eleIter = new OpenFitTrackIterator($data[ActivityDataTrackAccess::ELEVATION], $startTime); $waypoints = array(); $lastElevation = null; while ($lIter->valid()) { $output = array(); $output['pos'] = $lIter->current(); $offset = $lIter->key(); $time = clone $startTime; $time->add(new DateInterval('PT' . $offset . 'S')); $lIter->next(); if ($eleIter->valid()) { //This is messy $offset = $eleIter->key(); $eleTime = clone $startTime; $eleTime->add(new DateInterval('PT' . $offset . 'S')); if ($eleTime == $time) { $output['ele'] = $eleIter->current(); $lastElevation = $eleIter->current(); $eleIter->next(); } else { if (isset($lastElevation)) { $output['ele'] = $lastElevation; } } } $output['time'] = $time->format("Y-m-d\\TH:i:s\\Z"); $waypoints[] = $output; } $out = new XMLWriter(); $out->openURI('php://output'); $out->startDocument('1.0', 'UTF-8'); $out->setIndent(true); $out->setIndentString(' '); $out->startElement('gpx'); $out->writeAttribute('xmlns', 'http://www.topografix.com/GPX/1/1'); $out->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema'); $out->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); $out->writeAttribute('xsi:schemaLocation', 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'); $out->writeAttribute('version', '1.1'); $out->writeAttribute('creator', 'OpenFitApi'); $out->startElement('trk'); $out->writeElement("name", $info['activity']->title); if (!empty($info['activity']->activity_notes)) { $out->writeElement('cmt', $info['activity']->activity_notes); } $out->writeElement('number', 0); $out->writeElement('type', $info['activity']->category_name); $out->startElement('trkseg'); foreach ($waypoints as $point) { $out->startElement('trkpt'); $out->writeAttribute('lat', $point['pos'][1]); $out->writeAttribute('lon', $point['pos'][2]); if (isset($point['ele'])) { $out->writeElement('ele', $point['ele']); } $out->writeElement('time', $point['time']); $out->endElement(); } $out->endElement(); $out->endElement(); $out->endElement(); $out->endDocument(); $out->flush(); }