1
0

New "Export GPX" button which exports current view as GPX.

This commit is contained in:
Markus Birth 2018-10-08 02:06:51 +02:00
parent f2e7d8bfba
commit 1195938bd2
Signed by: mbirth
GPG Key ID: A9928D7A098C3A9A
5 changed files with 149 additions and 4 deletions

View File

@ -25,6 +25,14 @@ class window.MarkerMgr
@accuracy = accuracy
return data
exportGpx: (dateFrom, dateTo, accuracy) ->
console.log 'MarkerMgr::exportGpx(%o, %o, %o)', dateFrom, dateTo, accuracy
params =
'dateFrom': dateFrom
'dateTo': dateTo
'accuracy': accuracy
window.open 'export_gpx.php?' + $.param(params), '_blank'
getTrackerIds: ->
return Object.keys @markers
@ -68,7 +76,7 @@ class window.MarkerMgr
newDate = new Date()
newDate.setTime marker.epoch * 1000
dateString = newDate.toLocaleString()
accuracyString = "<br/>Accuracy: #{marker.accuracy} m"
headingString = if marker.heading? then "<br/>Heading: #{marker.heading}°" else ''
velocityString = if marker.velocity? then "<br/>Velocity: #{marker.velocity} km/h" else ''
@ -77,9 +85,9 @@ class window.MarkerMgr
locationString = "<br/>Location: <a href=\"#\" onclick=\"showBoundingBox(#{marker.lid});\" title=\"Show location bounding box\">#{marker.display_name}</a>"
else
locationString = "<br/>Location: <span id=\"loc_#{marker.lid}\"><a href=\"#\" onclick=\"geodecodeMarker(#{marker.lid});\" title=\"Get location (geodecode)\">Get location</a></span>"
removeString = "<br/><br/><a href=\"#\" onclick=\"deleteMarker(#{marker.lid});\">Delete marker</a>"
# prepare popup HTML code for marker
popupString = dateString + trackerIDString + accuracyString + headingString + velocityString + locationString + removeString
return popupString
@ -160,7 +168,7 @@ class window.MarkerMgr
outlineWidth: 0.5
.addTo map
@lines_drawn[mapid].push line
removeLinesFrom: (map) ->
console.log 'MarkerMgr::removeLinesFrom(%o)', map
mapid = map.getContainer().id

View File

@ -141,6 +141,11 @@ class window.OwnMap
btn_showhide.state 'hide-markers'
btn_showhide.addTo @mymap
L.easyButton '<strong>gpx</strong>', (btn, map) =>
@exportGpx()
, 'Export GPX'
.addTo @mymap
@buttonPrev = L.easyButton
states: [
onClick: (btn, map) =>
@ -232,6 +237,10 @@ class window.OwnMap
console.log 'OwnMap::resetZoom()'
@mymap.setView @default_centre, @default_zoom
exportGpx: ->
console.log 'OwnMap::exportGpx()'
@markermgr.exportGpx window.dateFrom, window.dateTo, window.accuracy
toggleLiveView: ->
console.log 'OwnMap::toggleLiveView()'
@live_view = !@live_view

76
export_gpx.php Normal file
View File

@ -0,0 +1,76 @@
<?php
//http://owntracks.org/booklet/tech/http/
# Obtain the JSON payload from an OwnTracks app POSTed via HTTP
# and insert into database table.
require_once 'config.inc.php';
require_once 'vendor/autoload.php';
use \OwntracksRecorder\Database\MySql;
use \OwntracksRecorder\Database\SQLite;
use \OwntracksRecorder\RecordType\Location;
use \OwntracksRecorder\Rpc;
$response = array();
if ($_config['sql_type'] == 'mysql') {
/** @var MySql $sql */
$sql = new MySql($_config['sql_db'], $_config['sql_host'], $_config['sql_user'], $_config['sql_pass'], $_config['sql_prefix']);
} elseif ($_config['sql_type'] == 'sqlite') {
/** @var SQLite $sql */
$sql = new SQLite($_config['sql_db']);
} else {
die('Invalid database type: ' . $_config['sql_type']);
}
$rpc = new Rpc($sql);
$markers = $rpc->getMarkers();
#header("Content-type: application/javascript");
$dom = new \DOMDocument('1.0', 'utf-8');
$dom->formatOutput = true;
$gpx = $dom->createElement('gpx');
$gpx->setAttribute('creator', 'php-owntracks-recorder');
$gpx->setAttribute('version', '1.1');
$gpx->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://www.topografix.com/GPX/1/1');
$gpx->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$gpx->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns2', 'http://www.garmin.com/xmlschemas/GpxExtensions/v3');
$gpx->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns3', 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1');
$gpx->setAttribute('xsi:schemaLocation', 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd');
# METADATA
$meta = $dom->createElement('metadata');
$link = $dom->createElement('link');
$link->setAttribute('href', 'github.com');
$link->appendChild($dom->createElement('text', 'php-owntracks-recorder'));
$meta->appendChild($link);
$meta->appendChild($dom->createElement('time', date('c')));
$gpx->appendChild($meta);
# TRACK INFO
$trk = $dom->createElement('trk');
$trk->appendChild($dom->createElement('name', 'Exported Track'));
$trk->appendChild($dom->createElement('type', 'other'));
# TRACK SEGMENT
$trkseg = $dom->createElement('trkseg');
foreach ($markers['markers'] as $tid => $markerList) {
foreach ($markerList as $marker) {
$lo = new Location();
$lo->fillFromDbArray($marker);
$trkpt = $lo->getGpxDom();
$trkpti = $dom->importNode($trkpt->documentElement, true);
$trkseg->appendChild($trkpti);
}
}
$trk->appendChild($trkseg);
$gpx->appendChild($trk);
$dom->appendChild($gpx);
echo $dom->saveXML();

View File

@ -75,6 +75,15 @@ class AbstractRecordType implements \Iterator
return $this->table;
}
public function fillFromDbArray($arr)
{
foreach ($this->fields as $key => $extinfo) {
if (array_key_exists($key, $arr)) {
$this->data[$key] = $arr[$key];
}
}
}
public function fillFromArray($arr)
{
foreach ($this->fields as $key => $extinfo) {

View File

@ -36,4 +36,47 @@ class Location extends AbstractRecordType
'osm_id' => null,
'display_name' => null,
);
public function getGpxDom()
{
$dom = new \DOMDocument('1.0', 'utf-8');
$trkpt = $dom->createElement('trkpt');
$trkpt->setAttribute('lat', $this->data['latitude']);
$trkpt->setAttribute('lon', $this->data['longitude']);
$ext = $dom->createElement('extensions');
$trkpt->appendChild($dom->createElement('time', date('c', intval($this->data['epoch']))));
$ext->appendChild($dom->createElement('epoch', $this->data['epoch']));
$trkpt->appendChild($dom->createElement('ele', $this->data['altitude']));
# GDOP
# <1 - ideal
# 1-2 - excellent
# 2-5 - good
# 5-10 - moderate
# 10-20 - fair (rough estimate of location)
# >20 - poor (should be discarded)
$hdop = intval($this->data['accuracy']) / 5;
$trkpt->appendChild($dom->createElement('hdop', $hdop));
$ext->appendChild($dom->createElement('acc', $this->data['accuracy']));
$vdop = intval($this->data['vertical_accuracy']) / 5;
$trkpt->appendChild($dom->createElement('vdop', $vdop));
$ext->appendChild($dom->createElement('vacc', $this->data['vertical_accuracy']));
if (!is_null($this->data['heading'])) {
$ext->appendChild($dom->createElement('hdg', $this->data['heading']));
}
if ($this->data['velocity'] > 0) {
$ext->appendChild($dom->createElement('spd_mps', intval($this->data['velocity'])));
$ext->appendChild($dom->createElement('spd_kph', intval($this->data['velocity']) * 3.6));
}
$trkpt->appendChild($ext);
$dom->appendChild($trkpt);
return $dom;
}
}