wikipoints/controllers/TracksController.php

210 lines
5.1 KiB
PHP

<?php
class TracksController extends Controller
{
function __construct()
{
if (!App::$user->id) {
App::redirect('/');
}
self::$layout = 'layouts/page.php';
self::addStyle('/css/style.css?ver=' . App::getConfig('version'));
self::addStyle('/css/pageStyle.css?ver=' . App::getConfig('version'));
self::addScript('/js/jquery-2.1.0.min.js');
self::addScript('/js/jquery-ui-1.10.4.custom.min.js');
self::addScript('/js/bootstrap.min.js');
self::addStyle('/css/bootstrap.min.css');
self::addStyle('/css/bootstrap-theme.min.css');
}
function actionIndex()
{
$trips = Trips::model()->getAll(array('where' => '`owner` = ?'), array(App::$user->id));
self::render('/tracks/index.php', array(
'trips' => $trips,
));
}
function actionFiles()
{
$files = TrackFiles::model()->getAll(array('where' => '`owner` = :owner'), array('owner' => App::$user->id));
self::render('/tracks/files.php', array(
'files' => $files,
));
}
function actionUploadfile()
{
$temp = pathinfo($_FILES['file']['name']);
$filename = $_FILES['file']['name'];
$extension = strtolower($temp['extension']);
$uploaddir = App::getBasedir() . 'tracks/';
if ($extension !== 'gpx') {
App::error404('Неизвестный тип');
}
$tmp = TrackFiles::model()->add(array(
'owner' => App::$user->id,
'name' => 'Трек ' . date('d-m-Y H:i:s'),
'filename' => $filename,
'createdAt' => date('c'),
));
$newName = 'track' . $tmp->id . '.' . $extension;
if (!move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $newName)) {
App::error404();
}
App::redirect('/tracks/importgpx/id/'.$tmp->id);
}
function actionGetFile()
{
$id = intval(App::getParam('id'));
if (!$id) {
App::error404();
}
$trackFile = TrackFiles::model()->getByPK($id);
if ($trackFile->isEmpty() || $trackFile->owner != App::$user->id) {
App::error404();
}
$temp = pathinfo($trackFile->filename);
$extension = strtolower($temp['extension']);
self::renderPartial('file.php', array(
'filePath' => App::getBasedir(). 'tracks/track' . $id . '.' . $extension,
'fileName' => $trackFile->filename,
));
}
function actionImportgpx()
{
$id = (int) App::getParam('id');
if (!$id) {
App::error404();
}
$trackFile = TrackFiles::model()->getByPK($id);
if ($trackFile->isEmpty() || $trackFile->owner != App::$user->id) {
App::error404();
}
$gpxObject = simplexml_load_file(App::getBasedir() . 'tracks/track' . $trackFile->id . '.gpx');
$trip = Trips::model()->add(
array(
'name' => isset($gpxObject->metadata->name) ? (string) $gpxObject->metadata->name : 'Track',
'createdAt' => isset($gpxObject->metadata->time) ? $gpxObject->metadata->time : date('c'),
'owner' => App::$user->id,
'distance' => 0,
'description' => 'Трек сздан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename,
'status' => Trips::STATUS_PRIVATE,
)
);
$distance = 0;
$wayPoints = array();
$tracks = array();
$latlngs = array();
$tracksCounter = 1;
$tracksCount = $tptCount = $wptCount = 0;
foreach ($gpxObject as $key => $block) {
if ($key == 'wpt') {
if (empty($block)) {
continue;
}
$wayPoint = WayPoints::model()->add(
array(
'tripId' => $trip->id,
'lat' => floatval($block['lat']),
'lng' => floatval($block['lon']),
'alt' => 0,
'speed' => 0,
'createdAt' => $block->time,
'name' => (string) $block->name,
'description' => (string) $block->desc,
)
);
$wptCount++;
}
if ($key == 'trk') {
if (empty($block->trkseg)) {
continue;
}
foreach ($block->trkseg as $trkpt) {
if ($trkpt) {
$track = Tracks::model()->add(
array(
'tripId' => $trip->id,
'name' => (string) $block->name ? (string) $block->name : 'Фрагмент трека №' . $tracksCounter,
'distance' => 0,
'description' => '',
)
);
$distanceTmp = 0;
$prevPoint = array();
$tracksCounter++;
$trackPoints = array();
foreach ($trkpt as $tpt) {
$trackPoint = TrackPoints::model()->add(
array(
'trackId' => $track->id,
'lat' => floatval($tpt['lat']),
'lng' => floatval($tpt['lon']),
'alt' => isset($tpt->ele) ? floatval($tpt->ele) : 0,
'createdAt' => isset($tpt->time) ? $tpt->time : date('c'),
'speed' => 0,
)
);
if ($prevPoint) {
$distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon'])));
}
$prevPoint = array(
'lat' => floatval($tpt['lat']),
'lng' => floatval($tpt['lon']),
);
$tptCount++;
}
$distance += $distanceTmp;
$track->distance = $distanceTmp;
$track->save();
}
}
$tracksCount++;
}
}
$trip->distance = $distance;
$trip->save();
$trackFile->tracksCount = $tracksCount;
$trackFile->tptCount = $tptCount;
$trackFile->wptCount = $wptCount;
$trackFile->distance = $distance;
$trackFile->save();
App::redirect('/tracks');
}
}