Beispiel #1
0
 public function performAction()
 {
     /** @var Table[] $tables */
     $tables = array(Points::table(), Segment5::table(), Segment10::table(), Segment50::table(), Segment100::table(), Segment500::table(), Segment1k::table(), Segment5k::table(), Segment10k::table(), Segment10s::table(), Segment60s::table());
     $log = new Log('colored-stdout');
     if ($this->wipe) {
         foreach ($tables as $table) {
             $table->migration()->setLog($log)->setDryRun($this->dryRun)->rollback();
         }
     }
     foreach ($tables as $table) {
         $table->migration()->setLog($log)->setDryRun($this->dryRun)->apply();
     }
 }
Beispiel #2
0
    public function performAction()
    {
        $utFrom = strtotime($this->from);
        $utTo = strtotime($this->to);
        $cols = Segment10s::columns();
        $pageSize = 1000;
        $offset = 0;
        $statement = Segment10s::statement()->where('? >= ? AND ? <= ?', $cols->ut, $utFrom, $cols->ut, $utTo)->order('? DESC', $cols->ut)->limit($pageSize);
        $head = <<<'GPX'
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><gpx version="1.1" creator="GPS Essentials - http://www.gpsessentials.com" xmlns="http://www.topografix.com/GPX/1/1"><trk><name>Track-150901-201618 Hcm</name><desc></desc><number>12</number><trkseg>
GPX;
        $tail = <<<'GPX'
</trkseg></trk></gpx>
GPX;
        $out = fopen($this->out, 'w');
        fwrite($out, $head);
        $hours = array();
        $lastHour = '';
        date_default_timezone_set('UTC');
        do {
            $res = $statement->query()->fetchAll();
            echo $statement, PHP_EOL;
            echo count($res), PHP_EOL;
            $items = '';
            /** @var Segment100 $segment */
            foreach ($res as $segment) {
                $dateTime = date('c', $segment->ut);
                $dateTime = substr($dateTime, 0, 19) . 'Z';
                $hour = substr($dateTime, 0, 13);
                if ($hour !== $lastHour) {
                    $hours[$segment->ut] = array('hour' => $dateTime, 'lat' => $segment->latitude, 'lon' => $segment->longitude, 'speed' => $segment->speed);
                    $lastHour = $hour;
                }
                $item = <<<GPX
<trkpt lat="{$segment->latitude}" lon="{$segment->longitude}"><ele>{$segment->elevation}</ele><speed>{$segment->speed}</speed><time>{$dateTime}</time></trkpt>
GPX;
                fwrite($out, $item);
            }
            $offset += $pageSize;
            $statement->offset($offset);
        } while ($res);
        fwrite($out, $tail);
        date_default_timezone_set('NZ');
        foreach ($hours as $ut => &$data) {
            $data['local'] = date('c', $ut);
        }
        file_put_contents($this->out . '.json', json_encode($hours));
    }
 public function performAction()
 {
     if (!file_exists($this->path)) {
         throw new \Exception(Expression::create('File ? not found', $this->path));
     }
     $GPSEssentials = new GPSEssentials($this->path);
     $database = new Database('sqlite:///' . realpath($this->path));
     $database->log(new Log('colored-stdout'));
     TrackElement::bindDatabase($database);
     //$this->count = $database->query("SELECT COUNT(1) AS c FROM ?", TrackElement::table())->fetchRow('c');
     $pageQuery = TrackElement::statement()->order("? ASC", TrackElement::columns()->id)->limit($this->pageSize);
     if ($this->from) {
         $pageQuery->where('? >= 1000 * ?', TrackElement::columns()->time, strtotime($this->from));
     }
     if ($this->to) {
         $pageQuery->where('? <= 1000 * ?', TrackElement::columns()->time, strtotime($this->to));
     }
     $this->segments = array(Segment5::className(), Segment10::className(), Segment100::className(), Segment500::className(), Segment1k::className(), Segment5k::className(), Segment10k::className());
     $timeSegments = array(Segment10s::className(), Segment60s::className());
     /** @var BatchSaver[] $batchSavers */
     $batchSavers = array();
     foreach ($this->segments as $segment) {
         $batchSavers[$segment] = new BatchSaver();
     }
     foreach ($timeSegments as $segment) {
         $batchSavers[$segment] = new BatchSaver();
     }
     while ($res = $pageQuery->query()->fetchAll()) {
         /** @var TrackElement $row */
         foreach ($res as $row) {
             $row->time /= 1000;
             /** @var Segment5|string $segment */
             foreach ($this->segments as $segment) {
                 if (!isset($this->lastPoints[$segment])) {
                     $this->lastPoints[$segment] = $row;
                 }
                 /** @var TrackElement $lastPoint */
                 $lastPoint = $this->lastPoints[$segment];
                 if (($distance = GPSEssentials::distance($lastPoint, $row)) > $segment::MIN_DISTANCE) {
                     /** @var Segment5 $segmentItem */
                     $segmentItem = new $segment();
                     $segmentItem->distance = $distance;
                     $segmentItem->latitude = $row->latitude;
                     $segmentItem->longitude = $row->longitude;
                     $segmentItem->ut = $row->time;
                     $segmentItem->altitude = $row->altitude;
                     $segmentItem->time = $row->time - $lastPoint->time;
                     if ($segmentItem->time) {
                         $segmentItem->speed = $segmentItem->distance / $segmentItem->time;
                     }
                     $segmentItem->elevation = $row->altitude - $lastPoint->altitude;
                     $batchSavers[$segment]->add($segmentItem);
                     //$segmentItem->save();
                     $this->lastPoints[$segment] = $row;
                 }
             }
             /** @var Segment10s|string $segment */
             foreach ($timeSegments as $segment) {
                 if (!isset($this->lastPoints[$segment])) {
                     $this->lastPoints[$segment] = $row;
                 }
                 /** @var TrackElement $lastPoint */
                 $lastPoint = $this->lastPoints[$segment];
                 if ($row->time - $lastPoint->time > $segment::MIN_TIME) {
                     /** @var Segment5 $segmentItem */
                     $segmentItem = new $segment();
                     $segmentItem->distance = GPSEssentials::distance($lastPoint, $row);
                     $segmentItem->latitude = $row->latitude;
                     $segmentItem->longitude = $row->longitude;
                     $segmentItem->ut = $row->time;
                     $segmentItem->altitude = $row->altitude;
                     $segmentItem->time = $row->time - $lastPoint->time;
                     if ($segmentItem->time) {
                         $segmentItem->speed = $segmentItem->distance / $segmentItem->time;
                     }
                     $segmentItem->elevation = $row->altitude - $lastPoint->altitude;
                     $batchSavers[$segment]->add($segmentItem);
                     //$segmentItem->save();
                     $this->lastPoints[$segment] = $row;
                 }
             }
         }
         $this->offset += $this->pageSize;
         $pageQuery->offset($this->offset);
     }
     foreach ($batchSavers as $batchSaver) {
         $batchSaver->flush();
     }
 }