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/'; $supportedExtensions = array(TrackFiles::FORMAT_GPX, TrackFiles::FORMAT_KML, TrackFiles::FORMAT_KMZ); if (!in_array(strtoupper($extension), $supportedExtensions)) { App::error404('Неизвестный тип'); } $tmp = TrackFiles::model()->add(array( 'owner' => App::$user->id, 'name' => 'Трек ' . date('d-m-Y H:i:s'), 'filename' => $filename, 'format' => strtoupper($extension), 'createdAt' => date('c'), )); $newName = 'track' . $tmp->id . '.' . $extension; if (!move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $newName)) { App::error404(); } App::redirect('/tracks/import/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(); } self::renderPartial('file.php', array( 'filePath' => App::getBasedir() . 'tracks/track' . $id . '.' . strtolower($trackFile->format), 'fileName' => $trackFile->filename, )); } function actionImport() { $id = (int) App::getParam('id'); if (!$id) { App::error404(); } $trackFile = TrackFiles::model()->getByPK($id); if ($trackFile->isEmpty() || $trackFile->owner != App::$user->id) { App::error404(); } switch ($trackFile->format) { case TrackFiles::FORMAT_GPX: self::importGpx($trackFile); break; case TrackFiles::FORMAT_KML: case TrackFiles::FORMAT_KMZ: self::importKml($trackFile); break; default: App::error404(); break; } App::redirect('/tracks'); } private static function importGpx($trackFile) { $gpxObject = simplexml_load_file(App::getBasedir() . 'tracks/track' . $trackFile->id . '.' . strtolower($trackFile->format)); $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(); } private static function importKml($trackFile) { $kml = new Kml(App::getBasedir() . 'tracks/track' . $trackFile->id . '.' . strtolower($trackFile->format)); $trip = Trips::model()->add( array( 'name' => $kml->getName(), 'createdAt' => $kml->getTime(), 'owner' => App::$user->id, 'distance' => 0, 'description' => 'Трек сздан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename, 'status' => Trips::STATUS_PRIVATE, ) ); $distance = 0; $tracksCounter = 1; $tracksCount = $tptCount = $wptCount = 0; foreach ($kml->getWaypoints() as $wpt) { $wayPoint = WayPoints::model()->add( array( 'tripId' => $trip->id, 'lat' => floatval($wpt['latlng']['lat']), 'lng' => floatval($wpt['latlng']['lng']), 'alt' => floatval($wpt['latlng']['alt']), 'speed' => 0, 'createdAt' => $wpt['when'], 'name' => (string) $wpt['name'], 'description' => (string) $wpt['description'], ) ); $wptCount++; } foreach ($kml->getTracks() as $trackPart) { if ($trackPart) { $track = Tracks::model()->add( array( 'tripId' => $trip->id, 'name' => $trackPart['name'] ? $trackPart['name'] : 'Фрагмент трека №' . $tracksCounter, 'distance' => 0, 'description' => $trackPart['description'], ) ); $distanceTmp = 0; $prevPoint = array(); $tracksCounter++; $trackPoints = array(); foreach ($trackPart['latlng'] as $tpt) { $trackPoint = TrackPoints::model()->add( array( 'trackId' => $track->id, 'lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lng']), 'alt' => floatval($tpt['alt']), 'createdAt' => 0, 'speed' => 0, ) ); if ($prevPoint) { $distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lng']))); } $prevPoint = array( 'lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lng']), ); $tptCount++; } $distance += $distanceTmp; $track->distance = $distanceTmp; $track->save(); } } $trip->distance = $distance; $trip->save(); $trackFile->tracksCount = count($kml->getTracks()); $trackFile->tptCount = $tptCount; $trackFile->wptCount = $wptCount; $trackFile->distance = $distance; $trackFile->save(); } }