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