Add xcsoar task file parser.

Known Observation Zones are Point and Cylinder,
other Zones are treated as Points.
pull/17/head
Fabian P. Schmidt 2015-09-18 21:59:58 +02:00
rodzic 41f1bca8a1
commit b1f862ff46
2 zmienionych plików z 143 dodań i 58 usunięć

Wyświetl plik

@ -2,3 +2,4 @@ cunimb <cunimb@cunimb.net>
dbursem <david@dbursem.nl> dbursem <david@dbursem.nl>
Sebastien Chaumontet <sebastien@chaumontet.net> Sebastien Chaumontet <sebastien@chaumontet.net>
Tobias Bieniek <tobias.bieniek@gmx.de> Tobias Bieniek <tobias.bieniek@gmx.de>
Fabian P. Schmidt <kerel-fs@gmx.de>

200
cunimb.js
Wyświetl plik

@ -48,7 +48,7 @@ var hnew = false;
selrec = ""; selrec = "";
var ftype = ["unknown", "Glider/MotorGlider", "Tow Plane", "Helicopter", "Parachute", "Drop Plane", "Hangglider", "Paraglider", "Plane", "Jet", "UFO", "Balloon", "Airship", "Drone", "unknown", "Static Object" ]; var ftype = ["unknown", "Glider/MotorGlider", "Tow Plane", "Helicopter", "Parachute", "Drop Plane", "Hangglider", "Paraglider", "Plane", "Jet", "UFO", "Balloon", "Airship", "Drone", "unknown", "Static Object" ];
var ftypec = ["_b", "", "_g", "_r", "_b", "_b", "_p", "_p", "_b", "_b", "_b", "_b", "_b", "_b", "_b", "_b"]; var ftypec = ["_b", "", "_g", "_r", "_b", "_b", "_p", "_p", "_b", "_b", "_b", "_b", "_b", "_b", "_b", "_b"];
var taska = []; var taskFeatures = [];
var initialResolution = 2 * Math.PI * 6378137 / 256; // == 156543.0339 var initialResolution = 2 * Math.PI * 6378137 / 256; // == 156543.0339
var originShift = 2 * Math.PI * 6378137 / 2.0; // == 20037508.34 var originShift = 2 * Math.PI * 6378137 / 2.0; // == 20037508.34
var m2ft={"m":1, "i":3.2808}; var m2ft={"m":1, "i":3.2808};
@ -600,8 +600,8 @@ function taskbox() {
} }
} }
var j = -1; var j = -1;
while (taska[++j]) { while (taskFeatures[++j]) {
taska[j].setOptions({ taskFeatures[j].setOptions({
visible: vtas visible: vtas
}); });
} }
@ -1060,65 +1060,149 @@ function taskclic() {
document.getElementById("chfile").click(); document.getElementById("chfile").click();
} }
function task(cont) { function loadtask(cont) {
var res = JSON.parse(cont); var tasks = [];
var tc, tn, ltp; try {
var tp = []; tasks = tasks.concat(parseJSONTasks(cont));
var wl = []; } catch (err) {
var tasks = res.tasks; tasks.push(parseXCSoarTask(cont));
}
for (var i = 0; i < tasks.length; i++) { for (var i = 0; i < tasks.length; i++) {
tn = tasks[i].name || "task" + i; showTask(tasks[i]);
tc = tasks[i].color || "FFFFFF"; filterDevices(tasks[i].wlist);
tp.length = 0; }
if (typeof tasks[i].wlist != 'undefined') { }
wlt = 1;
wl = tasks[i].wlist; function parseJSONTasks(cont) {
for(var ii= 0; ii < wl.length; ii++) { var res = JSON.parse(cont);
wlist.push(wl[ii]);
} var tasks = [];
}
for (var ii = 0; ii < tasks[i].legs.length; ii++) { for (var i = 0; i < res.tasks.length; i++) {
if (typeof tasks[i].legs[ii][1] == 'undefined') { // circle var task = {};
aatCircle = new google.maps.Circle({ task.name = res.tasks[i].name;
strokeColor: '#' + tc, task.color = res.tasks[i].color;
strokeOpacity: 0.5,
strokeWeight: 2, var tp = [];
fillColor: '#' + tc, if (typeof res.tasks[i].legs != 'undefined') {
fillOpacity: 0.1, for (var ii = 0; ii < res.tasks[i].legs.length; ii++) {
map: map, if (typeof res.tasks[i].legs[ii][1] == 'undefined') { // circle
center: ltp, tp[tp.length - 1].type = "circle";
radius: tasks[i].legs[ii][0] tp[tp.length - 1].radius = res.tasks[i].legs[ii][0];
}); } else {
taska.push(aatCircle); tp.push({
} else { lat: res.tasks[i].legs[ii][0],
ltp = new google.maps.LatLng(tasks[i].legs[ii][0], tasks[i].legs[ii][1]); lon: res.tasks[i].legs[ii][1]
tp.push(ltp); });
}
} }
} }
var flightPath = new google.maps.Polyline({ task.turnpoints = tp;
path: tp,
strokeColor: "#" + tc,
strokeOpacity: 1.0,
strokeWeight: 2,
map: map
});
flightPath.set('nom', "" + tn);
taska.push(flightPath);
google.maps.event.addListener(flightPath, "mouseover", function() {
var bcol = this.strokeColor;
document.getElementById("divInfo").innerHTML = "<span style='background-color: " + bcol + "'>&nbsp;&nbsp;&nbsp;</span>&nbsp;task:&nbsp;" + this.get('nom');
});
google.maps.event.addListener(flightPath, "mouseout", function() { if (typeof res.tasks[i].wlist != 'undefined') {
document.getElementById("divInfo").innerHTML = "&nbsp;"; task.wlist = [];
}); for (var ii = 0; ii < res.tasks[i].wlist.length; ii++) {
task.wlist.push(res.tasks[i].wlist[ii]);
}
}
tasks.push(task);
} }
if (wlt == 1) { return tasks;
reseton(); }
resetoff();
}
document.getElementById("dtaskbox").innerHTML = "<INPUT type=\"checkbox\" id=\"taskbox\" onChange=\"javascript : taskbox();\" checked>";
function parseXCSoarTask(cont) {
var ltp;
var tp = [];
var wl = [];
tp.length = 0;
var oParser = new DOMParser();
var oDOM = oParser.parseFromString(cont, "text/xml");
var points = oDOM.getElementsByTagName("Point");
for (var i = 0; i < points.length; i++) {
var loc = points[i].getElementsByTagName("Waypoint")[0].getElementsByTagName("Location")[0];
var ltp = {
lat: loc.getAttribute("latitude"),
lon: loc.getAttribute("longitude")
};
if (points[i].getElementsByTagName("ObservationZone")[0].getAttribute("type") == "Cylinder") {
ltp.type = "circle";
ltp.radius = parseFloat(points[i].getElementsByTagName("ObservationZone")[0].getAttribute("radius"));
}
tp.push(ltp);
}
var task = {
turnpoints: tp
};
return task;
}
function showTask(task) {
var tc, tn, ltp;
var tp = [];
tn = task.name || 'task ' + taskFeatures.length;
tc = task.color || 'FF0000';
for (var ii = 0; ii < task.turnpoints.length; ii++) {
if ((task.turnpoints[ii].type == 'circle')) {
point = new google.maps.LatLng(task.turnpoints[ii].lat, task.turnpoints[ii].lon);
tp.push(point);
aatCircle = new google.maps.Circle({
strokeColor: '#' + tc,
strokeOpacity: 0.5,
strokeWeight: 2,
fillColor: '#' + tc,
fillOpacity: 0.1,
map: map,
center: point,
radius: task.turnpoints[ii].radius
});
taskFeatures.push(aatCircle);
} else { // Point
point = new google.maps.LatLng(task.turnpoints[ii].lat, task.turnpoints[ii].lon);
tp.push(point);
}
}
var flightPath = new google.maps.Polyline({
path: tp,
strokeColor: '#' + tc,
strokeOpacity: 1,
strokeWeight: 2,
map: map
});
flightPath.set('nom', '' + tn);
taskFeatures.push(flightPath);
google.maps.event.addListener(flightPath, 'mouseover', function() {
var bcol = this.strokeColor;
document.getElementById('divInfo').innerHTML = '<span style=\'background-color: ' + bcol + '\'>&nbsp;&nbsp;&nbsp;</span>&nbsp;task:&nbsp;' + this.get('nom');
});
google.maps.event.addListener(flightPath, 'mouseout', function() {
document.getElementById('divInfo').innerHTML = '&nbsp;';
});
document.getElementById('dtaskbox').innerHTML = '<INPUT type="checkbox" id="taskbox" onChange="javascript : taskbox();" checked>';
}
function filterDevices(wl) {
if (typeof wl != 'undefined') {
for (var i = 0; i < wl.length; i++) {
wlist.push(wl[i]);
}
}
if (wlist.length > 0) {
wlt = 1;
reseton();
resetoff();
}
} }
function rtask() { // select a task file function rtask() { // select a task file
@ -1133,7 +1217,7 @@ function rtask() { // select a task file
if (evt.target.readyState == FileReader.DONE) { if (evt.target.readyState == FileReader.DONE) {
var cont = evt.target.result; var cont = evt.target.result;
cont = cont.trim(); cont = cont.trim();
task(cont); loadtask(cont);
} }
}; };
reader.readAsText(file); reader.readAsText(file);
@ -1449,7 +1533,7 @@ function initialize() {
if (xhr.readyState === 4) { if (xhr.readyState === 4) {
var status = xhr.status; var status = xhr.status;
if ((status >= 200 && status < 300) || status === 304) { if ((status >= 200 && status < 300) || status === 304) {
task(xhr.responseText); loadtask(xhr.responseText);
} else { } else {
alert("Task Request unsuccessful" + status); alert("Task Request unsuccessful" + status);
} }