ADD уточнённый рассчёт длины трека; экспорт трека в GPX

This commit is contained in:
Krivchikov Dmitry 2016-06-02 12:26:19 +03:00
parent 4b17d0e630
commit 054c05b7a0
5 changed files with 87 additions and 4 deletions

View File

@ -16,7 +16,16 @@ class Geo
$delta_lat = ($lat2 - $lat1); $delta_lat = ($lat2 - $lat1);
$delta_lng = ($lng2 - $lng1); $delta_lng = ($lng2 - $lng1);
return (6378137 * acos(cos($lat1) * cos($lat2) * cos($lng1 - $lng2) + sin($lat1) * sin($lat2))); $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']));
$altDelta = abs($latlng1['alt'] - $latlng2['alt']);
$distance = sqrt(pow($distance, 2) + pow($altDelta, 2));
// var_dump($distance);die;
}
return $distance;
} }
static function formatedDistance($distance) static function formatedDistance($distance)

View File

@ -625,7 +625,7 @@ class JsonController extends Controller
if ($tracks) { if ($tracks) {
foreach ($tracks as $track) { foreach ($tracks as $track) {
$resLatlngs = array(); $resLatlngs = array();
$trackPoints = TrackPoints::model()->getAll(array('where' => '`trackId` = ?'), array($track->id)); $trackPoints = TrackPoints::model()->getAll(array('where' => '`trackId` = ?', 'order'=>'id'), array($track->id));
if ($trackPoints) { if ($trackPoints) {
foreach ($trackPoints as $trackPoint) { foreach ($trackPoints as $trackPoint) {
$resLatlngs[] = array( $resLatlngs[] = array(

View File

@ -108,6 +108,22 @@ class TracksController extends Controller
)); ));
} }
function actionExport()
{
$id = intval(App::getParam('id'));
$trip = Trips::model()->getByPK($id);
if ($trip->isEmpty() || $trip->owner != App::$user->id) {
App::error404();
}
self::renderPartial('/tracks/gpx.php', array(
'trip' => $trip,
'waypoints' => WayPoints::model()->getAll(array('where' => '`tripId` = ?'), array($trip->id)),
'tracks' => Tracks::model()->getAll(array('where' => '`tripId` = ?'), array($trip->id)),
));
}
function actionImport() function actionImport()
{ {
$id = (int) App::getParam('id'); $id = (int) App::getParam('id');
@ -206,25 +222,29 @@ class TracksController extends Controller
foreach ($trkpt as $tpt) { foreach ($trkpt as $tpt) {
$speed = isset($tpt->extensions->geotrackerMeta['s']) ? floatval($tpt->extensions->geotrackerMeta['s']) : 0; $speed = isset($tpt->extensions->geotrackerMeta['s']) ? floatval($tpt->extensions->geotrackerMeta['s']) : 0;
$alt = isset($tpt->ele) ? floatval($tpt->ele) : 0;
$trackPoint = TrackPoints::model()->add( $trackPoint = TrackPoints::model()->add(
array( array(
'trackId' => $track->id, 'trackId' => $track->id,
'lat' => floatval($tpt['lat']), 'lat' => floatval($tpt['lat']),
'lng' => floatval($tpt['lon']), 'lng' => floatval($tpt['lon']),
'alt' => isset($tpt->ele) ? floatval($tpt->ele) : 0, 'alt' => $alt,
'createdAt' => isset($tpt->time) ? $tpt->time : date('c'), 'createdAt' => isset($tpt->time) ? $tpt->time : date('c'),
'speed' => $speed, 'speed' => $speed,
) )
); );
if ($prevPoint) { if ($prevPoint) {
$distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon']))); $distanceTmp += Geo::distance($prevPoint, array('lat' => floatval($tpt['lat']), 'lng' => floatval($tpt['lon']), 'alt' => $alt));
} }
$prevPoint = array( $prevPoint = array(
'lat' => floatval($tpt['lat']), 'lat' => floatval($tpt['lat']),
'lng' => floatval($tpt['lon']), 'lng' => floatval($tpt['lon']),
); );
if (isset($tpt->ele)) {
$prevPoint['alt'] = floatval($tpt->ele);
}
$tptCount++; $tptCount++;
} }

51
views/tracks/gpx.php Normal file
View File

@ -0,0 +1,51 @@
<?php
header('Content-type: text/xml');
header('Content-Disposition: attachment; filename="text.gpx"');
?><?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:geotracker="http://ilyabogdanovich.com/gpx/extensions/geotracker" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" creator="Find your road! https://wikipoints.ru">
<metadata>
<name><?= $trip->name ?></name>
<desc><?= $trip->description ?></desc>
<link href="https://wikipoints.ru" />
<time><?= $trip->createdAt ?></time>
<author>
<name><?= App::$user->nick ?></name>
<link href="https://wikipoints.ru/user/<?= App::$user->id ?>" />
</author>
</metadata>
<?php if ($waypoints): ?>
<?php foreach ($waypoints as $wpt): ?>
<wpt lat="<?= $wpt->lat ?>" lon="<?= $wpt->lng ?>">
<ele><?= $wpt->alt ?></ele>
<time><?= $wpt->createdAt ?></time>
<name><?= $wpt->name ?></name>
<desc><?= $wpt->description ?></desc>
</wpt>
<?php endforeach; ?>
<?php endif; ?>
<?php if ($tracks): ?>
<trk>
<name><?= $trip->name ?></name>
<extensions>
<geotracker:meta>
<length><?= $trip->distance ?></length>
<creationtime><?= $trip->createdAt ?></creationtime>
</geotracker:meta>
</extensions>
<?php foreach ($tracks as $track): ?>
<?php $trackPoints = TrackPoints::model()->getAll(array('where' => '`trackId` = ?', 'order'=>'id'), array($track->id)); ?>
<trkseg>
<?php foreach ($trackPoints as $tpt): ?>
<trkpt lat="<?= $tpt->lat ?>" lon="<?= $tpt->lng ?>">
<ele><?= $tpt->alt ?></ele>
<time><?= $tpt->createdAt ?></time>
<extensions>
<geotracker:meta s="<?= $tpt->speed ?>" />
</extensions>
</trkpt>
<?php endforeach; ?>
</trkseg>
<?php endforeach; ?>
</trk>
<?php endif; ?>
</gpx>

View File

@ -25,6 +25,9 @@ if ($trips) {
<a href="/tracks/edit/id/<?= $trip->id ?>" class="btn btn-default"> <a href="/tracks/edit/id/<?= $trip->id ?>" class="btn btn-default">
<span class="glyphicon glyphicon-pencil" aria-hidden="true" title="Редактировать трек"></span> <span class="glyphicon glyphicon-pencil" aria-hidden="true" title="Редактировать трек"></span>
</a> </a>
<a href="/tracks/export/id/<?= $trip->id ?>" class="btn btn-default">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true" title="Скачать трек в формате GPX"></span>
</a>
<?= $trip->id ?> <?= $trip->id ?>
<a href="/?track=<?= $trip->id ?>"><?= $trip->name ?></a> (<?= $trip->createdAt ?>) <a href="/?track=<?= $trip->id ?>"><?= $trip->name ?></a> (<?= $trip->createdAt ?>)
<?php if($trip->status == Trips::STATUS_PUBLIC):?> <?php if($trip->status == Trips::STATUS_PUBLIC):?>