kopia lustrzana https://github.com/glidernet/ogn-live
Add xcsoar task file parser.
Known Observation Zones are Point and Cylinder, other Zones are treated as Points.pull/17/head
rodzic
41f1bca8a1
commit
b1f862ff46
|
@ -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
200
cunimb.js
|
@ -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 + "'> </span> task: " + this.get('nom');
|
|
||||||
});
|
|
||||||
|
|
||||||
google.maps.event.addListener(flightPath, "mouseout", function() {
|
if (typeof res.tasks[i].wlist != 'undefined') {
|
||||||
document.getElementById("divInfo").innerHTML = " ";
|
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 + '\'> </span> task: ' + this.get('nom');
|
||||||
|
});
|
||||||
|
google.maps.event.addListener(flightPath, 'mouseout', function() {
|
||||||
|
document.getElementById('divInfo').innerHTML = ' ';
|
||||||
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue