New "Export GPX" button which exports current view as GPX.
This commit is contained in:
parent
f2e7d8bfba
commit
1195938bd2
@ -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
|
||||
|
@ -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
76
export_gpx.php
Normal 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();
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user