From 7860013f60a4663415ea2f16e12116860fb6d2ac Mon Sep 17 00:00:00 2001 From: Krivchikov Dmitry Date: Thu, 2 Jun 2016 13:54:27 +0300 Subject: [PATCH] =?UTF-8?q?ADD=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D1=80=D0=B5=D0=BB=D0=B5=D0=B9=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=D1=85;=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D1=81=D1=87=D1=91?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B4=D0=B8=D1=81=D1=82=D0=B0=D0=BD=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=B5=D0=B3=D0=BE=20=D1=84=D1=80=D0=B0=D0=B3=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/Geo.php | 4 +--- classes/Model.php | 6 +++++- controllers/EdittrackController.php | 26 +------------------------- models/Tracks.php | 29 +++++++++++++++++++++++++++++ models/Trips.php | 19 +++++++++++++++++++ 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/classes/Geo.php b/classes/Geo.php index 6ef7d9a..cb68c95 100644 --- a/classes/Geo.php +++ b/classes/Geo.php @@ -18,11 +18,9 @@ class Geo $distance = (6378137 * acos(cos($lat1) * cos($lat2) * cos($lng1 - $lng2) + sin($lat1) * sin($lat2))); - if (isset($latlng1['alt']) && isset($latlng2['alt']) && $latlng1['alt'] <> $latlng2['alt']) { -// var_dump($distance, abs($latlng1['alt'] - $latlng2['alt'])); + if (isset($latlng1['alt']) && isset($latlng2['alt']) && $latlng1['alt'] > 0 && $latlng1['alt'] <> $latlng2['alt']) { $altDelta = abs($latlng1['alt'] - $latlng2['alt']); $distance = sqrt(pow($distance, 2) + pow($altDelta, 2)); -// var_dump($distance);die; } return $distance; diff --git a/classes/Model.php b/classes/Model.php index 83250b3..c2f53d3 100644 --- a/classes/Model.php +++ b/classes/Model.php @@ -85,6 +85,9 @@ abstract class Model return $model::model()->getOne($targetField, $this->$localField); break; case self::TO_MANY: + if ($order) { + return $model::model()->getAll(array('where' => "`$targetField` = '" . $this->$localField . "'", 'order' => $order)); + } return $model::model()->getAll(array('where' => "`$targetField` = '" . $this->$localField . "'")); break; default: @@ -115,13 +118,14 @@ abstract class Model * @param const $relationType - тип связи (к одному / ко многим). * @return obkect/array */ - public function setRelation($nameOfRelation, $localField, $targetModel, $targetField, $relationType) + public function setRelation($nameOfRelation, $localField, $targetModel, $targetField, $relationType, $order = NULL) { return $this->_relations_[$nameOfRelation] = array( 'localField' => $localField, 'targetModel' => $targetModel, 'targetField' => $targetField, 'relationType' => $relationType, + 'order' => $order, ); } diff --git a/controllers/EdittrackController.php b/controllers/EdittrackController.php index 7718845..f69139d 100644 --- a/controllers/EdittrackController.php +++ b/controllers/EdittrackController.php @@ -224,8 +224,6 @@ class EdittrackController extends Controller if ($trk->id == $track->id) { -// $prevPoint = false; -// $distanceTmp = 0; $trackPoints = TrackPoints::model()->getAll(array('where'=>'`trackId` = ? AND `id` <= ?', 'order' => 'id'), array($trk->id, $trackPoint->id)); foreach ($trackPoints as $tpt) { TrackPoints::model()->add( @@ -239,20 +237,8 @@ class EdittrackController extends Controller ) ); -// 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), -// ); } -// $newTrack->distance = $distanceTmp; -// $newTrack->save(); - $prevPoint = false; - $distanceTmp = 0; $newTrack = Tracks::model()->add( array( 'tripId' => $trip->id, @@ -274,18 +260,7 @@ class EdittrackController extends Controller 'speed' => $tpt->speed, ) ); - -// 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), -// ); } -// $newTrack->distance = $distanceTmp; -// $newTrack->save(); } else { $trackPoints = TrackPoints::model()->getAll(array('where'=>'`trackId` = ?', 'order' => 'id'), array($trk->id)); foreach ($trackPoints as $tpt) { @@ -307,6 +282,7 @@ class EdittrackController extends Controller } $trip->json = ''; + $trip->calculateDist(); $trip->save(); App::redirect('/tracks/edit/id/' . $trip->id); diff --git a/models/Tracks.php b/models/Tracks.php index 05fc827..bd3dfd4 100644 --- a/models/Tracks.php +++ b/models/Tracks.php @@ -7,6 +7,7 @@ class Tracks extends Model { $this->_tableName_ = 'tracks'; parent::__construct($fromArray); + $this->setRelation('points', 'id', 'TrackPoints', 'trackId', self::TO_MANY, '`id` ASC'); } static function model() @@ -18,4 +19,32 @@ class Tracks extends Model { return Geo::formatedDistance($this->distance); } + + /** + * Считает/пересчитывает длину фрагмента трека и сохраняет значение в БД. + */ + function calculateDist() + { + $points = $this->points; + $distance = 0; + $prevPoint = array(); + foreach ($points as $point) { + if ($prevPoint) { + $distance += Geo::distance( + $prevPoint, + array('lat' => floatval($point->lat), 'lng' => floatval($point->lng), 'alt' => floatval($point->alt))); + } + + $prevPoint = array( + 'lat' => floatval($point->lat), + 'lng' => floatval($point->lng), + 'alt' => floatval($point->alt), + ); + } + $this->distance = $distance; + $this->save(); + + return $distance; + } + } diff --git a/models/Trips.php b/models/Trips.php index ae2b4ae..e3882b9 100644 --- a/models/Trips.php +++ b/models/Trips.php @@ -11,6 +11,7 @@ class Trips extends Model { $this->_tableName_ = 'trips'; parent::__construct($fromArray); + $this->setRelation('tracks', 'id', 'Tracks', 'tripId', self::TO_MANY, '`id` ASC'); } static function model() @@ -22,4 +23,22 @@ class Trips extends Model { return Geo::formatedDistance($this->distance); } + + /** + * Считает/пересчитывает длину трека и всех его фрагментов + */ + function calculateDist() + { + $tracks = $this->tracks; + $distance = 0; + + foreach ($tracks as $track) { + $distance += $track->calculateDist(); + } + + $this->distance = $distance; + $this->save(); + + return $distance; + } }