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();
 }