From 28591415fa916118b9c00b0dbb91b597e7b3eaa0 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 15 May 2016 11:41:21 +0300 Subject: [PATCH 01/21] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B7=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B5=20GPX.=20=D0=9D?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B9=D0=BC=D1=81=D0=BF=D0=B5=D0=B9=D1=81=D1=8B?= =?UTF-8?q?=20=D0=B2=20XML,=20=D1=82.=D0=B5.=20=D0=BD=D0=B5=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F.=20=D0=9D=D0=B0=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B5=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D1=8F=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20WPT=20=D0=B8=20=D1=84?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B0=20=D1=81=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/IndexController.php | 72 ++++++++++++++++++++++++++++++++ public/ico/marker.png | Bin 0 -> 1329 bytes public/js/map.js | 35 ++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 public/ico/marker.png diff --git a/controllers/IndexController.php b/controllers/IndexController.php index 01d5b24..cd76f3b 100644 --- a/controllers/IndexController.php +++ b/controllers/IndexController.php @@ -3,6 +3,78 @@ class IndexController extends Controller { + static function actionTest() + { +// $gpxObject = simplexml_load_file('/tmp/doc2.gpx'); + $gpxObject = simplexml_load_file('/tmp/doc(gpsvisualizer.com).gpx'); +// $gpxObject = simplexml_load_file('/tmp/1100.gpx'); + + $trip = array( + 'name' => isset($gpxObject->metadata->name) ? (string) $gpxObject->metadata->name : 'Track', + 'time' => isset($gpxObject->metadata->time) ? strtotime($gpxObject->metadata->time) : '', + ); + + $wayPoints = array(); + $tracks = array(); + $latlngs = array(); + + foreach ($gpxObject as $key => $block) { + if ($key == 'wpt') { + if (empty($block)) { + continue; + } + + $wayPoints[] = array( + 'lat' => floatval($block['lat']), + 'lng' => floatval($block['lon']), + 'time' => strtotime($block->time), + 'name' => (string) $block->name, + 'desc' => (string) $block->desc, + ); + } + + if ($key == 'trk') { +// print_r($block);die; + if (empty($block->trkseg)) { + continue; + } + + foreach ($block->trkseg as $trkpt) { + if ($trkpt) { + $trackPoints = array(); + $latlngs = array(); + foreach ($trkpt as $tpt) { +// $trackPoints[] = array( +// 'lat' => floatval($tpt['lat']), +// 'lng' => floatval($tpt['lon']), +// 'time' => isset($tpt->time) ? strtotime($tpt->time) : 0, +// 'ele' => isset($tpt->ele) ? floatval($tpt->ele) : 0, +// ); + $latlngs[] = array( + 'lat' => floatval($tpt['lat']), + 'lng' => floatval($tpt['lon']), + ); + } + } + } +// $tracks[] = $trackPoints; + $tracks[] = array( + 'name' => (string)$block->name, + 'length' => 0, + 'latlngs' => $latlngs + ); + } + } + + $trip['tracks'] = $tracks; +// $trip['latlngs'] = $latlngs; + + $trip['wayPoints'] = $wayPoints; + + + self::renderPartial('json.php', $trip); + } + /** * Действие по умолчанию */ diff --git a/public/ico/marker.png b/public/ico/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..450335309e5a1c0724662b274a655b6b21f1af19 GIT binary patch literal 1329 zcmV-11yyYaG8&D!0KNk7K&Ia(06t_{_Ta_=m`tX3DW%^4 z$VX!I7a_#Fu(0sMe+r6S*uE=0)RHz888?O zZxcd(6w2!B>(SHGgY4|=xOv~--$#FcKW1lVMRH2%I~>RT6p=}(psK3sWrks%0(dDb z>+0%))oMj*YU;IxPft%rV`C$dlanz&KYz7TLK<>&b4R^iuU}}dkUB_8N_q@H9p)Pv z8qm_x5&?90c!-&q8B9-4!|U}%=-b-bP*+zc6sa$L$1XulP0g!HrSgw3pP8A7$;nCN z7e+*482(hO`Ingg;VJQczr6EUJ05ol9wDWd-Z&>pWjtTFM_+DMqva3c?>{Wo1w( zuGDL5YqCe+>guX6`cU`rKQDed}#pg@W;l+hIBN` z4xpljzd%P|`KOfcA)z^X-78Z(v^>{p@(JaJ>2!IgsJXS3M zz-F^a8%jh9g#vwjeIgr|%Y}Ft3W)2zXaV*}^s=O`~PM@>zQwAnB? zIEb;aF`>xAvg{oIH0Et+G#c#yJ{2CL(a}-pbh?CIBg@On=;-JW4JAUz=L-u9pTxb4 z0DLQCE-o(6+1ZJSi3w0juLTZ;LKq((hs9zMfnNsjovinO$z*y;DSazSc3`zyq19?Z z2#El8yWJQV7{JofQiM-R=`)Vw?#X?S=m;Upv0hB+>FLnvbo_aDxm;LVTf^z;X{^Kq z0o-L-_BYvYLX*ifL@E6Uw?LHAuQ`shL_NB3&a@4{-?xB&OeuX7OR0>d*xug$N2AdM z0K9p_-9K7fT>K^GMz2{s1mO7%@HfxS&K}1zh#LUQvgedi>kW3_?Q*#SxAANCGk|*u z;!m?I`}%c83OSw_hWP-%K?2~uP$<+U$52)Pb8~YZLdg5V86H3Lv~_WDaZ8SGrQ9v; z?CiWytJNw1uf?q?Az!d8`=wmJibRT9Qc}_b;MX`NGZ`5fpC#gxB-+_}y Date: Sun, 15 May 2016 17:32:38 +0300 Subject: [PATCH 02/21] =?UTF-8?q?ADD=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B6=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= =?UTF-8?q?=20=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++ classes/Model.php | 23 +------------ controllers/IndexController.php | 4 +-- controllers/TracksController.php | 59 ++++++++++++++++++++++++++++++++ models/TrackFiles.php | 17 +++++++++ tracks/.gitKeep | 0 views/tracks/files.php | 18 ++++++++++ 7 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 controllers/TracksController.php create mode 100644 models/TrackFiles.php create mode 100644 tracks/.gitKeep create mode 100644 views/tracks/files.php diff --git a/.gitignore b/.gitignore index 4968059..a592d4b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,9 @@ public/photos/big/*.jpeg public/photos/big/*.png public/photos/big/*.gif +tracks/*.gpx +tracks/*.kml +tracks/*.kmz + logs/* .idea diff --git a/classes/Model.php b/classes/Model.php index 8796920..83250b3 100644 --- a/classes/Model.php +++ b/classes/Model.php @@ -204,30 +204,9 @@ abstract class Model * @param array $values - ассоциативный массив соо значениями. * @return object - id добавленной записи или false. */ - function add2($values) - { - $values = $this->_vals_; - unset($values[$this->_primaryKey_]); - - $q = array(); - foreach ($values as $val) { - $q[] = '?'; - } - - var_dump('INSERT INTO `' . $this->_tableName_ . '` (`' . implode('`, `', array_keys($values)) . '`) VALUES (' . implode(', ', array_values($q)) . ') '); - die; - $res = App::DB()->prepare_query('INSERT INTO `' . $this->_tableName_ . '` (`' . implode('`, `', array_keys($values)) . '`) VALUES (' . implode(', ', array_values($q)) . ') ', self::arrayWithTypes($values)); - - if ($res) { - throw new Exception('MySQL error #' . $res->errno . ' - ' . $res->error); - } - - return $this->getByPK(App::DB()->insert_id); - } - function add($values) { - $request = App::DB()->prepare('INSERT INTO ' . $this->_tableName_ . ' (' . implode(',', array_keys($values)) . ') values (:' . implode(', :', array_keys($values)) . ')'); + $request = App::DB()->prepare('INSERT INTO `' . $this->_tableName_ . '` (`' . implode('`, `', array_keys($values)) . '`) values (:' . implode(', :', array_keys($values)) . ')'); if ($request->execute((array) $values)) { return $this->getByPK(App::DB()->lastInsertId()); } else { diff --git a/controllers/IndexController.php b/controllers/IndexController.php index cd76f3b..7f745cd 100644 --- a/controllers/IndexController.php +++ b/controllers/IndexController.php @@ -5,8 +5,8 @@ class IndexController extends Controller static function actionTest() { -// $gpxObject = simplexml_load_file('/tmp/doc2.gpx'); - $gpxObject = simplexml_load_file('/tmp/doc(gpsvisualizer.com).gpx'); + $gpxObject = simplexml_load_file('/tmp/2.gpx'); +// $gpxObject = simplexml_load_file('/tmp/doc(gpsvisualizer.com).gpx'); // $gpxObject = simplexml_load_file('/tmp/1100.gpx'); $trip = array( diff --git a/controllers/TracksController.php b/controllers/TracksController.php new file mode 100644 index 0000000..c37d6fc --- /dev/null +++ b/controllers/TracksController.php @@ -0,0 +1,59 @@ +getAll(array('where' => '`owner` = :owner'), array('owner' => App::$user->id)); + + self::render('/tracks/files.php', array( + 'files' => $files, + )); + } + + 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('Неизвестный тип'); + } + + $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)) { + var_dump($tmp); + } else { + App::error404(); + } + } + +} diff --git a/models/TrackFiles.php b/models/TrackFiles.php new file mode 100644 index 0000000..3cbf8e6 --- /dev/null +++ b/models/TrackFiles.php @@ -0,0 +1,17 @@ +_tableName_ = 'trackFiles'; + parent::__construct($fromArray); + } + + static function model() + { + return new self(); + } + +} diff --git a/tracks/.gitKeep b/tracks/.gitKeep new file mode 100644 index 0000000..e69de29 diff --git a/views/tracks/files.php b/views/tracks/files.php new file mode 100644 index 0000000..feca95d --- /dev/null +++ b/views/tracks/files.php @@ -0,0 +1,18 @@ +
+
+ + + +
+
+
+

Ваши файлы с треками

+id . ' — ' . $file->name . ' ('. $file->filename.')
'; + } +} else { + print 'Пока ничего не загружено'; +} From 24365e064cbd8c2d9dd5673608335d73b3617034 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 15 May 2016 18:50:43 +0300 Subject: [PATCH 03/21] =?UTF-8?q?ADD=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2=20=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D1=82=D1=8C=20=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=81=D1=91=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D1=83.=20=D0=98?= =?UTF-8?q?=D0=B7=20=D0=B1=D0=B0=D0=B7=D1=8B=20=D1=82=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D1=8E=D1=82=D1=81=D1=8F?= =?UTF-8?q?=20=D0=B8=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/JsonController.php | 68 +++++++++++++++++++ controllers/TracksController.php | 112 +++++++++++++++++++++++++++++-- models/TrackPoints.php | 17 +++++ models/Tracks.php | 17 +++++ models/Trips.php | 21 ++++++ models/WayPoints.php | 17 +++++ public/js/map.js | 7 +- views/tracks/files.php | 2 +- views/tracks/index.php | 19 ++++++ 9 files changed, 268 insertions(+), 12 deletions(-) create mode 100644 models/TrackPoints.php create mode 100644 models/Tracks.php create mode 100644 models/Trips.php create mode 100644 models/WayPoints.php create mode 100644 views/tracks/index.php diff --git a/controllers/JsonController.php b/controllers/JsonController.php index 6535df9..0e27300 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -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); + } + } diff --git a/controllers/TracksController.php b/controllers/TracksController.php index c37d6fc..808ebe8 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -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'); } } diff --git a/models/TrackPoints.php b/models/TrackPoints.php new file mode 100644 index 0000000..6841536 --- /dev/null +++ b/models/TrackPoints.php @@ -0,0 +1,17 @@ +_tableName_ = 'trackPoints'; + parent::__construct($fromArray); + } + + static function model() + { + return new self(); + } + +} diff --git a/models/Tracks.php b/models/Tracks.php new file mode 100644 index 0000000..fbbbf2a --- /dev/null +++ b/models/Tracks.php @@ -0,0 +1,17 @@ +_tableName_ = 'tracks'; + parent::__construct($fromArray); + } + + static function model() + { + return new self(); + } + +} diff --git a/models/Trips.php b/models/Trips.php new file mode 100644 index 0000000..97e46a7 --- /dev/null +++ b/models/Trips.php @@ -0,0 +1,21 @@ +_tableName_ = 'trips'; + parent::__construct($fromArray); + } + + static function model() + { + return new self(); + } + +} diff --git a/models/WayPoints.php b/models/WayPoints.php new file mode 100644 index 0000000..1e1ac2e --- /dev/null +++ b/models/WayPoints.php @@ -0,0 +1,17 @@ +_tableName_ = 'wayPoints'; + parent::__construct($fromArray); + } + + static function model() + { + return new self(); + } + +} diff --git a/public/js/map.js b/public/js/map.js index 905eadf..134506d 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -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); } } diff --git a/views/tracks/files.php b/views/tracks/files.php index feca95d..e7da5b3 100644 --- a/views/tracks/files.php +++ b/views/tracks/files.php @@ -11,7 +11,7 @@ if ($files) { foreach ($files as $file) { - print $file->id . ' — ' . $file->name . ' ('. $file->filename.')
'; + print $file->id . ' — ' . $file->name . ' ('. $file->filename.')
'; } } else { print 'Пока ничего не загружено'; diff --git a/views/tracks/index.php b/views/tracks/index.php new file mode 100644 index 0000000..432080b --- /dev/null +++ b/views/tracks/index.php @@ -0,0 +1,19 @@ +

Ваши треки

+загрузка треков +
+id; + print ' — '; + print $trip->name; + print ' ('; + print $trip->createdAt; + print ') — '; + print $trip->description; + print '
'; + } +} else { + print 'Пока ничего не загружено'; +} From e714778062070506056075f734a1831dd5f801d2 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Mon, 16 May 2016 12:27:40 +0300 Subject: [PATCH 04/21] =?UTF-8?q?FIX=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=84=D1=80=D0=B0=D0=B3=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/JsonController.php | 4 ++-- controllers/TracksController.php | 2 -- public/js/map.js | 4 +++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/controllers/JsonController.php b/controllers/JsonController.php index 0e27300..d0b9733 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -609,7 +609,7 @@ class JsonController extends Controller 'lng' => floatval($block->lng), 'time' => strtotime($block->createdAt), 'name' => (string) $block->name, - 'desc' => (string) $block->description, + 'description' => nl2br($block->description), ); } } @@ -630,7 +630,7 @@ class JsonController extends Controller } $resTracks[] = array( - 'name' => (string) $block->name, + 'name' => (string) $track->name, 'length' => 0, 'latlngs' => $resLatlngs, ); diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 808ebe8..39bc390 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -77,8 +77,6 @@ class TracksController extends Controller App::error404(); } - print_r($trackFile); - $gpxObject = simplexml_load_file(App::getBasedir().'tracks/track'.$trackFile->id.'.gpx'); $trip = Trips::model()->add( diff --git a/public/js/map.js b/public/js/map.js index 134506d..6013b02 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -595,7 +595,9 @@ function drawTrek(id) if (typeof (data.wayPoints) != 'undefined') { for (var i = 0; i < data.wayPoints.length; i++) { - L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}).addTo(myMap); + marker = L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}) + marker.bindPopup('' + data.wayPoints[i]['name'] + '
' +data.wayPoints[i]['description']); + marker.addTo(myMap); } } } From 801413690bcb0a317c52a20d07311d91d6bdfa4c Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Tue, 17 May 2016 20:27:22 +0300 Subject: [PATCH 05/21] =?UTF-8?q?ADD=20=D1=80=D0=B0=D1=81=D1=81=D1=87?= =?UTF-8?q?=D1=91=D1=82=20=D0=B4=D0=BB=D0=B8=D0=BD=D1=8B=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/TracksController.php | 60 +++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 39bc390..0552efd 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -2,6 +2,7 @@ class TracksController extends Controller { + function __construct() { if (!App::$user->id) { @@ -16,7 +17,6 @@ class TracksController extends Controller self::addScript('/js/bootstrap.min.js'); self::addStyle('/css/bootstrap.min.css'); self::addStyle('/css/bootstrap-theme.min.css'); - } function actionIndex() @@ -42,7 +42,7 @@ class TracksController extends Controller $temp = pathinfo($_FILES['file']['name']); $filename = $_FILES['file']['name']; $extension = strtolower($temp['extension']); - $uploaddir = App::getBasedir().'tracks/'; + $uploaddir = App::getBasedir() . 'tracks/'; if ($extension !== 'gpx') { App::error404('Неизвестный тип'); @@ -50,12 +50,12 @@ class TracksController extends Controller $tmp = TrackFiles::model()->add(array( 'owner' => App::$user->id, - 'name' => 'Трек '.date('d-m-Y H:i:s'), + 'name' => 'Трек ' . date('d-m-Y H:i:s'), 'filename' => $filename, 'createdAt' => date('c'), )); - $newName = 'track'.$tmp->id . '.' . $extension; + $newName = 'track' . $tmp->id . '.' . $extension; if (!move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $newName)) { App::error404(); } @@ -65,7 +65,7 @@ class TracksController extends Controller function actionImportgpx() { - $id = (int)App::getParam('id'); + $id = (int) App::getParam('id'); if (!$id) { App::error404(); @@ -77,7 +77,7 @@ class TracksController extends Controller App::error404(); } - $gpxObject = simplexml_load_file(App::getBasedir().'tracks/track'.$trackFile->id.'.gpx'); + $gpxObject = simplexml_load_file(App::getBasedir() . 'tracks/track' . $trackFile->id . '.gpx'); $trip = Trips::model()->add( array( @@ -85,11 +85,12 @@ class TracksController extends Controller '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, + 'description' => 'Трек сздан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename, 'status' => Trips::STATUS_PRIVATE, ) ); + $distance = 0; $wayPoints = array(); $tracks = array(); $latlngs = array(); @@ -102,16 +103,16 @@ class TracksController extends Controller } $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, - ) + 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, + ) ); } @@ -125,16 +126,17 @@ class TracksController extends Controller $track = Tracks::model()->add( array( 'tripId' => $trip->id, - 'name' => (string)$block->name ? (string)$block->name : 'Фрагмент трека №'.$tracksCounter, + '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, @@ -145,12 +147,30 @@ class TracksController extends Controller 'speed' => 0, ) ); + + if ($prevPoint) { + $distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon']))); +// print $distanceTmp.'
'; + } + + $prevPoint = array( + 'lat' => floatval($tpt['lat']), + 'lng' => floatval($tpt['lon']), + ); } + + $distance += $distanceTmp; + $track->distance = $distanceTmp; + $track->save(); } } + } } + $trip->distance = $distance; + $trip->save(); + App::redirect('/tracks'); } From a9e2ba61131dac531d8893a3d22d09a9934c9cad Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Tue, 17 May 2016 20:27:37 +0300 Subject: [PATCH 06/21] =?UTF-8?q?ADD=20=D1=80=D0=B0=D1=81=D1=81=D1=87?= =?UTF-8?q?=D1=91=D1=82=20=D0=B4=D0=BB=D0=B8=D0=BD=D1=8B=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Geo.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 classes/Geo.php diff --git a/classes/Geo.php b/classes/Geo.php new file mode 100644 index 0000000..89b894c --- /dev/null +++ b/classes/Geo.php @@ -0,0 +1,23 @@ + Date: Thu, 19 May 2016 20:59:14 +0300 Subject: [PATCH 07/21] =?UTF-8?q?ADD=20=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D0=91=D0=94=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B5-=D1=82=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D0=B5=20-=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=BE=20=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=B5=D0=BA=20=D0=B8=20=D1=82=D0=BE=D0=BC=D1=83=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B1=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/TracksController.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 0552efd..a464e10 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -95,6 +95,7 @@ class TracksController extends Controller $tracks = array(); $latlngs = array(); $tracksCounter = 1; + $tracksCount = $tptCount = $wptCount = 0; foreach ($gpxObject as $key => $block) { if ($key == 'wpt') { @@ -114,6 +115,8 @@ class TracksController extends Controller 'description' => (string) $block->desc, ) ); + + $wptCount++; } if ($key == 'trk') { @@ -150,13 +153,13 @@ class TracksController extends Controller if ($prevPoint) { $distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon']))); -// print $distanceTmp.'
'; } $prevPoint = array( 'lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon']), ); + $tptCount++; } $distance += $distanceTmp; @@ -164,13 +167,19 @@ class TracksController extends Controller $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'); } From 08b23039ec50f671c12e8fac3ebf52deb8a176cd Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Mon, 23 May 2016 01:53:31 +0300 Subject: [PATCH 08/21] =?UTF-8?q?=D0=92=D1=8B=D0=B2=D0=BE=D0=B4=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=82=D1=80=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=80=D1=82=D0=B5;=20?= =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=81=D1=82=D1=8B=D0=B5=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=20=D0=B8=20=D1=81=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=B0=D1=80=D1=82=D0=B5;=20=D0=9E=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20JS=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D1=81=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0=D0=BC=D0=B8;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/IndexController.php | 6 ++- public/js/map.js | 36 +++--------------- public/js/tracks.js | 67 +++++++++++++++++++++++++++++++++ views/indexTemplate.php | 20 +++++++++- views/tracks/files.php | 2 +- 5 files changed, 95 insertions(+), 36 deletions(-) create mode 100644 public/js/tracks.js diff --git a/controllers/IndexController.php b/controllers/IndexController.php index 7f745cd..1d81ce5 100644 --- a/controllers/IndexController.php +++ b/controllers/IndexController.php @@ -100,6 +100,7 @@ class IndexController extends Controller self::addScript('/js/navigation.js?ver=' . App::getConfig('version')); self::addScript('/js/map.js?ver=' . App::getConfig('version')); self::addScript('/js/fotorama.js'); + self::addScript('/js/tracks.js?ver=' . App::getConfig('version')); // self::addStyle('/css/style.css?ver=' . App::getConfig('version')); self::addStyle('/css/leaflet.css'); @@ -112,12 +113,12 @@ class IndexController extends Controller $category = Category::model()->getAll(array('order' => 'ord ASC')); $categoryArray = Category::model()->getAll(array('order' => 'ord ASC', 'asArray' => true)); - $routes = array(); - $favorites = array(); + $routes = $favorites = $tracks = array(); if (App::$user && App::$user->id) { self::addVar('user', App::$user->id); $routes = Route::model()->getByAuthor(App::$user->id); $favorites = Favorite::model()->getAllMy(); + $tracks = Trips::model()->getAll(array('where' => '`owner` = ?'), array(App::$user->id)); } else { self::addVar('user', '0'); } @@ -165,6 +166,7 @@ class IndexController extends Controller 'user' => App::$user, 'routes' => $routes, 'favorites' => $favorites, + 'tracks' => $tracks, 'og' => $og, )); } diff --git a/public/js/map.js b/public/js/map.js index 6013b02..b3cc75a 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -263,12 +263,13 @@ function loadPointsInBounds() bounds: bounds }, success: function (data) { - for(var i=0; i < data.length; i++) { - if (typeof points[data[i].id] == 'undefined') { - markers.addLayer(constructPoint(data[i])); + if (typeof (data) != 'undefined' && data.length > 0) { + for(var i=0; i < data.length; i++) { + if (typeof points[data[i].id] == 'undefined') { + markers.addLayer(constructPoint(data[i])); + } } } - myMap.addLayer(markers); } }); @@ -576,30 +577,3 @@ function onLocationFound(e) { function onLocationError(e) { alert('Ошибка при определении координат: ' + e.message); } - -function drawTrek(id) -{ - colors = ['red', 'green', 'blue']; - track = new Array(); - $.ajax({ - 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)] - 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); - } - } - - if (typeof (data.wayPoints) != 'undefined') { - for (var i = 0; i < data.wayPoints.length; i++) { - marker = L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}) - marker.bindPopup('' + data.wayPoints[i]['name'] + '
' +data.wayPoints[i]['description']); - marker.addTo(myMap); - } - } - } - }); -} diff --git a/public/js/tracks.js b/public/js/tracks.js new file mode 100644 index 0000000..edaf025 --- /dev/null +++ b/public/js/tracks.js @@ -0,0 +1,67 @@ +var trips = new Object; + +function showTrack(id) +{ + if (typeof (trips[id]) == 'undefined') { + loadTrack(id) + } else { + if (trips[id].status != 'show') { + trips[id].addTo(myMap) + trips[id].status = 'show'; + } + + myMap.fitBounds(trips[id].getBounds()); + return true; + } +} + +function hideTrack(id) +{ + if (typeof (trips[id]) == 'undefined') { + return true; + } else { + if (trips[id].status == 'show') { + myMap.removeLayer(trips[id]); + } + + trips[id].status = 'hide'; + return true; + } +} + +function loadTrack(id) +{ + colors = ['red', 'green', 'blue', 'orange']; + colorIndex = 0; + tracks = new Array(); + markers = new Array(); + $.ajax({ + url: "/json/track/id/" + id, + success: function (data) { + trips[id] = L.featureGroup(); + + if (typeof (data.tracks) != 'undefined') { + for (var i = 0; i < data.tracks.length; i++) { + color = colors[colorIndex]; + colorIndex = (colorIndex == colors.length-1) ? 0 : colorIndex+1; + + tracks[i] = L.polyline(data.tracks[i].latlngs, {color: color, width: 4, opacity: 0.8}); + tracks[i].bindPopup(data.tracks[i].name); + trips[id].addLayer(tracks[i]) + } + } + + if (typeof (data.wayPoints) != 'undefined') { + for (var i = 0; i < data.wayPoints.length; i++) { + markers[i] = L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}) + markers[i].bindPopup('' + data.wayPoints[i]['name'] + '
' + data.wayPoints[i]['description']); + trips[id].addLayer(markers[i]) + } + } + + showTrack(id) + } + }); +} + + diff --git a/views/indexTemplate.php b/views/indexTemplate.php index 77cc0eb..4609000 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -18,8 +18,9 @@ if (App::$user) {
-
-
+
+
+
@@ -103,6 +104,21 @@ if (App::$user) { +
+

Мои треки

+ + Управление +
+
+ + + + + + У вас пока нет сохраненных треков. + +
+
diff --git a/views/tracks/files.php b/views/tracks/files.php index e7da5b3..70e6b6e 100644 --- a/views/tracks/files.php +++ b/views/tracks/files.php @@ -11,7 +11,7 @@ if ($files) { foreach ($files as $file) { - print $file->id . ' — ' . $file->name . ' ('. $file->filename.')
'; + print $file->id . ' — ' . $file->name . ' [' . $file->tracksCount.' . ' . $file->tptCount.' . ' . $file->wptCount . ']
'; } } else { print 'Пока ничего не загружено'; From 86b67601bea81e23ac9a14e9c1b195b1c7b003da Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Tue, 24 May 2016 23:39:04 +0300 Subject: [PATCH 09/21] =?UTF-8?q?ADD=20=D0=BA=D0=B5=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20JSON-=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=B0;=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0,=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/JsonController.php | 15 ++++++++++++++- public/js/map.js | 3 +++ public/js/tracks.js | 9 +++++++++ views/indexTemplate.php | 12 +++++++++--- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/controllers/JsonController.php b/controllers/JsonController.php index d0b9733..205713f 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -591,6 +591,12 @@ class JsonController extends Controller App::error404(); } + if ($trip->json) { + header('Content-Type: application/json'); + print $trip->json; + die; + } + $res = array( 'name' => $trip->name, 'time' => $trip->createdAt, @@ -642,7 +648,14 @@ class JsonController extends Controller $res['tracks'] = $resTracks; - self::renderPartial('json.php', $res); + $json = self::renderPartial('json.php', $res, TRUE); + + $trip->json = $json; + $trip->save(); + + header('Content-Type: application/json'); + print $json; + die; } } diff --git a/public/js/map.js b/public/js/map.js index b3cc75a..ba2c910 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -241,6 +241,9 @@ function initPoints(useBounds) .setContent('Координаты: N°' + getURLParameter('lat').substring(0,8) + ' E°' + getURLParameter('lng').substring(0,8)) .openOn(myMap); } + } else if (getURLParameter('track') != 'null') + { + showTrack(getURLParameter('track')) } } }); diff --git a/public/js/tracks.js b/public/js/tracks.js index edaf025..06b125a 100644 --- a/public/js/tracks.js +++ b/public/js/tracks.js @@ -1,5 +1,14 @@ var trips = new Object; +function showHideTrack(id) +{ + if($('#trackShowHide'+id).prop('checked')) { + showTrack(id) + } else { + hideTrack(id) + } +} + function showTrack(id) { if (typeof (trips[id]) == 'undefined') { diff --git a/views/indexTemplate.php b/views/indexTemplate.php index 4609000..76321da 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -112,9 +112,15 @@ if (App::$user) {
- - - +
+ + name ?> + + + +
+ + У вас пока нет сохраненных треков.
From 03941c811839f61d2c06ba0ca9ef8915b3b29df6 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Wed, 25 May 2016 00:12:01 +0300 Subject: [PATCH 10/21] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D0=BA=D0=BE=D1=81=D0=BC=D0=B5=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/js/tracks.js | 3 +++ views/indexTemplate.php | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/public/js/tracks.js b/public/js/tracks.js index 06b125a..e4afa06 100644 --- a/public/js/tracks.js +++ b/public/js/tracks.js @@ -69,6 +69,9 @@ function loadTrack(id) } showTrack(id) + }, + error: function (data) { + alert('Не удалось загрузить трек. Возможно это приватный трек и вы не его владелец.') } }); } diff --git a/views/indexTemplate.php b/views/indexTemplate.php index 76321da..654b128 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -115,9 +115,11 @@ if (App::$user) { From cd963f2be2f07fc942beeef87dc4a0d40e28e739 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Fri, 27 May 2016 10:06:17 +0300 Subject: [PATCH 11/21] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/JsonController.php | 115 +++++++++++++++++++++++++++++++++ public/js/tracks.js | 40 ++++++++++++ 2 files changed, 155 insertions(+) diff --git a/controllers/JsonController.php b/controllers/JsonController.php index 205713f..7fb47ca 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -658,4 +658,119 @@ class JsonController extends Controller die; } + + static function actionSimpletrack() + { + $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(); + $totCnt = 0; + + + $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, + 'description' => nl2br($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` = ?', 'noKeys' => TRUE), array($track->id)); + if ($trackPoints) { + for ($index = 0; $index < count($trackPoints); $index++) { + + $trackPoint = $trackPoints[$index]; + + if ($index > 2 && $index < count($trackPoints)-2) { + + $nextPoint = $trackPoints[$index+1]; + $nextPoint = array( + 'lat' => $nextPoint->lat, + 'lng' => $nextPoint->lng, + ); + + $distance1 = Geo::distance($prevPoint, array('lat' => $trackPoint->lat, 'lng' => $trackPoint->lng)); + + if ($distance1 < 100) { + continue; + } + + $distance2 = Geo::distance($nextPoint, array('lat' => $trackPoint->lat, 'lng' => $trackPoint->lng)); + $distance3 = Geo::distance($prevPoint, $nextPoint); + + + if (($distance3 / ($distance1+$distance2)) > 0.982) { + continue; + } + } + + $prevPoint = $trackPoints[$index]; + $prevPoint = array( + 'lat' => $prevPoint->lat, + 'lng' => $prevPoint->lng, + ); + + + $resLatlngs[] = array( + 'lat' => $trackPoint->lat, + 'lng' => $trackPoint->lng, + ); + } +// die; + } + + $totCnt += count($resLatlngs); + $resTracks[] = array( + 'name' => (string) $track->name, + 'length' => 0, + 'latlngs' => $resLatlngs, + 'points' => count($resLatlngs), + ); + } + + } + + $res['wayPoints'] = $resWayPoints; + $res['tracks'] = $resTracks; + $res['totCnt'] = $totCnt; + + + $json = self::renderPartial('json.php', $res, TRUE); + + $trip->json = $json; + $trip->save(); + + header('Content-Type: application/json'); + print $json; + die; + } + + } diff --git a/public/js/tracks.js b/public/js/tracks.js index e4afa06..f3dd20d 100644 --- a/public/js/tracks.js +++ b/public/js/tracks.js @@ -41,6 +41,7 @@ function hideTrack(id) function loadTrack(id) { colors = ['red', 'green', 'blue', 'orange']; + colors = ['green']; colorIndex = 0; tracks = new Array(); markers = new Array(); @@ -76,4 +77,43 @@ function loadTrack(id) }); } +function loadSimpleTrack(id) +{ + colors = ['red', 'green', 'blue', 'orange']; + colors = ['red']; + colorIndex = 0; + tracks = new Array(); + markers = new Array(); + $.ajax({ + url: "/json/simpletrack/id/" + id, + success: function (data) { + trips[id] = L.featureGroup(); + + if (typeof (data.tracks) != 'undefined') { + for (var i = 0; i < data.tracks.length; i++) { + color = colors[colorIndex]; + colorIndex = (colorIndex == colors.length-1) ? 0 : colorIndex+1; + + tracks[i] = L.polyline(data.tracks[i].latlngs, {color: color, width: 4, opacity: 0.8}); + tracks[i].bindPopup(data.tracks[i].name); + trips[id].addLayer(tracks[i]) + } + } + + if (typeof (data.wayPoints) != 'undefined') { + for (var i = 0; i < data.wayPoints.length; i++) { + markers[i] = L.marker([data.wayPoints[i]['lat'], data.wayPoints[i]['lng']], {icon: categories.marker, title: data.wayPoints[i]['name']}) + markers[i].bindPopup('' + data.wayPoints[i]['name'] + '
' + data.wayPoints[i]['description']); + trips[id].addLayer(markers[i]) + } + } + + showTrack(id) + }, + error: function (data) { + alert('Не удалось загрузить трек. Возможно это приватный трек и вы не его владелец.') + } + }); +} + From 0dc2ce90ec3334b9af82736b85233db94debc0cf Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Fri, 27 May 2016 20:19:38 +0300 Subject: [PATCH 12/21] =?UTF-8?q?ADD=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D1=81?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=83=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=B0=D0=BF=D0=BB=D0=BE=D0=B0=D0=B4=D0=B0=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B0;=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=D0=BA=D0=B0=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/TracksController.php | 25 ++++++++++++++++++++++++- views/file.php | 20 ++++++++++++++++++++ views/tracks/files.php | 10 +--------- views/tracks/index.php | 20 ++++++++++++++++++-- 4 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 views/file.php diff --git a/controllers/TracksController.php b/controllers/TracksController.php index a464e10..a1939d0 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -60,7 +60,30 @@ class TracksController extends Controller App::error404(); } - App::redirect('/tracks/files'); + 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() diff --git a/views/file.php b/views/file.php new file mode 100644 index 0000000..6a6aad2 --- /dev/null +++ b/views/file.php @@ -0,0 +1,20 @@ + -
- - - -
- -

Ваши файлы с треками

id . ' — ' . $file->name . ' [' . $file->tracksCount.' . ' . $file->tptCount.' . ' . $file->wptCount . ']
'; + print $file->id . ' — ' . $file->name . ' [' . $file->tracksCount.' . ' . $file->tptCount.' . ' . $file->wptCount . ']
'; } } else { print 'Пока ничего не загружено'; diff --git a/views/tracks/index.php b/views/tracks/index.php index 432080b..380ad2c 100644 --- a/views/tracks/index.php +++ b/views/tracks/index.php @@ -1,5 +1,21 @@ -

Ваши треки

-загрузка треков + + + + + +
+

Ваши треки

+
+
+
+ + + +   + +
+
+

Date: Fri, 27 May 2016 21:03:01 +0300 Subject: [PATCH 13/21] =?UTF-8?q?=D0=9D=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=BE=D0=B2=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/indexTemplate.php | 8 +++++--- views/tracks/files.php | 25 +++++++++++++++++++++---- views/tracks/index.php | 19 ++++++++----------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/views/indexTemplate.php b/views/indexTemplate.php index 654b128..9b80ad3 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -105,9 +105,10 @@ if (App::$user) {
-

Мои треки

- - Управление +

+ Мои треки + +


@@ -124,6 +125,7 @@ if (App::$user) { У вас пока нет сохраненных треков. + Загляните в раздел управления треками .
diff --git a/views/tracks/files.php b/views/tracks/files.php index 6033c01..bdb4b63 100644 --- a/views/tracks/files.php +++ b/views/tracks/files.php @@ -1,10 +1,27 @@ -

Ваши файлы с треками

+

Ваши исходные файлы с треками

+← вернуться к трекам +
id . ' — ' . $file->name . ' [' . $file->tracksCount.' . ' . $file->tptCount.' . ' . $file->wptCount . ']
'; - } + foreach ($files as $file): ?> + + id ?> +   + + + +    + + + +   + name ?> + — filename ?> + [tracksCount?> . tptCount ?> . wptCount ?>] +
+ + id; - print ' — '; - print $trip->name; - print ' ('; - print $trip->createdAt; - print ') — '; - print $trip->description; - print '
'; - } + foreach ($trips as $trip): +?> + id ?> — name ?> (createdAt ?>)
+ + Date: Fri, 27 May 2016 23:45:09 +0300 Subject: [PATCH 14/21] =?UTF-8?q?=D0=9D=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D0=BD=D0=B0=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/tracks/index.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/views/tracks/index.php b/views/tracks/index.php index 65db9ba..6414ced 100644 --- a/views/tracks/index.php +++ b/views/tracks/index.php @@ -22,8 +22,11 @@ if ($trips) { foreach ($trips as $trip): ?> - id ?> — name ?> (createdAt ?>)
- + id ?> — name ?> (createdAt ?>) + status == Trips::STATUS_PUBLIC):?> + + +
Date: Sat, 28 May 2016 18:15:21 +0300 Subject: [PATCH 15/21] =?UTF-8?q?ADD=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20KML-=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.=20=D1=83?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Kml.php | 108 ++++++++++++++++++++++++++ controllers/IndexController.php | 72 ------------------ controllers/TracksController.php | 126 ++++++++++++++++++++++++++++--- models/TrackFiles.php | 4 + views/tracks/files.php | 2 +- views/tracks/index.php | 2 +- 6 files changed, 231 insertions(+), 83 deletions(-) create mode 100644 classes/Kml.php diff --git a/classes/Kml.php b/classes/Kml.php new file mode 100644 index 0000000..83e888e --- /dev/null +++ b/classes/Kml.php @@ -0,0 +1,108 @@ +kml = new DOMDocument; + $this->kml->loadXML(file_get_contents($path)); + + foreach ($this->get($this->kml, 'Placemark') as $placemark) { + if ($this->has($placemark, 'Point')) { + $this->waypoints[] = array( + 'name' => trim($this->getValue($placemark, 'name')), + 'description' => trim($this->getValue($placemark, 'description')), + 'when' => date('c', strtotime($this->getValue($placemark, 'when'))), + 'latlng' => $this->getCoords($placemark)[0], + ); + } + + if ($this->has($placemark, 'LineString')) { + $this->tracks[] = array( + 'name' => trim($this->getValue($placemark, 'name')), + 'description' => trim($this->getValue($placemark, 'description')), + 'latlng' => $this->getCoords($placemark), + ); + } + }; + } + + public function getName() + { + return $this->getValue($this->kml, 'name') ? strval($this->getValue($this->kml, 'name')) : 'Track KML'; + } + + public function getDescription() + { + return $this->getValue($this->kml, 'description') ? strval($this->getValue($this->kml, 'description')) : ''; + } + + public function getTime() + { + return $this->getValue($this->kml, 'when') ? date('c', strtotime($this->getValue($this->kml, 'when'))) : date('c'); + } + + public function getWaypoints() + { + return $this->waypoints; + } + public function getTracks() + { + return $this->tracks; + } + + private function has($src, $tagName) + { + return $this->get($src, $tagName)->length > 0; + } + + private function get($src, $tagName) + { + return $src->getElementsByTagName($tagName); + } + + private function getValue($src, $tagName) + { + foreach ($src->getElementsByTagName($tagName) AS $value) + { + return $value->nodeValue; + } + } + + private function getCoords($src) + { + foreach ($src->getElementsByTagName('coordinates') AS $value) + { + $result = array(); + $coords = $value->nodeValue; + $coords = str_replace(array(" ", "\n", "\r", "\t"), ' ', $coords); + + // multi-space + $pr = '(\s{2,})'; + $rep = ' '; + $coords = preg_replace($pr, $rep, $coords); + + $coords = explode(' ', trim($coords)); + + foreach ($coords as $coord) { + $tmp = explode(',', $coord); + $result[] = array( + 'lat' => $tmp[1], + 'lng' => $tmp[0], + 'alt' => $tmp[2], + ); + } + + return $result; + } + + return array(); + } + + +} diff --git a/controllers/IndexController.php b/controllers/IndexController.php index 1d81ce5..6e19e0e 100644 --- a/controllers/IndexController.php +++ b/controllers/IndexController.php @@ -3,78 +3,6 @@ class IndexController extends Controller { - static function actionTest() - { - $gpxObject = simplexml_load_file('/tmp/2.gpx'); -// $gpxObject = simplexml_load_file('/tmp/doc(gpsvisualizer.com).gpx'); -// $gpxObject = simplexml_load_file('/tmp/1100.gpx'); - - $trip = array( - 'name' => isset($gpxObject->metadata->name) ? (string) $gpxObject->metadata->name : 'Track', - 'time' => isset($gpxObject->metadata->time) ? strtotime($gpxObject->metadata->time) : '', - ); - - $wayPoints = array(); - $tracks = array(); - $latlngs = array(); - - foreach ($gpxObject as $key => $block) { - if ($key == 'wpt') { - if (empty($block)) { - continue; - } - - $wayPoints[] = array( - 'lat' => floatval($block['lat']), - 'lng' => floatval($block['lon']), - 'time' => strtotime($block->time), - 'name' => (string) $block->name, - 'desc' => (string) $block->desc, - ); - } - - if ($key == 'trk') { -// print_r($block);die; - if (empty($block->trkseg)) { - continue; - } - - foreach ($block->trkseg as $trkpt) { - if ($trkpt) { - $trackPoints = array(); - $latlngs = array(); - foreach ($trkpt as $tpt) { -// $trackPoints[] = array( -// 'lat' => floatval($tpt['lat']), -// 'lng' => floatval($tpt['lon']), -// 'time' => isset($tpt->time) ? strtotime($tpt->time) : 0, -// 'ele' => isset($tpt->ele) ? floatval($tpt->ele) : 0, -// ); - $latlngs[] = array( - 'lat' => floatval($tpt['lat']), - 'lng' => floatval($tpt['lon']), - ); - } - } - } -// $tracks[] = $trackPoints; - $tracks[] = array( - 'name' => (string)$block->name, - 'length' => 0, - 'latlngs' => $latlngs - ); - } - } - - $trip['tracks'] = $tracks; -// $trip['latlngs'] = $latlngs; - - $trip['wayPoints'] = $wayPoints; - - - self::renderPartial('json.php', $trip); - } - /** * Действие по умолчанию */ diff --git a/controllers/TracksController.php b/controllers/TracksController.php index a1939d0..9db6286 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -44,7 +44,9 @@ class TracksController extends Controller $extension = strtolower($temp['extension']); $uploaddir = App::getBasedir() . 'tracks/'; - if ($extension !== 'gpx') { + $supportedExtensions = array(TrackFiles::FORMAT_GPX, TrackFiles::FORMAT_KML); + + if (!in_array(strtoupper($extension), $supportedExtensions)) { App::error404('Неизвестный тип'); } @@ -52,6 +54,7 @@ class TracksController extends Controller 'owner' => App::$user->id, 'name' => 'Трек ' . date('d-m-Y H:i:s'), 'filename' => $filename, + 'format' => strtoupper($extension), 'createdAt' => date('c'), )); @@ -60,7 +63,7 @@ class TracksController extends Controller App::error404(); } - App::redirect('/tracks/importgpx/id/'.$tmp->id); + App::redirect('/tracks/import/id/' . $tmp->id); } function actionGetFile() @@ -77,16 +80,13 @@ class TracksController extends Controller App::error404(); } - $temp = pathinfo($trackFile->filename); - $extension = strtolower($temp['extension']); - self::renderPartial('file.php', array( - 'filePath' => App::getBasedir(). 'tracks/track' . $id . '.' . $extension, + 'filePath' => App::getBasedir() . 'tracks/track' . $id . '.' . strtolower($trackFile->format), 'fileName' => $trackFile->filename, )); } - function actionImportgpx() + function actionImport() { $id = (int) App::getParam('id'); @@ -100,7 +100,24 @@ class TracksController extends Controller App::error404(); } - $gpxObject = simplexml_load_file(App::getBasedir() . 'tracks/track' . $trackFile->id . '.gpx'); + switch ($trackFile->format) { + case TrackFiles::FORMAT_GPX: + self::importGpx($trackFile); + break; + case TrackFiles::FORMAT_KML: + 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( @@ -202,8 +219,99 @@ class TracksController extends Controller $trackFile->wptCount = $wptCount; $trackFile->distance = $distance; $trackFile->save(); + } - App::redirect('/tracks'); + 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(); } } diff --git a/models/TrackFiles.php b/models/TrackFiles.php index 3cbf8e6..889520b 100644 --- a/models/TrackFiles.php +++ b/models/TrackFiles.php @@ -3,6 +3,10 @@ class TrackFiles extends Model { + const FORMAT_GPX = 'GPX'; + const FORMAT_KML = 'KML'; + const FORMAT_KMZ = 'KMZ'; + function __construct($fromArray = array()) { $this->_tableName_ = 'trackFiles'; diff --git a/views/tracks/files.php b/views/tracks/files.php index bdb4b63..c8a1d5f 100644 --- a/views/tracks/files.php +++ b/views/tracks/files.php @@ -12,7 +12,7 @@ if ($files) {    - +   diff --git a/views/tracks/index.php b/views/tracks/index.php index 6414ced..3bc7512 100644 --- a/views/tracks/index.php +++ b/views/tracks/index.php @@ -7,7 +7,7 @@
- +   From 56c21af49ee7742d054c186de08903b16cfcfc5c Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sat, 28 May 2016 18:22:11 +0300 Subject: [PATCH 16/21] =?UTF-8?q?FIX=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/js/tracks.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/js/tracks.js b/public/js/tracks.js index f3dd20d..10185b7 100644 --- a/public/js/tracks.js +++ b/public/js/tracks.js @@ -40,8 +40,7 @@ function hideTrack(id) function loadTrack(id) { - colors = ['red', 'green', 'blue', 'orange']; - colors = ['green']; + colors = ['#e93333', '#fea22e', '#ff0', '#0f0', '#4267de', '#e42086', '#333']; colorIndex = 0; tracks = new Array(); markers = new Array(); From d23756c16ef2da256cedb63c39be49ae7d380250 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 29 May 2016 00:50:37 +0300 Subject: [PATCH 17/21] =?UTF-8?q?ADD=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20KMZ=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?KM*=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D1=81=20gxMultiTr?= =?UTF-8?q?ack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Kml.php | 73 +++++++++++++++++++++++++++++--- controllers/TracksController.php | 3 +- views/tracks/index.php | 2 +- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/classes/Kml.php b/classes/Kml.php index 83e888e..83171e2 100644 --- a/classes/Kml.php +++ b/classes/Kml.php @@ -9,8 +9,11 @@ class Kml public function __construct($path) { + $xml = substr($path, -4) == '.kmz' ? $this->getKmzContent($path) : file_get_contents($path); + $xml = str_replace(array('kml = new DOMDocument; - $this->kml->loadXML(file_get_contents($path)); + $this->kml->loadXML($xml); foreach ($this->get($this->kml, 'Placemark') as $placemark) { if ($this->has($placemark, 'Point')) { @@ -29,6 +32,10 @@ class Kml 'latlng' => $this->getCoords($placemark), ); } + + if ($this->has($placemark, 'gxMultiTrack')) { + $this->tracks = $this->getTracksGX($placemark); + } }; } @@ -51,6 +58,7 @@ class Kml { return $this->waypoints; } + public function getTracks() { return $this->tracks; @@ -68,16 +76,14 @@ class Kml private function getValue($src, $tagName) { - foreach ($src->getElementsByTagName($tagName) AS $value) - { + foreach ($src->getElementsByTagName($tagName) AS $value) { return $value->nodeValue; } } private function getCoords($src) { - foreach ($src->getElementsByTagName('coordinates') AS $value) - { + foreach ($src->getElementsByTagName('coordinates') AS $value) { $result = array(); $coords = $value->nodeValue; $coords = str_replace(array(" ", "\n", "\r", "\t"), ' ', $coords); @@ -104,5 +110,62 @@ class Kml return array(); } + private function getTracksGX($placemark) + { + $result = array(); + foreach ($placemark->getElementsByTagName('gxTrack') AS $gxTrack) { + $track = array(); + foreach ($gxTrack->getElementsByTagName('gxcoord') AS $value) { + $coords = $value->nodeValue; + $coords = str_replace(array(" ", "\n", "\r", "\t"), ' ', $coords); + + // multi-space + $pr = '(\s{2,})'; + $rep = ' '; + $coords = preg_replace($pr, $rep, $coords); + + $tmp = explode(' ', trim($coords)); + + $track[] = array( + 'lat' => $tmp[1], + 'lng' => $tmp[0], + 'alt' => $tmp[2], + ); + } + + $result[] = array( + 'name' => '', + 'description' => '', + 'latlng' => $track, + ); + } + + return $result; + } + + private function getKmzContent($path) + { + $zip = zip_open($path); + if (!$zip) { + App::error404(); + } + + $zip_entry = zip_read($zip); + + if (zip_entry_name($zip_entry) != 'doc.kml') { + App::error404(); + } + + + if (zip_entry_open($zip, $zip_entry, "r")) { + $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); + zip_entry_close($zip_entry); + zip_close($zip); + + return $buf; + } + + App::error404(); + } } diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 9db6286..08e0171 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -44,7 +44,7 @@ class TracksController extends Controller $extension = strtolower($temp['extension']); $uploaddir = App::getBasedir() . 'tracks/'; - $supportedExtensions = array(TrackFiles::FORMAT_GPX, TrackFiles::FORMAT_KML); + $supportedExtensions = array(TrackFiles::FORMAT_GPX, TrackFiles::FORMAT_KML, TrackFiles::FORMAT_KMZ); if (!in_array(strtoupper($extension), $supportedExtensions)) { App::error404('Неизвестный тип'); @@ -105,6 +105,7 @@ class TracksController extends Controller self::importGpx($trackFile); break; case TrackFiles::FORMAT_KML: + case TrackFiles::FORMAT_KMZ: self::importKml($trackFile); break; default: diff --git a/views/tracks/index.php b/views/tracks/index.php index 3bc7512..bd407cf 100644 --- a/views/tracks/index.php +++ b/views/tracks/index.php @@ -7,7 +7,7 @@
- +   From 77570db7a80f8acb6f7760eafa32563a16ba3f88 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 29 May 2016 10:34:00 +0300 Subject: [PATCH 18/21] =?UTF-8?q?ADD=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B4=D0=BB=D0=B8=D0=BD=D1=8B=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Geo.php | 5 ++++- models/Trips.php | 4 ++++ public/js/map.js | 1 + public/js/tracks.js | 2 +- views/indexTemplate.php | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/classes/Geo.php b/classes/Geo.php index 89b894c..c70e328 100644 --- a/classes/Geo.php +++ b/classes/Geo.php @@ -17,7 +17,10 @@ class Geo $delta_lng = ($lng2 - $lng1); return (6378137 * acos(cos($lat1) * cos($lat2) * cos($lng1 - $lng2) + sin($lat1) * sin($lat2))); -// return round(6378137 * acos(cos($lat1) * cos($lat2) * cos($lng1 - $lng2) + sin($lat1) * sin($lat2))); } + static function formatedDistance($distance) + { + return $distance > 1000 ? round($distance/1000, 2).'km' : round($distance).'m'; + } } diff --git a/models/Trips.php b/models/Trips.php index 97e46a7..d06ff87 100644 --- a/models/Trips.php +++ b/models/Trips.php @@ -18,4 +18,8 @@ class Trips extends Model return new self(); } + function getDistance() + { + return Geo::formatedDistance($this->distance); + } } diff --git a/public/js/map.js b/public/js/map.js index ba2c910..8c1b2bd 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -244,6 +244,7 @@ function initPoints(useBounds) } else if (getURLParameter('track') != 'null') { showTrack(getURLParameter('track')) + $('#trackShowHide' + getURLParameter('track')).prop('checked', true); } } }); diff --git a/public/js/tracks.js b/public/js/tracks.js index 10185b7..0dac8e7 100644 --- a/public/js/tracks.js +++ b/public/js/tracks.js @@ -40,7 +40,7 @@ function hideTrack(id) function loadTrack(id) { - colors = ['#e93333', '#fea22e', '#ff0', '#0f0', '#4267de', '#e42086', '#333']; + colors = ['#ff0000', '#ff8e00', '#ff0', '#0f0', '#003cff', '#ff00ad']; colorIndex = 0; tracks = new Array(); markers = new Array(); diff --git a/views/indexTemplate.php b/views/indexTemplate.php index 9b80ad3..d26ac4c 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -116,6 +116,7 @@ if (App::$user) {
name ?> + getDistance(); ?> status == Trips::STATUS_PUBLIC):?> [клик правой кнопкой -> копировать адрес]"> From 8125659f83e9e4f51abe82042f9c9eadc5a8a960 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 29 May 2016 19:50:08 +0300 Subject: [PATCH 19/21] =?UTF-8?q?ADD=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D1=88=D1=80=D1=83=D1=82=D0=B0=20-=20=D0=BD=D0=B0=D0=B7?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5,=20=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5,=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/EdittrackController.php | 27 ++++++++++++++ controllers/TracksController.php | 24 +++++++++++-- views/tracks/edit.php | 56 +++++++++++++++++++++++++++++ views/tracks/index.php | 6 +++- 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 controllers/EdittrackController.php create mode 100644 views/tracks/edit.php diff --git a/controllers/EdittrackController.php b/controllers/EdittrackController.php new file mode 100644 index 0000000..11ac348 --- /dev/null +++ b/controllers/EdittrackController.php @@ -0,0 +1,27 @@ +id) { + App::redirect('/'); + } + } + + function actionTrip() + { + $id = intval(App::getParam('id')); + $trip = Trips::model()->getByPK($id); + + if (empty($_POST['name']) || $trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + $trip->name = trim($_POST['name']); + $trip->description = trim($_POST['description']); + $trip->status = ($_POST['isPublic'] == 'true') ? Trips::STATUS_PUBLIC : Trips::STATUS_PRIVATE; + $trip->save(); + } +} \ No newline at end of file diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 08e0171..fcf1fd8 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -28,6 +28,26 @@ class TracksController extends Controller )); } + function actionEdit() + { + $id = intval(App::getParam('id')); + + if (!$id) { + App::error404(); + } + + $trip = Trips::model()->getByPK($id); + + if ($trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + self::render('/tracks/edit.php', array( + 'trip' => $trip, + )); + } + + function actionFiles() { $files = TrackFiles::model()->getAll(array('where' => '`owner` = :owner'), array('owner' => App::$user->id)); @@ -126,7 +146,7 @@ class TracksController extends Controller '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, + 'description' => 'Трек создан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename, 'status' => Trips::STATUS_PRIVATE, ) ); @@ -233,7 +253,7 @@ class TracksController extends Controller 'createdAt' => $kml->getTime(), 'owner' => App::$user->id, 'distance' => 0, - 'description' => 'Трек сздан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename, + 'description' => 'Трек создан ' . date('d-m-Y H:i') . ' из файла ' . $trackFile->filename, 'status' => Trips::STATUS_PRIVATE, ) ); diff --git a/views/tracks/edit.php b/views/tracks/edit.php new file mode 100644 index 0000000..4e4b698 --- /dev/null +++ b/views/tracks/edit.php @@ -0,0 +1,56 @@ + + + Выйти из редактора + +

Редактор треков

+ + +
+ + +
+
+ + +
+ + + Удалить трек + +
+ +
+ + + + + + + diff --git a/views/tracks/index.php b/views/tracks/index.php index bd407cf..56194c4 100644 --- a/views/tracks/index.php +++ b/views/tracks/index.php @@ -22,7 +22,11 @@ if ($trips) { foreach ($trips as $trip): ?> - id ?> — name ?> (createdAt ?>) + + + + id ?> — + name ?> (createdAt ?>) status == Trips::STATUS_PUBLIC):?> From c7a52b19d16fe7262621264c25cde4eebd88995f Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Sun, 29 May 2016 21:32:17 +0300 Subject: [PATCH 20/21] =?UTF-8?q?ADD=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=B0=20-=20=D0=B8=D0=BC=D1=8F=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Geo.php | 2 +- controllers/EdittrackController.php | 23 ++++++++++++ controllers/TracksController.php | 1 + models/Tracks.php | 4 +++ views/tracks/edit.php | 56 +++++++++++++++++++++++++++-- 5 files changed, 82 insertions(+), 4 deletions(-) diff --git a/classes/Geo.php b/classes/Geo.php index c70e328..7967b98 100644 --- a/classes/Geo.php +++ b/classes/Geo.php @@ -21,6 +21,6 @@ class Geo static function formatedDistance($distance) { - return $distance > 1000 ? round($distance/1000, 2).'km' : round($distance).'m'; + return $distance > 1000 ? round($distance/1000, 2).'км' : round($distance).'м'; } } diff --git a/controllers/EdittrackController.php b/controllers/EdittrackController.php index 11ac348..1a21b0f 100644 --- a/controllers/EdittrackController.php +++ b/controllers/EdittrackController.php @@ -22,6 +22,29 @@ class EdittrackController extends Controller $trip->name = trim($_POST['name']); $trip->description = trim($_POST['description']); $trip->status = ($_POST['isPublic'] == 'true') ? Trips::STATUS_PUBLIC : Trips::STATUS_PRIVATE; + $trip->json = ''; + $trip->save(); + } + + function actionTrack() + { + $id = intval(App::getParam('id')); + + $track = Tracks::model()->getByPK($id); + if (empty($_POST['name']) || $track->isEmpty()) { + App::error404(); + } + + $trip = Trips::model()->getByPK($track->tripId); + if ($trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + $track->name = trim($_POST['name']); + $track->description = trim($_POST['description']); + $track->save(); + + $trip->json = ''; $trip->save(); } } \ No newline at end of file diff --git a/controllers/TracksController.php b/controllers/TracksController.php index fcf1fd8..96bc0c9 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -44,6 +44,7 @@ class TracksController extends Controller self::render('/tracks/edit.php', array( 'trip' => $trip, + 'tracks' => Tracks::model()->getAll(array('where' => '`tripId` = ' . $trip->id)), )); } diff --git a/models/Tracks.php b/models/Tracks.php index fbbbf2a..05fc827 100644 --- a/models/Tracks.php +++ b/models/Tracks.php @@ -14,4 +14,8 @@ class Tracks extends Model return new self(); } + function distance() + { + return Geo::formatedDistance($this->distance); + } } diff --git a/views/tracks/edit.php b/views/tracks/edit.php index 4e4b698..61b1ccf 100644 --- a/views/tracks/edit.php +++ b/views/tracks/edit.php @@ -2,9 +2,9 @@ Выйти из редактора -

Редактор треков

- -
+ +

Свойства трека

+
@@ -25,8 +25,34 @@ +
+ +

Фрагменты трека

+
+ + +
+
+
distance() ?>
+
+ +
+
+ +
+
+ +
+
+
+ + + + +
+ From 97482ffc15ff682c335c5d540105c7d334ede364 Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Mon, 30 May 2016 00:01:01 +0300 Subject: [PATCH 21/21] =?UTF-8?q?ADD=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=83=D1=82=D0=B5=D0=B2=D1=8B=D1=85=20=D1=82=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/EdittrackController.php | 63 +++++++++++++++++++++++++++++ controllers/JsonController.php | 16 ++++---- controllers/TracksController.php | 1 + models/Trips.php | 2 +- views/indexTemplate.php | 2 +- views/tracks/edit.php | 54 ++++++++++++++++++++++++- 6 files changed, 126 insertions(+), 12 deletions(-) diff --git a/controllers/EdittrackController.php b/controllers/EdittrackController.php index 1a21b0f..145af46 100644 --- a/controllers/EdittrackController.php +++ b/controllers/EdittrackController.php @@ -47,4 +47,67 @@ class EdittrackController extends Controller $trip->json = ''; $trip->save(); } + + function actionDeletetrack() + { + $id = intval(App::getParam('id')); + + $track = Tracks::model()->getByPK($id); + if ($track->isEmpty()) { + App::error404(); + } + + $trip = Trips::model()->getByPK($track->tripId); + if ($trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + $track->delete($id); + + $trip->json = ''; + $trip->save(); + + App::redirect('/tracks/edit/id/'.$trip->id); + } + + function actionWaypoint() + { + $id = intval(App::getParam('id')); + + $waypoint = WayPoints::model()->getByPK($id); + if (empty($_POST['name']) || $waypoint->isEmpty()) { + App::error404(); + } + + $trip = Trips::model()->getByPK($waypoint->tripId); + if ($trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + $waypoint->name = trim($_POST['name']); + $waypoint->description = trim($_POST['description']); + $waypoint->save(); + } + + function actionDeletewaypoint() + { + $id = intval(App::getParam('id')); + + $waypoint = WayPoints::model()->getByPK($id); + if ($waypoint->isEmpty()) { + App::error404(); + } + + $trip = Trips::model()->getByPK($waypoint->tripId); + if ($trip->isEmpty() || $trip->owner != App::$user->id) { + App::error404(); + } + + $waypoint->delete($id); + + $trip->json = ''; + $trip->save(); + + App::redirect('/tracks/edit/id/'.$trip->id); + } } \ No newline at end of file diff --git a/controllers/JsonController.php b/controllers/JsonController.php index 7fb47ca..4519f28 100644 --- a/controllers/JsonController.php +++ b/controllers/JsonController.php @@ -718,17 +718,17 @@ class JsonController extends Controller $distance1 = Geo::distance($prevPoint, array('lat' => $trackPoint->lat, 'lng' => $trackPoint->lng)); - if ($distance1 < 100) { + if ($distance1 < 30) { continue; } - $distance2 = Geo::distance($nextPoint, array('lat' => $trackPoint->lat, 'lng' => $trackPoint->lng)); - $distance3 = Geo::distance($prevPoint, $nextPoint); - - - if (($distance3 / ($distance1+$distance2)) > 0.982) { - continue; - } +// $distance2 = Geo::distance($nextPoint, array('lat' => $trackPoint->lat, 'lng' => $trackPoint->lng)); +// $distance3 = Geo::distance($prevPoint, $nextPoint); +// +// +// if (($distance3 / ($distance1+$distance2)) > 0.982) { +// continue; +// } } $prevPoint = $trackPoints[$index]; diff --git a/controllers/TracksController.php b/controllers/TracksController.php index 96bc0c9..f65b33f 100644 --- a/controllers/TracksController.php +++ b/controllers/TracksController.php @@ -45,6 +45,7 @@ class TracksController extends Controller self::render('/tracks/edit.php', array( 'trip' => $trip, 'tracks' => Tracks::model()->getAll(array('where' => '`tripId` = ' . $trip->id)), + 'waypoints' => WayPoints::model()->getAll(array('where' => '`tripId` = ' . $trip->id)), )); } diff --git a/models/Trips.php b/models/Trips.php index d06ff87..ae2b4ae 100644 --- a/models/Trips.php +++ b/models/Trips.php @@ -18,7 +18,7 @@ class Trips extends Model return new self(); } - function getDistance() + function distance() { return Geo::formatedDistance($this->distance); } diff --git a/views/indexTemplate.php b/views/indexTemplate.php index d26ac4c..09fc774 100644 --- a/views/indexTemplate.php +++ b/views/indexTemplate.php @@ -116,7 +116,7 @@ if (App::$user) {
name ?> - getDistance(); ?> + distance(); ?> status == Trips::STATUS_PUBLIC):?> [клик правой кнопкой -> копировать адрес]"> diff --git a/views/tracks/edit.php b/views/tracks/edit.php index 61b1ccf..d592fc1 100644 --- a/views/tracks/edit.php +++ b/views/tracks/edit.php @@ -29,8 +29,8 @@ -

Фрагменты трека

-
+

Фрагменты трека ()

+ + + + +

Путевые точки ()

+
@@ -103,4 +129,28 @@ } }); } + + function saveChangesWaypoint(id) + { + $('#waypointSavedOK').hide(); + $('#waypointSavedError').hide(); + + $.ajax({ + url: "/edittrack/waypoint/id/" + id, + method: "POST", + data: { + name: $('#waypointName' + id).val(), + description: $('#waypointDescription' + id).val() + }, + success: function (data) { + $('#waypointSavedOK').show(); + setTimeout(function () { + $('#waypointSavedOK').fadeOut(300); + }, 2000); + }, + error: function (data) { + $('#waypointSavedError').show(); + } + }); + }