ADD файлы треков можно парсить и всё сохранять в базу. Из базы треки достаются и показываются на карте.

This commit is contained in:
Krivchikov Dmitry 2016-05-15 18:50:43 +03:00
parent 2663d00739
commit 24365e064c
9 changed files with 268 additions and 12 deletions

View File

@ -577,4 +577,72 @@ class JsonController extends Controller
));
}
static function actionTrack()
{
$id = intval(App::getParam('id'));
if (!$id) {
App::error404();
}
$trip = Trips::model()->getByPK($id);
if ($trip->isEmpty() || ($trip->status != Trips::STATUS_PUBLIC && $trip->owner != App::$user->id)) {
App::error404();
}
$res = array(
'name' => $trip->name,
'time' => $trip->createdAt,
);
$resWayPoints = array();
$resTracks = array();
$resLatlngs = array();
$wayPoints = WayPoints::model()->getAll(array('where' => '`tripId` = ?'), array($trip->id));
if ($wayPoints) {
foreach ($wayPoints as $block) {
$resWayPoints[] = array(
'lat' => floatval($block->lat),
'lng' => floatval($block->lng),
'time' => strtotime($block->createdAt),
'name' => (string) $block->name,
'desc' => (string) $block->description,
);
}
}
$tracks = Tracks::model()->getAll(array('where' => '`tripId` = ?'), array($trip->id));
if ($tracks) {
foreach ($tracks as $track) {
$resLatlngs = array();
$trackPoints = TrackPoints::model()->getAll(array('where' => '`trackId` = ?'), array($track->id));
if ($trackPoints) {
foreach ($trackPoints as $trackPoint) {
$resLatlngs[] = array(
'lat' => $trackPoint->lat,
'lng' => $trackPoint->lng,
);
}
}
$resTracks[] = array(
'name' => (string) $block->name,
'length' => 0,
'latlngs' => $resLatlngs,
);
}
}
$res['wayPoints'] = $resWayPoints;
$res['tracks'] = $resTracks;
self::renderPartial('json.php', $res);
}
}

View File

@ -4,6 +4,10 @@ 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'));
@ -15,9 +19,13 @@ class TracksController extends Controller
}
function actionMy()
function actionIndex()
{
$trips = Trips::model()->getAll(array('where' => '`owner` = ?'), array(App::$user->id));
self::render('/tracks/index.php', array(
'trips' => $trips,
));
}
function actionFiles()
@ -31,12 +39,11 @@ class TracksController extends Controller
function actionUploadfile()
{
//var_dump($_POST, $_FILES);
$temp = pathinfo($_FILES['file']['name']);
$filename = $_FILES['file']['name'];
$extension = strtolower($temp['extension']);
$uploaddir = App::getBasedir().'tracks/';
// var_dump($extension);die;
if ($extension !== 'gpx') {
App::error404('Неизвестный тип');
}
@ -49,11 +56,104 @@ class TracksController extends Controller
));
$newName = 'track'.$tmp->id . '.' . $extension;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $newName)) {
var_dump($tmp);
} else {
if (!move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $newName)) {
App::error404();
}
App::redirect('/tracks/files');
}
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();
}
print_r($trackFile);
$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,
)
);
$wayPoints = array();
$tracks = array();
$latlngs = array();
$tracksCounter = 1;
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,
)
);
}
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' => '',
)
);
$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,
)
);
}
}
}
}
}
App::redirect('/tracks');
}
}

17
models/TrackPoints.php Normal file
View File

@ -0,0 +1,17 @@
<?php
class TrackPoints extends Model
{
function __construct($fromArray = array())
{
$this->_tableName_ = 'trackPoints';
parent::__construct($fromArray);
}
static function model()
{
return new self();
}
}

17
models/Tracks.php Normal file
View File

@ -0,0 +1,17 @@
<?php
class Tracks extends Model
{
function __construct($fromArray = array())
{
$this->_tableName_ = 'tracks';
parent::__construct($fromArray);
}
static function model()
{
return new self();
}
}

21
models/Trips.php Normal file
View File

@ -0,0 +1,21 @@
<?php
class Trips extends Model
{
const STATUS_PRIVATE = 'PRIVATE';
const STATUS_PUBLIC = 'PUBLIC';
const STATUS_DELETED = 'DELETED';
function __construct($fromArray = array())
{
$this->_tableName_ = 'trips';
parent::__construct($fromArray);
}
static function model()
{
return new self();
}
}

17
models/WayPoints.php Normal file
View File

@ -0,0 +1,17 @@
<?php
class WayPoints extends Model
{
function __construct($fromArray = array())
{
$this->_tableName_ = 'wayPoints';
parent::__construct($fromArray);
}
static function model()
{
return new self();
}
}

View File

@ -577,27 +577,24 @@ function onLocationError(e) {
alert('Ошибка при определении координат: ' + e.message);
}
function drawTrek()
function drawTrek(id)
{
colors = ['red', 'green', 'blue'];
track = new Array();
$.ajax({
url: "/index/test/",
url: "/json/track/id/"+id,
success: function (data) {
if (typeof (data.tracks) != 'undefined') {
for (var i = 0; i < data.tracks.length; i++) {
color = colors[Math.floor(Math.random() * colors.length)]
// console.log(color);
track[i] = L.polyline(data.tracks[i].latlngs, {color: color, width: 4, opacity: 0.8});
track[i].addTo(myMap);
track[i].bindPopup(data.tracks[i].name);
}
// myMap.fitBounds(track[i].getBounds());
}
if (typeof (data.wayPoints) != 'undefined') {
for (var i = 0; i < data.wayPoints.length; i++) {
// console.log(data.wayPoints[i]);
L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}).addTo(myMap);
}
}

View File

@ -11,7 +11,7 @@
if ($files) {
foreach ($files as $file) {
print $file->id . ' — ' . $file->name . ' ('. $file->filename.')<br/>';
print $file->id . ' — ' . $file->name . ' ('. $file->filename.') <a href="/tracks/importgpx/id/' . $file->id . '" title="Импортировать - создать НОВЫЙ трек на карте"><span class="glyphicon glyphicon-import" aria-hidden="true"></span></a><br/>';
}
} else {
print 'Пока ничего не загружено';

19
views/tracks/index.php Normal file
View File

@ -0,0 +1,19 @@
<h3>Ваши треки</h3>
<a href="/tracks/files">загрузка треков</a>
<hr/>
<?php
if ($trips) {
foreach ($trips as $trip) {
print $trip->id;
print ' — ';
print $trip->name;
print ' (';
print $trip->createdAt;
print ') — ';
print $trip->description;
print '<br/>';
}
} else {
print 'Пока ничего не загружено';
}