Example #1
0
 /**
  * Calculate elevation value
  * 
  * This method does directly update the route object.
  */
 public function calculateElevation()
 {
     $Calculator = new Calculation\Calculator($this->Route->elevations());
     $Calculator->calculate();
     $this->Route->set(Route\Entity::ELEVATION, $Calculator->totalElevation());
     $this->Route->set(Route\Entity::ELEVATION_UP, $Calculator->elevationUp());
     $this->Route->set(Route\Entity::ELEVATION_DOWN, $Calculator->elevationDown());
 }
Example #2
0
 public function testAlgorithmDouglasPeucker()
 {
     $Method = new ElevationMethod();
     $Method->set(ElevationMethod::DOUGLAS_PEUCKER);
     $Calc = new Calculator(array(0, 2, 4, 6, 5, 7, 4, 8, 10, 0), $Method, 2);
     $Calc->calculate();
     $this->assertEquals(13, $Calc->totalElevation());
     $this->assertEquals(13, $Calc->elevationUp());
     $this->assertEquals(13, $Calc->elevationDown());
 }
 /**
  * Run recalculations
  */
 public function run()
 {
     $Query = $this->getQuery();
     $Update = $this->prepareUpdate();
     while ($Data = $Query->fetch()) {
         $Elevation = \Runalyze\Model\Object::explode($Data['elevations']);
         $Calculator = new Elevation\Calculation\Calculator($Elevation);
         $Calculator->calculate();
         if ($Calculator->totalElevation() != $Data['elevation'] || $Calculator->elevationUp() != $Data['elevation_up']) {
             $Update->bindValue(':id', $Data['id']);
             $Update->bindValue(':elevation', $Calculator->totalElevation());
             $Update->bindValue(':elevation_up', $Calculator->elevationUp());
             $Update->bindValue(':elevation_down', $Calculator->elevationDown());
             $Update->execute();
             $this->NumberOfRoutes++;
         }
         $this->Results[$Data['id']] = array($Calculator->totalElevation(), $Calculator->elevationUp(), $Calculator->elevationDown());
     }
 }
Example #4
0
 /**
  * @param \Runalyze\Data\Laps\Lap $Lap
  */
 protected function addElevationFor(Lap $Lap)
 {
     if ($this->RouteLoop == null) {
         return;
     }
     $Calculator = new Elevation\Calculation\Calculator($this->RouteLoop->sliceElevation());
     $Calculator->calculate();
     $Lap->setElevation($Calculator->elevationUp(), $Calculator->elevationDown());
 }
 /**
  * Get different algorithms for
  * @param array $array
  * @return string
  */
 protected function getDifferentAlgorithmsFor($array)
 {
     $Method = new ElevationMethod();
     $Calculator = new Elevation\Calculation\Calculator($array);
     $TresholdRange = range(1, 10);
     $Algorithms = array(array(ElevationMethod::NONE, false), array(ElevationMethod::THRESHOLD, true), array(ElevationMethod::DOUGLAS_PEUCKER, true));
     $Code = '<table class="fullwidth zebra-style small">';
     $Code .= '<thead>';
     $Code .= '<tr><th class="r">' . __('Threshold') . ':</th>';
     foreach ($TresholdRange as $t) {
         $Code .= '<th>' . $t . '</th>';
     }
     $Code .= '</tr>';
     $Code .= '</thead>';
     $Code .= '<tbody>';
     foreach ($Algorithms as $Algorithm) {
         $Method->set($Algorithm[0]);
         $Calculator->setMethod($Method);
         $Code .= '<tr><td class="b">' . $Method->valueAsLongString() . '</td>';
         if ($Algorithm[1]) {
             foreach ($TresholdRange as $t) {
                 $highlight = Configuration::ActivityView()->elevationMinDiff() == $t && Configuration::ActivityView()->elevationMethod()->value() == $Algorithm[0] ? ' highlight' : '';
                 $Calculator->setThreshold($t);
                 $Calculator->calculate();
                 $Code .= '<td class="r' . $highlight . '">' . $Calculator->totalElevation() . '&nbsp;m</td>';
             }
         } else {
             $Calculator->calculate();
             $Code .= '<td class="c' . (Configuration::ActivityView()->elevationMethod()->value() == $Algorithm[0] ? ' highlight' : '') . '" colspan="' . count($TresholdRange) . '">' . $Calculator->totalElevation() . '&nbsp;m</td>';
         }
         $Code .= '</tr>';
     }
     $Code .= '</tbody>';
     $Code .= '</table>';
     return $Code;
 }
Example #6
0
 /**
  * Construct plot data
  * @param enum $algorithm
  * @param int $treshold
  * @return array
  */
 protected function constructPlotDataFor($algorithm, $treshold = false)
 {
     $Method = new ElevationMethod();
     $Method->set($algorithm);
     if ($treshold === false) {
         $treshold = Configuration::ActivityView()->elevationMinDiff();
     }
     $Calculator = new Data\Elevation\Calculation\Calculator($this->Context->route()->elevations());
     $Calculator->setMethod($Method);
     $Calculator->setThreshold($treshold);
     $Calculator->calculate();
     $i = 0;
     $Data = array();
     $Points = $Calculator->strategy()->smoothedData();
     $Indices = $Calculator->strategy()->smoothingIndices();
     $hasDistances = $this->Context->trackdata()->get(Trackdata\Entity::DISTANCE);
     $Distances = $this->Context->trackdata()->get(Trackdata\Entity::DISTANCE);
     $Times = $this->Context->trackdata()->get(Trackdata\Entity::TIME);
     $num = $this->Context->trackdata()->num();
     foreach ($Indices as $i => $index) {
         if ($index >= $num) {
             $index = $num - 1;
         }
         if ($hasDistances) {
             $Data[(string) $Distances[$index]] = $Points[$i];
         } else {
             $Data[(string) $Times[$index] . '000'] = $Points[$i];
         }
     }
     $this->manipulateData($Data);
     return $Data;
 }