OMGM Code
Status: Beta
Brought to you by:
ifkkiruna
--- a +++ b/omgm/gps.php @@ -0,0 +1,934 @@ +<?php + +function getIndexOpen($index, $vals) { + $IndexOpen = array(); + $j=0; + for ($i=0; $i<count($index); $i++) { + if ($vals[$index[$i]]['type'] == 'open') { + $IndexOpen[$j] = $index[$i]; + $j++; + } + } + return($IndexOpen); +} + +function getIndexClose($index, $vals) { + $IndexClose = array(); + $j=0; + for ($i=0; $i<count($index); $i++) { + if ($vals[$index[$i]]['type'] == 'close') { + $IndexClose[$j] = $index[$i]; + $j++; + } + } + return($IndexClose); +} + +function getIndexComplete($index, $vals) { + $IndexComplete = array(); + $j=0; + for ($i=0; $i<count($index); $i++) { + if ($vals[$index[$i]]['type'] == 'complete') { + $IndexComplete[$j] = $index[$i]; + $j++; + } + } + return($IndexComplete); +} + +function getIndexOpenComplete($index, $vals) { + $IndexOpenComplete = array(); + $j=0; + for ($i=0; $i<count($index); $i++) { + if (($vals[$index[$i]]['type'] == 'complete')||($vals[$index[$i]]['type'] == 'open')) { + $IndexOpenComplete[$j] = $index[$i]; + $j++; + } + } + return($IndexOpenComplete); +} + +function getLapPositions($lapIndexOpen, $posIndexOpen, $vals, &$latitudes, &$longitudes) { + $la = 0; $lo = 0; $pos = 0; + for ($j = 0; $j < count($lapIndexOpen); $j++) { + while ($posIndexOpen[$pos]<$lapIndexOpen[$j]) + $pos++; + $latitudes[$la] = $vals[$posIndexOpen[$pos]+1][value]; + $longitudes[$lo] = $vals[$posIndexOpen[$pos]+3][value]; + $la++; + $lo++; +// echo "latitudes[".$la."]=".$latitudes[$la].", longitudes[".$lo."]=".$longitudes[$lo]."<br>"; + } + // Finish + $latitudes[$la] = $vals[$posIndexOpen[count($posIndexOpen)-1]+1][value]; + $longitudes[$lo] = $vals[$posIndexOpen[count($posIndexOpen)-1]+3][value]; +// echo "latitudes[".$la."]=".$latitudes[$la].", longitudes[".$lo."]=".$longitudes[$lo]."<br>"; +} + +function tcx2posts($tcxfile, &$latitudes, &$longitudes) { + + if (!($fp = fopen($tcxfile, "r"))) { + die("could not open XML input"); + } + + $contents = fread($fp, filesize($tcxfile)); + $p = xml_parser_create(); + $res = xml_parse_into_struct($p, $contents, $vals, $index); + if ($res == 0) + echo "Couldn't parse ".$tcxfile."<br>"; + xml_parser_free($p); + $lapIndex = $index[LAP]; + $lapIndexOpen = getIndexOpen($lapIndex, $vals); + $lapIndexClose = getIndexClose($lapIndex, $vals); + $posIndex = $index[POSITION]; + $posIndexOpen = getIndexOpen($posIndex, $vals); + $posIndexClose = getIndexClose($posIndex, $vals); + getLapPositions($lapIndexOpen, $posIndexOpen, $vals, $latitudes, $longitudes); +} + +function getTcxLapTimes($index, $vals, &$laps, &$starttime) { + $la = 1; $lo = 1; + $lappt = array(); + $starttimefound = 0; + $lastpt = 0; + for ($j = 0; $j <= count($index); $j++) { + if ((($vals[$index[$j]]['type'] == 'open')&&($vals[$index[$j]]['tag'] == 'LAP'))||$firstpoint) { + $level = $vals[$index[$j]]['level']; + $open = 1; + $i = 1; + $foundname = 0; + $c=0; + $firstpoint = 1; + while ($open) { + if ((($vals[$index[$j]+$i][tag]=='LAP')&&($vals[$index[$j]+$i][type]=='close')&&($vals[$index[$j]+$i][level]==$level))||!$firstpoint) + break; + if ($vals[$index[$j]+$i][tag]=='TIME') { + list($date, $timez) = split("T", $vals[$index[$j]+$i][value]); + list($year, $month, $day) = split("-", $date); + list($time, $dummy) = split("Z", $timez); + list($hour, $minute, $second) = split(":", $time); + if (!$starttimefound) { + $starttime = mktime($hour, $minute, $second, $month, $day, $year); + $starttimefound = 1; + $lappt[0] = 0; + } + else + $lappt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime; + $c++; + } + if ($vals[$index[$j]+$i][tag]=='LATITUDEDEGREES') { + $lappt[2] = $vals[$index[$j]+$i][value]; + $c++; + } + if ($vals[$index[$j]+$i][tag]=='LONGITUDEDEGREES') { + $lappt[1] = $vals[$index[$j]+$i][value]; + $c++; + } + if ($c==3) { + $laps[] = $lappt; + // echo $lappt[0].", ".$lappt[1].", ".$lappt[2].", ".$lappt[3]."<br>"; + $firstpoint = 0; + } + $i++; + } + } + } +} + +function getTcxRoute($tptIndex, $vals, &$route, &$starttime) { + $la = 1; $lo = 1; + $trpt = array(); + $firstpoint = 1; + $nrlappoints = 0; + $timebefore = -1; + for ($j = 0; $j <= count($tptIndex); $j++) { + if (($vals[$index[$j]]['type'] == 'open')&&($vals[$index[$j]]['tag'] == 'LAP')) + $nrlappoints = 0; + if (($vals[$tptIndex[$j]]['type'] == 'open')&&($vals[$tptIndex[$j]]['tag'] == 'TRACKPOINT')) { + $level = $vals[$tptIndex[$j]]['level']; + $open = 1; + $i = 1; + $foundname = 0; + $c=0; + while ($open) { + if (($vals[$tptIndex[$j]+$i][tag]=='TRACKPOINT')&&($vals[$tptIndex[$j]+$i][type]=='close')&&($vals[$tptIndex[$j]+$i][level]==$level)) + break; + if ($vals[$tptIndex[$j]+$i][tag]=='TIME') { + list($date, $timez) = split("T", $vals[$tptIndex[$j]+$i][value]); + list($year, $month, $day) = split("-", $date); + list($time, $dummy) = split("Z", $timez); + list($hour, $minute, $second) = split(":", $time); + if ($firstpoint) { + $starttime = mktime($hour, $minute, $second, $month, $day, $year); + $trpt[0] = 0; + } + else + $trpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime; + $c++; + } + if ($vals[$tptIndex[$j]+$i][tag]=='LATITUDEDEGREES') { + $trpt[2] = $vals[$tptIndex[$j]+$i][value]; + $c++; + } + if ($vals[$tptIndex[$j]+$i][tag]=='LONGITUDEDEGREES') { + $trpt[1] = $vals[$tptIndex[$j]+$i][value]; + $c++; + } + $i++; + } + if ($c==3) { + $nrlappoints++; + if ($nrlappoints==1) + $trpt[3] = "yes"; + else + $trpt[3] = "no"; + if ($timebefore != $trpt[0]) + $route[] = $trpt; + $firstpoint = 0; + $timebefore = $trpt[0]; + } + } + } +} + +function tcx2routelaps($tcxfile, &$route, &$laps, &$starttime) { + + if (!($fp = fopen($tcxfile, "r"))) { + die("could not open XML input"); + } + + $contents = fread($fp, filesize($tcxfile)); + $p = xml_parser_create(); + $res = xml_parse_into_struct($p, $contents, $vals, $index); + if ($res == 0) + echo "Couldn't parse ".$tcxfile."<br>"; + xml_parser_free($p); + $tptIndex = $index[TRACKPOINT]; + getTcxRoute($tptIndex, $vals, $route, $starttime); + $lapindex = $index[LAP]; + getTcxLapTimes($lapindex, $vals, $laps, $starttime); + $j=0; + for ($i = 0; $i<count($laps); $i++) { + while ($j<count($route)) { + if ($route[$j][0] == $laps[$i][0]) { + $route[$j][3] = "yes"; + break; + } + $j++; + } + } + $lappt[0] = $route[count($route)-1][0]; + $lappt[1] = $route[count($route)-1][1]; + $lappt[2] = $route[count($route)-1][2]; + $route[count($route)-1][3]="yes"; + $laps[] = $lappt; +} + +function getWptPositions($wptOpenIndexComplete, $vals, &$latitudes, &$longitudes) { + $la = 1; $lo = 1; + for ($j = 0; $j <= count($wptOpenIndexComplete); $j++) { + if (($vals[$wptOpenIndexComplete[$j]]['type'] == 'open')&&($vals[$wptOpenIndexComplete[$j]]['tag'] == 'WPT')) { + $level = $vals[$wptOpenIndexComplete[$j]]['level']; + $open = 1; + $i = 1; + $foundname = 0; + while ($open) { + if (($vals[$wptOpenIndexComplete[$j]+$i][tag]=='WPT')&&($vals[$wptOpenIndexComplete[$j]+$i][type]=='close')&&($vals[$wptOpenIndexComplete[$j]+$i][level]==$level)) + break; + if ($vals[$wptOpenIndexComplete[$j]+$i][tag]=='NAME') { + if ($vals[$wptOpenIndexComplete[$j]+$i][value]=="Start") { + $latitudes[0] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT]; + $longitudes[0] = $vals[$wptOpenIndexComplete[$j]][attributes][LON]; + $foundname = 1; + } + else if ($vals[$wptOpenIndexComplete[$j]+$i][value]=="Finish") { + $finishlat = $vals[$wptOpenIndexComplete[$j]][attributes][LAT]; + $finishlon = $vals[$wptOpenIndexComplete[$j]][attributes][LON]; + $foundname = 1; + } + } + $i++; + } + if (!$foundname) { + $latitudes[$la] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT]; + $longitudes[$lo] = $vals[$wptOpenIndexComplete[$j]][attributes][LON]; + $la++; + $lo++; + } + } + if ($vals[$wptOpenIndexComplete[$j]]['type'] == 'complete') { + $latitudes[$la] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT]; + $longitudes[$lo] = $vals[$wptOpenIndexComplete[$j]][attributes][LON]; + $la++; + $lo++; + } + } + if (!isset($latitudes[0])) + $latitudes[0] = 100; + if (!isset($longitudes[0])) + $longitudes[0] = 100; + if (!isset($finishlat)) + $latitudes[$la] = 100; + if (!isset($finishlon)) + $longitudes[$lo] = 100; +} + +function gpx2posts($gpxfile, &$latitudes, &$longitudes) { + if (!($fp = fopen($gpxfile, "r"))) { + die("could not open gpx file"); + } + $contents = fread($fp, filesize($gpxfile)); + $p = xml_parser_create(); + $res = xml_parse_into_struct($p, $contents, $vals, $index); + if ($res == 0) + echo "Couldn't parse ".$gpxfile."<br>"; + xml_parser_free($p); + $wptIndex = $index[WPT]; + $wptIndexOpenComplete = getIndexOpenComplete($wptIndex, $vals); + getWptPositions($wptIndexOpenComplete, $vals, $latitudes, $longitudes); +} + +function frwdtxt2route($frwdtxtfile, &$route, &$starttime) { + + $nrlappoints = 0; + + if (!($fp = fopen($frwdtxtfile, "r"))) { + die("could not open frwd text file"); + } + + $i=0; + if ($fp) { + $firstpoint = 1; + while (!feof($fp)) { + $buffer = fgets($fp, 4096); + if (strstr($buffer, "Starttid")) { + list($dummy1, $day, $monthstr, $year, $time, $dummy2) = explode(" ", $buffer); + switch ($monthstr) { + case "januari": $month = 1; break; + case "februari": $month = 2; break; + case "mars": $month = 3; break; + case "april": $month = 4; break; + case "maj": $month = 5; break; + case "juni": $month = 6; break; + case "juli": $month = 7; break; + case "augusti": $month = 8; break; + case "september": $month = 9; break; + case "oktober": $month = 10; break; + case "november": $month = 11; break; + case "december": $month = 12; break; + } + list($hour, $minute, $second) = explode(":", $time); + $starttime = mktime($hour, $minute, $second, $month, $day, $year); + } + if (strstr($buffer, "Yes")) { + //echo $buffer; + $nrval = 15; + //$nrval = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", $time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc); + list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer); + $nrlappoints=0; + $firstpoint=0; + } else if (!$firstpoint) { + $nrval = 14; + //$nrval = sscanf($buffer, "%s\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", $time, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc); + list($time, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer); + } + if ((!$firstpoint)&&($nrval>=14)) { + //echo $lat." ".$long."<br>"; + $latarray = explode(",", $lat); + $longarray = explode(",", $long); + $latdeg = floor($latarray[0]/100); + $latmin = fmod($latarray[0], 100); + $latmin = ($latmin+$latarray[1]/10000)/60; + $latitude=$latdeg+$latmin; + $longdeg = floor($longarray[0]/100); + $longmin = fmod($longarray[0], 100); + $longmin = ($longmin+$longarray[1]/10000)/60; + $longitude = $longdeg+$longmin; + $nrlappoints++; + if ($nrlappoints==1) + $route[] = array($time, $longitude, $latitude, "yes"); + else + $route[] = array($time, $longitude, $latitude, "no"); + $i++; + } + } + fclose($fp); + } + +} + +function frwdtxt2laps($frwdtxtfile, &$laps) { + + if (!($fp = fopen($frwdtxtfile, "r"))) { + die("could not open frwd text file"); + } + + $i=0; + if ($fp) { + while (!feof($fp)) { + $buffer = fgets($fp, 4096); + if (strstr($buffer, "Yes")) { + //echo $buffer; + //list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\%s\t%s\t%s\t%s\t%s\t"); + list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer); + //echo $lat." ".$long."<br>"; + $latarray = explode(",", $lat); + $longarray = explode(",", $long); + $latdeg = floor($latarray[0]/100); + $latmin = fmod($latarray[0], 100); + $latmin = ($latmin+$latarray[1]/10000)/60; + $latitude = $latdeg+$latmin; + $longdeg = floor($longarray[0]/100); + $longmin = fmod($longarray[0], 100); + $longmin = ($longmin+$longarray[1]/10000)/60; + $longitude = $longdeg+$longmin; + $laps[] = array($time, $longitude, $latitude); + $i++; + } + } + fclose($fp); + } +} + +function frwdtxt2routelaps($frwdtxtfile, &$route, &$laps, &$starttime) { + if (!($fp = fopen($frwdtxtfile, "r"))) + die("could not open frwd text file"); + frwdtxt2route($frwdtxtfile, &$route, &$starttime); + frwdtxt2laps($frwdtxtfile, &$laps); +} + +function frwdtxt2posts($frwdtxtfile, &$latitudes, &$longitudes) { + + if (!($fp = fopen($frwdtxtfile, "r"))) { + die("could not open frwd text file"); + } + + $i=0; + if ($fp) { + while (!feof($fp)) { + $buffer = fgets($fp, 4096); + if (strstr($buffer, "Yes")) { + //echo $buffer; + //list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\%s\t%s\t%s\t%s\t%s\t"); + list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer); + //echo $lat." ".$long."<br>"; + $latarray = explode(",", $lat); + $longarray = explode(",", $long); + $latdeg = floor($latarray[0]/100); + $latmin = fmod($latarray[0], 100); + $latmin = ($latmin+$latarray[1]/10000)/60; + $latitudes[$i]=$latdeg+$latmin; + $longdeg = floor($longarray[0]/100); + $longmin = fmod($longarray[0], 100); + $longmin = ($longmin+$longarray[1]/10000)/60; + $longitudes[$i]=$longdeg+$longmin; + $i++; + } + } + fclose($fp); + } + +} + +function to_posts($file, $type) { + if (is_uploaded_file($file)) { + switch ($type) { + case "tcx": + tcx2posts($file, $latitudes, $longitudes); + break; + case "frwd": + frwdtxt2posts($file, $latitudes, $longitudes); + break; + case "gpx": + gpx2posts($file, $latitudes, $longitudes); + break; + default: return(false); break; + } + if ($longitudes[0] == 100) + $_POST["startx"] = ""; + else + $_POST["startx"] = $longitudes[0]; + if ($latitudes[0] == 100) + $_POST["starty"] = ""; + else + $_POST["starty"] = $latitudes[0]; + $_POST["nrposts"] = count($longitudes)-2; + for ($i=0; $i<$_POST["nrposts"]; $i++) { + $_POST['post'][$i][x] = $longitudes[$i+1]; + $_POST["post"][$i][y] = $latitudes[$i+1]; + } + if ($longitudes[count($longitudes)-1]==100) { + $_POST["finishx"] = ""; + } + else + $_POST["finishx"] = $longitudes[count($longitudes)-1]; + if ($latitudes[count($latitudes)-1]==100) + $_POST["finishy"] = ""; + else + $_POST["finishy"] = $latitudes[count($latitudes)-1]; + return(true); + } + return(false); +} + +function nrspaces($nrspaces) { + $indentstr = ""; + for ($i=0; $i<$nrspaces; $i++) { + $indentstr .= " "; + } + return($indentstr); +} + +function convert_to_tcx($starttime, $waypoints, $route, $filename) { + header('Content-Type: text/plain'); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"; + echo "<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2 http://www.garmin.com/xmlschemas/ActivityExtensionv2.xsd http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd\">\n"; + echo "<Activities>\n"; + echo " <Activity Sport=\"Running\">\n"; + $starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime); + echo " <Id>".$starttimestamp."</Id>\n"; + $lapstr = nrspaces(4)."<Lap StartTime=\"".$starttimestamp."\">\n"; + $distancelap = 0; + $timelap = 0; + $totaldistance = 0; + $wptsartime = explode(":", $waypoints); + $routeartime = explode(":", $route); + $firstpoint = new Point(); + $secondpoint = new Point(); + $routept = explode(",", $routeartime[0]); + $firstpoint->lon = $routept[1]; + $firstpoint->lat = $routept[2]; + $nrspaces = 6; // used to get nicer look + $trackstrlap = nrspaces($nrspaces)."<Track>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Time>".$starttimestamp."</Time>\n"; + $trackstrlap .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Position>\n"; + $trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + for ($i=1; $i<count($routeartime); $i++) { + $routept = explode(",", $routeartime[$i]); + $secondpoint->lon = $routept[1]; + $secondpoint->lat = $routept[2]; + $line = new Line($firstpoint, $secondpoint); + $totaldistance += $line->getLength()*1000; + $firstpoint->lon = $routept[1]; + $firstpoint->lat = $routept[2]; + if ($routept[3] != "yes") { + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n"; + $timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]); + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstrlap .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Position>\n"; + $trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + } + else { + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n"; + $timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]); + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstrlap .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Position>\n"; + $trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Track>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Lap>\n"; + $distlap = $totaldistance-$distancelap; + $distancelap = $totaldistance; + $timel = $routept[0]-$timelap; + $timelap = $routept[0]; + $nrspaces += 2; + $lapstr .= nrspaces($nrspaces)."<TotalTimeSeconds>".sprintf("%.7f", $timel)."</TotalTimeSeconds>\n"; + $lapstr .= nrspaces($nrspaces)."<DistanceMeters>".$distlap."</DistanceMeters>\n"; + $lapstr .= nrspaces($nrspaces)."<MaximumSpeed>0</MaximumSpeed>\n"; + $lapstr .= nrspaces($nrspaces)."<Calories>0</Calories>\n"; + $lapstr .= nrspaces($nrspaces)."<Intensity>Active</Intensity>\n"; + $lapstr .= nrspaces($nrspaces)."<TriggerMethod>Manual</TriggerMethod>\n"; + echo $lapstr.$trackstrlap; + $nrspaces -= 2; + $lapstr = nrspaces($nrspaces)."<Lap StartTime=\"".$timestamp."\">\n"; + $nrspaces += 2; + $trackstrlap = nrspaces($nrspaces)."<Track>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstrlap .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Position>\n"; + $trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + } + } + $nrspaces -= 2; + echo "\n"; + echo nrspaces($nrspaces)."</Activity>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Activities>\n"; + echo nrspaces($nrspaces)."<Author xsi:type=\"Application_t\">\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Name>FROG</Name>\n"; + echo nrspaces($nrspaces)."<Build>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Version>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n"; + echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n"; + echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n"; + echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Version>\n"; + echo nrspaces($nrspaces)."<Type>Release</Type>\n"; + $buildtime = date("Y-m-d\TH:i:s\Z"); + echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n"; + echo nrspaces($nrspaces)."<Builder>frog</Builder>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Build>\n"; + if (isset($_SESSION["lang"])) + echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n"; + else + echo nrspaces($nrspaces)."<LangID>sv</LangID>\n"; + echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Author>\n"; + $nrspaces -= 2; + echo "\n"; + echo nrspaces($nrspaces)."</TrainingCenterDatabase>"; +} + +function convert_to_tcx_course($starttime, $waypoints, $route, $filename) { + $nrspaces=0; + header('Content-Type: text/plain'); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"; + echo "<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2 http://www.garmin.com/xmlschemas/ActivityExtensionv2.xsd http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd\">\n"; + $nrspaces+=2; + echo "\n"; + echo nrspaces($nrspaces)."<Courses>\n"; + $nrspaces+=2; + echo nrspaces($nrspaces)."<Course>\n"; + $nrspaces+=2; + $starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime); + echo nrspaces($nrspaces)."<Name>".substr($filename, 0, 15)."</Name>\n"; + $nrspaceslap = $nrspaces; + $lapstrar = array(); + $lapstr = nrspaces($nrspaceslap)."<Lap>\n"; + $distancelap = 0; + $timelap = 0; + $totaldistance = 0; + $wptsartime = explode(":", $waypoints); + $routeartime = explode(":", $route); + $firstpoint = new Point(); + $secondpoint = new Point(); + $routept = explode(",", $routeartime[0]); + $firstpoint->lon = $routept[1]; + $firstpoint->lat = $routept[2]; + $trackstr = nrspaces($nrspaces)."<Track>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Trackpoint>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Time>".$starttimestamp."</Time>\n"; + $trackstr .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Position>\n"; + $trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + for ($i=1; $i<count($routeartime); $i++) { + $routept = explode(",", $routeartime[$i]); + $secondpoint->lon = $routept[1]; + $secondpoint->lat = $routept[2]; + $line = new Line($firstpoint, $secondpoint); + $totaldistance += $line->getLength()*1000; + $firstpoint->lon = $routept[1]; + $firstpoint->lat = $routept[2]; + if ($routept[3] != "yes") { + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Trackpoint>\n"; + $timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]); + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstr .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Position>\n"; + $trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + } + else { + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Trackpoint>\n"; + $timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]); + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstr .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Position>\n"; + $trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Trackpoint>\n"; + $distlap = $totaldistance-$distancelap; + $distancelap = $totaldistance; + $timel = $routept[0]-$timelap; + $timelap = $routept[0]; + $nrspaceslap += 2; + $lapstr .= nrspaces($nrspaceslap)."<TotalTimeSeconds>".sprintf("%.7f", $timel)."</TotalTimeSeconds>\n"; + $lapstr .= nrspaces($nrspaceslap)."<DistanceMeters>".$distlap."</DistanceMeters>\n"; + $lapstr .= nrspaces($nrspaceslap)."<Intensity>Active</Intensity>\n"; + $nrspaceslap -= 2; + $lapstr .= nrspaces($nrspaceslap)."</Lap>\n"; + $lapstrar[] = $lapstr; + //echo $lapstr.$trackstrlap; + $lapstr = nrspaces($nrspaceslap)."<Lap>\n"; + $trackstr .= nrspaces($nrspaces)."<Trackpoint>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n"; + $trackstr .= nrspaces($nrspaces)."<Position>\n"; + $nrspaces += 2; + $trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n"; + $trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Position>\n"; + $trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n"; + $nrspaces -= 2; + $trackstr .= nrspaces($nrspaces)."</Trackpoint>\n"; + $nrspaces -= 2; + } + } + for ($i=0; $i<count($lapstrar); $i++) + echo $lapstrar[$i]; + echo $trackstr; + echo nrspaces($nrspaces)."</Track>\n"; + echo "\n"; + echo nrspaces($nrspaces)."<Creator xsi:type=\"Application_t\">\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Name>FROG</Name>\n"; + echo nrspaces($nrspaces)."<Build>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Version>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n"; + echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n"; + echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n"; + echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Version>\n"; + echo nrspaces($nrspaces)."<Type>Release</Type>\n"; + $buildtime = date("Y-m-d\TH:i:s\Z"); + echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n"; + echo nrspaces($nrspaces)."<Builder>frog</Builder>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Build>\n"; + if (isset($_SESSION["lang"])) + echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n"; + else + echo nrspaces($nrspaces)."<LangID>sv</LangID>\n"; + echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Creator>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Course>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Courses>\n"; + echo "\n\n"; + echo nrspaces($nrspaces)."<Author xsi:type=\"Application_t\">\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Name>FROG</Name>\n"; + echo nrspaces($nrspaces)."<Build>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<Version>\n"; + $nrspaces += 2; + echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n"; + echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n"; + echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n"; + echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Version>\n"; + echo nrspaces($nrspaces)."<Type>Release</Type>\n"; + $buildtime = date("Y-m-d\TH:i:s\Z"); + echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n"; + echo nrspaces($nrspaces)."<Builder>frog</Builder>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Build>\n"; + if (isset($_SESSION["lang"])) + echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n"; + else + echo nrspaces($nrspaces)."<LangID>sv</LangID>\n"; + echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n"; + $nrspaces -= 2; + echo nrspaces($nrspaces)."</Author>\n"; + $nrspaces -= 2; + echo "\n"; + echo nrspaces($nrspaces)."</TrainingCenterDatabase>"; +} + +function convert_to_gpx($starttime, $route, $filename) { + header('Content-Type: text/plain'); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + $starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime); + $routeartime = explode(":", $route); + $nrspaceswpt = 2; + $wptstr = ""; + $nrspacestrk = 2; + $trkstr = nrspaces($nrspacestrk)."<trk>\n"; + $nrspacestrk += 2; + $trkstr .= nrspaces($nrspacestrk)."<name>".$filename."</name>\n"; + $trkstr .= nrspaces($nrspacestrk)."<trkseg>\n"; + $nrspacestrk += 2; + for ($i=0; $i<count($routeartime); $i++) { + $routept = explode(",", $routeartime[$i]); + $timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]); + $trkstr .= nrspaces($nrspacestrk)."<trkpt lon=\"".$routept[1]."\" lat=\"".$routept[2]."\">\n"; + $nrspacestrk += 2; + $trkstr .= nrspaces($nrspacestrk)."<time>".$timestamp."</time>\n"; + $nrspacestrk -= 2; + $trkstr .= nrspaces($nrspacestrk)."</trkpt>\n"; + if ($routept[3] == "yes") { + $wptstr .= nrspaces($nrspaceswpt)."<wpt lon=\"".$routept[1]."\" lat=\"".$routept[2]."\">\n"; + $nrspaceswpt += 2; + $wptstr .= nrspaces($nrspaceswpt)."<time>".$timestamp."</time>\n"; + if ($i==0) + $wptstr .= nrspaces($nrspaceswpt)."<name>Start</name>\n"; + if ($i==(count($routeartime)-1)) + $wptstr .= nrspaces($nrspaceswpt)."<name>Finish</name>\n"; + $nrspaceswpt -= 2; + $wptstr .= nrspaces($nrspaceswpt)."</wpt>\n"; + } + } + $nrspacestrk -= 2; + $trkstr .= nrspaces($nrspacestrk)."</trkseg>\n"; + $nrspacestrk -= 2; + $trkstr .= nrspaces($nrspacestrk)."</trk>\n"; + echo "<gpx xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" version=\"1.1\" creator=\"FROG\" xmlns=\"http://www.topografix.com/GPX/1/1\">\n\n"; + echo $wptstr."\n".$trkstr."\n</gpx>"; +} + +function getGpxRoute($tptIndex, $vals, $wpt, &$route, &$starttime) { + $starttimefound = 0; + $wptind = 0; + for ($j = 0; $j <= count($tptIndex); $j++) { + if (($vals[$tptIndex[$j]][type] == 'open')&&($vals[$tptIndex[$j]][tag] == 'TRKPT')) { + $i = 1; + $trpt[1] = $vals[$tptIndex[$j]][attributes][LON]; + $trpt[2] = $vals[$tptIndex[$j]][attributes][LAT]; + while ($open) { + if (($vals[$tptIndex[$j+$i]][type] == 'close')&&($vals[$tptIndex[$j+$i]][tag] == 'TRKPT')) + break; + if ($vals[$tptIndex[$j+$i]][tag] == 'TIME') { + list($date, $timez) = split("T", $vals[$index[$j]+$i][value]); + list($year, $month, $day) = split("-", $date); + list($time, $dummy) = split("Z", $timez); + list($hour, $minute, $second) = split(":", $time); + if (!$starttimefound) { + $starttime = mktime($hour, $minute, $second, $month, $day, $year); + $starttimefound = 1; + $trpt[0] = 0; + } + else + $trpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime; + if ($wpt[$wptind] == $trpt[0]) { + $wptind++; + $trpt[2] = "yes"; + } + else + $trpt[2] = "no"; + break; + } + } + $route[] = $trpt; + } + } +} + +function getGpxWptTimes($wptOpenIndexComplete, $vals, &$starttime, &$wpt) { + $firsttime = 1; + for ($j = 0; $j < count($wptOpenIndexComplete); $j++) { + if (($vals[$wptOpenIndexComplete[$j]]['type'] == 'open')&&($vals[$wptOpenIndexComplete[$j]]['tag'] == 'WPT')) { + $level = $vals[$index[$j]]['level']; + $wptpt[1] = $vals[$wptOpenIndexComplete[$j]][attributes][LON]; + $wptpt[2] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT]; + $i = 1; + $open = 1; + while ($open) { + if (($vals[$wptOpenIndexComplete[$j]+$i][tag]=='WPT')&&($vals[$wptOpenIndexComplete[$j]+$i][type]=='close')&&($vals[$wptOpenIndexComplete[$j]+$i][level]==$level)) + break; + if ($vals[$wptOpenIndexComplete[$j]+$i][tag]=='TIME') { + list($date, $timez) = split("T", $vals[$wptOpenIndexComplete[$j]+$i][value]); + list($year, $month, $day) = split("-", $date); + list($time, $dummy) = split("Z", $timez); + list($hour, $minute, $second) = split(":", $time); + if ($firsttime) { + $starttime = mktime($hour, $minute, $second, $month, $day, $year); + $wptpt[0] = 0; + $firsttime = 0; + } + else + $wptpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime; + $open = 0; + } + $i++; + } + } + $wpt[] = $wptpt; + } +} + +function gpx2routelaps($gpxfile, &$route, &$wpt, &$starttime) { + if (!($fp = fopen($gpxfile, "r"))) + die("could not open gpx file"); + $contents = fread($fp, filesize($gpxfile)); + $p = xml_parser_create(); + $res = xml_parse_into_struct($p, $contents, $vals, $index); + if ($res == 0) + echo "Couldn't parse ".$gpxfile."<br>"; + xml_parser_free($p); + $wptIndex = $index[WPT]; + $wptIndexOpenComplete = getIndexOpenComplete($wptIndex, $vals); + getGpxWptTimes($wptIndexOpenComplete, $vals, &$starttime, &$wpt); + $tptIndex = $index[TRKPT]; + getGpxRoute($tptIndex, $vals, $wpt, &$route, &$starttime); +} + +?>