ADD уточнённый рассчёт длины трека; экспорт трека в GPX
This commit is contained in:
parent
4b17d0e630
commit
054c05b7a0
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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):?>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue