/* ____ _____ _ _ _ _ _ _ _ / __ \ / ____| (_) | | | \ | | | | | | | | | |_ __ ___ _ __ | | __| |_ __| | ___ _ __ | \| | ___| |___ _____ _ __| | __ | | | | '_ \ / _ \ '_ \ | | |_ | | |/ _` |/ _ \ '__| | . ` |/ _ \ __\ \ /\ / / _ \| '__| |/ / | |__| | |_) | __/ | | | | |__| | | | (_| | __/ | | |\ | __/ |_ \ V V / (_) | | | < \____/| .__/ \___|_| |_| \_____|_|_|\__,_|\___|_| |_| \_|\___|\__| \_/\_/ \___/|_| |_|\_\ | | |_| */ // Extend Number object with methods to convert between degrees & radians Number.prototype.toRadians = function() { return this * Math.PI / 180; }; Number.prototype.toDegrees = function() { return this * 180 / Math.PI; }; var map; var map_id = 0; var autoc = ""; var acaff = ""; var cton = false; //var tcolor = ["000000", "FF0000", "00FF00", "0000FF", "FFFF00", "00FFFF", "FF00FF", "C0C0C0", "FFFFFF"]; var tcolor = ["000000","FF0000","00B000","0000FF","808000","008080","FF00FF","606060","505028","500000","800080","FF8040","80B000","4040FF","804000","000080"]; var ccolor = 0; var aflist = true; var vallpolon = true; var vallpoloff = true; var vallmaron = true; var vallmaroff = true; var lside = 0; // 0=right 1=left var online = []; // ([cn,alt*1,cn+"_"+ps,colcn,afdif]); var offline = []; // ([cn,alt*1,cn+"_"+ps,colcn,afdif]); var receivers = []; var all = 0; var stick = 0; var barogram = 0; var pathl = 30; // path length 5' (30points) var polwidth = 2; // polyline width (path) var polwidth2 = 4; // polyline width mouseover var lastpol; // last polyline name display in divInfo var lastpolon; // last polyline highlighted var unit = "m"; // metric units var onoff = 1; // 1: online, 2: offline, 3: Menu var onoffaff = "OnLine"; var triasc = 1; // 1: asc 2: desc var tricol = 0; // 0:tri sur cn 1: tri sur alti var ett1 = "
      
"; var w = 0; // watchdog variable var tmgm, tmwd; var nbreq = 0; // nb request launch var wlt = 0; // tasks white list var wlist = []; var vasp = false; var vrec = false; var vrecl = false; var vstm = false; var vapt = false; var vwin = false; var vpre = false; var vtem = false; var vrai = false; var hnew = false; selrec = ""; 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", "_k", "_b", "_b"]; var initialResolution = 2 * Math.PI * 6378137 / 256; // == 156543.0339 var originShift = 2 * Math.PI * 6378137 / 2.0; // == 20037508.34 var m2ft={"m":1, "i":3.2808}; var am2ft={"m":"m", "i":"ft"}; var kh2kt={"m":1, "i":0.53996}; var akh2kt={"m":"km/h", "i":"kt"}; var m2kt={"m":1, "i":1.94384}; var am2kt={"m":"m/s", "i":"kt"}; var unitlist = {"m":"metric", "i":"nautical"} var hashc="",hashz="",hashm="",hasho="",hashb="",hashs="",hashl="",hasht="",hl=" ",hashw="",hashu="",hashp="",hashn="",hashy="",hasha="", hashg=""; // center zoom maptype offline bound autoset2ma layers tasks warning units pathlength nolist devtype altitudestick barogram // close popup function cp() { clearTimeout(tmop); var d = document.getElementById('popup'); d.style.display = 'none'; } // open popup function op(maxw) { var d = document.getElementById('popup'); d.style.display = 'block'; d.style.width = maxw + 'px'; d.style.height = maxw + 'px'; tmop = setTimeout(cp, 15000); } function chunit() { // change units if (document.getElementById('uni').checked === true) { // units imperial unit = 'i'; hashu = "&u=i"; } else { // units metric unit = 'm'; hashu = ""; } scaleLineControl.setUnits(unitlist[unit]); rehash(); } function chstick() { // change altitude stick if (document.getElementById('stick').checked === true) { // stick visible stick = 1; hasha = "&a=1"; sticksLayer.setVisible(true); } else { // no altitude stick stick = 0; hasha = ""; sticksLayer.setVisible(false); } rehash(); } function chbaro() { // change barogram if (document.getElementById('baro').checked === true) { // barogram visible document.getElementById('dbaro').style.display = "block"; document.getElementById('dbaro').style.visibility = "visible"; barogram = 1; hashg = "&g=1"; } else { // no barogram document.getElementById('dbaro').style.display = "none"; barogram = 0; hashg = ""; } rehash(); } function chpl() { // change path length var prevPathl = pathl; if (document.getElementById('rp1').checked === true) { // 5 minutes pathl = 30; hashp = ""; } else if (document.getElementById('rp2').checked === true) { // 10 minutes pathl = 60; hashp = "&p=2"; } else { // all points pathl = 99999; hashp = "&p=3"; } // only delete paths if new path is smaller if (pathl < prevPathl) { delpon(); delpoff(); } baro_reSize(); rehash(); } function chmap(mid) { // change map OSMLayer.setVisible(false); MapsForFreeLayer.setVisible(false); MapsForFreeLayerW.setVisible(false); OSMTopoLayer.setVisible(false); IGNSatelliteLayer.setVisible(false); l4UMapsLayer.setVisible(false); StamenTerrainLayer.setVisible(false); switch(mid) { case 1: OSMTopoLayer.setVisible(true); break; case 2: MapsForFreeLayer.setVisible(true); MapsForFreeLayerW.setVisible(true); break; case 3: IGNSatelliteLayer.setVisible(true); break; case 4: l4UMapsLayer.setVisible(true); break; case 5: StamenTerrainLayer.setVisible(true); break; default: mid = 0; OSMLayer.setVisible(true); } hashm = "&m=" + mid; rehash(); } function devtype() { // devices types selected var dt = 0; if (document.getElementById('ICAObox').checked) { dt += 1; } if (document.getElementById('Flarmbox').checked) { dt += 2; } if (document.getElementById('OGNbox').checked) { dt += 4; } if (dt == 7) hashy = ""; // all devices else hashy = "&y=" + dt; reseton(); resetoff(); rehash(); } function onofff() { switch (onoff) { case 1: if (all == 1) { onoffaff = "OffLine"; onoff = 2; } else { onoffaff = "Menu"; onoff = 3; document.getElementById("ett2").style.display = "none"; document.getElementById("dtlist").style.display = "none"; document.getElementById("menu").style.display = "block"; } break; case 2: onoffaff = "Menu"; onoff = 3; document.getElementById("ett2").style.display = "none"; document.getElementById("dtlist").style.display = "none"; document.getElementById("menu").style.display = "block"; break; case 3: onoffaff = "OnLine"; onoff = 1; document.getElementById("ett2").style.display = "block"; document.getElementById("dtlist").style.display = "block"; document.getElementById("menu").style.display = "none"; break; } afftab(); } function delpon() { // delete all online path var j = -1; while (online[++j]) { // * window["P_" + online[j][2]].getPath().clear(); window["P_" + online[j][2]].getGeometry().setCoordinates([]); window["M_" + online[j][2]].set('tra', 0); window["B_" + online[j][2]] =[]; } } function delpoff() { // delete all offline path var j = -1; while (offline[++j]) { // * window["P_" + offline[j][2]].getPath().clear(); window["P_" + offline[j][2]].getGeometry().setCoordinates([]); window["M_" + offline[j][2]].set('tra', 0); window["B_" + offline[j][2]] =[]; } } function deletepath(pol) { // * window[pol].getPath().clear(); window[pol].getGeometry().setCoordinates([]); window["M_" + pol.substring(2)].set('tra', 0); window["B_" + pol.substring(2)] =[]; } function deleteallpath() { if (onoff == 1) { delpon(); } else { delpoff(); } } function allpath() { var j = -1; if (onoff == 1) { if (vallpolon === true) vallpolon = false; else vallpolon = true; while (online[++j]) { setvisipol(vallpolon, "P_" + online[j][2]); } } else { if (vallpoloff === true) vallpoloff = false; else vallpoloff = true; while (offline[++j]) { setvisipol(vallpoloff, "P_" + offline[j][2]); } } afftab(); } function allmarker() { var j = -1; var opa = true; if (onoff == 1) { if (vallmaron === true) { vallmaron = false; opa = false; } else vallmaron = true; while (online[++j]) { setvisimar(opa, "M_" + online[j][2]); setvisipol(opa, "S_" + online[j][2]); } } else { if (vallmaroff === true) { vallmaroff = false; opa = false; } else vallmaroff = true; while (offline[++j]) { setvisimar(opa, "M_" + offline[j][2]); setvisipol(opa, "S_" + offline[j][2]); } } //map.render(); afftab(); } function tricn() { if (tricol == 1) triasc = 1; else if (triasc == 1) triasc = 2; else triasc = 1; tricol = 0; afftab(); } function trialti() { if (tricol === 0) triasc = 1; else if (triasc == 1) triasc = 2; else triasc = 1; tricol = 1; afftab(); } function highlight(poly,wid) { var p = poly.substring(2); var colactive = window["M_" + p].get('icol'); var ncol = tcolor[colactive]; var visib = window[poly].get('visi'); window[poly].setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: [parseInt(ncol.substring(0,2), 16), parseInt(ncol.substring(2,4), 16), parseInt(ncol.substring(4), 16), visib ], // version avec canal alpha pour cacher/afficher width: wid }) })); } function focuson(poly) { focusoff(lastpolon); if (document.getElementById(poly) !== null) document.getElementById(poly).className = 'yel'; highlight(poly,polwidth2); lastpolon = poly; } function focusoff(poly) { if (document.getElementById(poly) !== null) document.getElementById(poly).className = 'whi'; if (document.getElementById(poly) !== null) document.getElementById(poly).className = 'whi'; if ( typeof(window[poly]) != 'undefined' ) { highlight(poly,polwidth); } } function asp() { if (document.getElementById('aspbox').checked) { vasp = true; airspaceoverlay.setVisible(true); rempl(4, "z"); } else { vasp = false; airspaceoverlay.setVisible(false); rempl(4, " "); } rehash(); } function apt() { if (document.getElementById('aptbox').checked) { vapt = true; airportoverlay.setVisible(true); rempl(5, "a"); } else { vapt = false; airportoverlay.setVisible(false); rempl(5, " "); } rehash(); } function wind() { if (document.getElementById('winbox').checked) { vwin = true; windoverlay.setVisible(true); if (map.getView().getZoom() > 7 ) map.getView().setZoom(7); rempl(2, "v"); } else { vwin = false; windoverlay.setVisible(false); rempl(2, " "); } rehash(); } function pres() { if (document.getElementById('prebox').checked) { vpre = true; presoverlay.setVisible(true); if (map.getView().getZoom() > 7 ) map.getView().setZoom(7); rempl(3, "p"); } else { vpre = false; presoverlay.setVisible(false); rempl(3, " "); } rehash(); } function tempe() { if (document.getElementById('tembox').checked) { vtem = true; tempoverlay.setVisible(true); if (map.getView().getZoom() > 7 ) map.getView().setZoom(7); rempl(1, "t"); } else { vtem = false; tempoverlay.setVisible(false); rempl(1, " "); } rehash(); } function rain() { if (document.getElementById('raibox').checked) { vrai = true; rainoverlay.setVisible(true); if (map.getView().getZoom() > 7 ) map.getView().setZoom(7); rempl(7, "n"); } else { vrai = false; rainoverlay.setVisible(false); rempl(7, " "); } rehash(); } function hidenew() { if (document.getElementById('hnewbox').checked) hnew = true; else hnew = false; } function reseton() { // delete all online markers and their path var j = -1; while (online[++j]) { iconLayerSource.removeFeature(window["M_" + online[j][2]]); delete window["M_" + online[j][2]]; sticksLayerSource.removeFeature(window["S_" + online[j][2]]); delete window["S_" + online[j][2]]; traceLayerSource.removeFeature(window["P_" + online[j][2]]); delete window["P_" + online[j][2]]; delete window["B_" + online[j][2]]; } map.render(); } function resetoff() { // delete all offline markers and their path var j = -1; while (offline[++j]) { iconLayerSource.removeFeature(window["M_" + offline[j][2]]); delete window["M_" + offline[j][2]]; sticksLayerSource.removeFeature(window["S_" + offline[j][2]]); delete window["S_" + offline[j][2]]; traceLayerSource.removeFeature(window["P_" + offline[j][2]]); delete window["P_" + offline[j][2]]; delete window["B_" + offline[j][2]]; } map.render(); } function lineoff() { if (document.getElementById('offl').checked) { all = 0; resetoff(); hasho = ""; } else { all = 1; hasho = "&o=1"; } rehash(); } function bounds() { if (document.getElementById('boundsbox').checked) { bound = true; if (document.getElementById('astmbox').checked) { vstm = false; hashs = ""; document.getElementById('astmbox').checked = false; } amax = parseFloat(document.getElementById('latmax').value); amin = parseFloat(document.getElementById('latmin').value); if (amin > amax) { var tmp = amax; amax = amin; amin = tmp; } omax = parseFloat(document.getElementById('lonmax').value); omin = parseFloat(document.getElementById('lonmin').value); if (omin > omax) { var tmp = omax; omax = omin; omin = tmp; } if (amax > 85) amax = 85; if (amin < -85) amin = -85; if (omax > 180) omax = 180; if (omin < -180) omin = -180; boundc = "&b=" + amax + "&c=" + amin + "&d=" + omax + "&e=" + omin; document.getElementById('latmax').value = amax; document.getElementById('latmin').value = amin; document.getElementById('lonmax').value = omax; document.getElementById('lonmin').value = omin; reseton(); resetoff(); hashb = "&b=" + amax.toFixed(4) + "," + amin.toFixed(4) + "," + omax.toFixed(4) + "," + omin.toFixed(4); } else { bound = false; if (vstm === false) boundc = ""; hashb = ""; } rehash(); } function afftab() { var j = -1; var dlistd = ""; var mar = ""; var pol = ""; var affcpt = ""; switch (onoff) { case 1: online.sort(ASC); if (triasc == 2) online.reverse(); while (online[++j]) { mar = "M_" + online[j][2]; pol = "P_" + online[j][2]; stk = "S_" + online[j][2]; dlistd += "" + "" + "" + "" + "" + ""; } affcpt = " (" + online.length + ")"; break; case 2: offline.sort(ASC); if (triasc == 2) offline.reverse(); while (offline[++j]) { mar = "M_" + offline[j][2]; pol = "P_" + offline[j][2]; stk = "S_" + offline[j][2]; dlistd += ""; } affcpt = " (" + offline.length + ")"; break; case 3: affcpt = "         "; break; } dlistd += "
" + online[j][0] + "  "; if (unit == "i") { dlistd += (online[j][1] * m2ft[unit]).toFixed(); } // { var tv=online[j][1]*m2ft[unit]; dlistd+= tv.toFixed(); } else dlistd += online[j][1] + "m"; dlistd += "
" + offline[j][0] + "  "; // dlistd += "
" + offline[j][0] + "  "; if (unit == "i") { dlistd += (offline[j][1] * m2ft[unit]).toFixed(); } else dlistd += offline[j][1] + "m"; dlistd += "
"; document.getElementById("dtlist").innerHTML = dlistd; if (aflist === true) document.getElementById("onoff").innerHTML = "" + onoffaff + "" + affcpt; } function ASC(a, b) { a = a[tricol]; b = b[tricol]; if (a > b) return 1; if (a < b) return -1; return 0; } function alist() { if (aflist === true) { document.getElementById("ett1").innerHTML = "
"; document.getElementById('dlist').style.width = "20px"; document.getElementById('dlist').style.height = "20px"; if (lside == 1) document.getElementById('ac').style.left = "0px"; else document.getElementById('ac').style.right = "0px"; centeroff(); document.getElementById('dbaro').style.display = "none"; aflist = false; hashn = "&n=0"; } else { document.getElementById("ett1").innerHTML = ett1; document.getElementById('dlist').style.width = "180px"; document.getElementById('dlist').style.height = "90%"; if (lside == 1) document.getElementById('ac').style.left = "180px"; else document.getElementById('ac').style.right = "180px"; if (document.getElementById('baro').checked) document.getElementById('dbaro').style.display = "block"; aflist = true; afftab(); hashn = ""; } rehash(); } function sideclick() { // change list position (left<->right) if (lside === 0) { document.getElementById('dlist').className = "lleft"; document.getElementById('dbaro').className = "baroright"; document.getElementById('ac').className = "acleft"; document.getElementById('ac').style.right = ""; lside = 1; } else { document.getElementById('dlist').className = "lright"; document.getElementById('dbaro').className = "baroleft"; document.getElementById('ac').className = "acright"; document.getElementById('ac').style.left = ""; lside = 0; } } function autocenter(mark) { // ### document.getElementById("divInfoac").innerHTML = "AC: " + window[mark].get('title'); autoc = mark; // ### document.getElementById("divInfoac").style.display = "block"; map.getView().setCenter(ol.proj.fromLonLat([window[mark].get('lon'), window[mark].get('lat')])); } function centeron(mark) { cton = true; map.getView().setCenter(ol.proj.fromLonLat([window[mark].get('lon'), window[mark].get('lat')])); } function centeroff() { if (autoc !== "") { map.getView().setCenter(ol.proj.fromLonLat([window[autoc].get('lon'), window[autoc].get('lat')], 'EPSG:4326', 'EPSG:3857')); } cton = false; } function setvisimar(chk, mar) { var vis = ((chk === true)?1:0); window[mar].getStyle().getImage().setOpacity(vis); window[mar].changed(); window[mar].set('visi', vis); } function setvisistk(chk, stk) { setvisipol(chk, stk); } function setvisipol(chk, pol) { var vis = ((chk === true)?1:0); var hcol = window[pol].get('col'); window[pol].setStyle( new ol.style.Style({ stroke: new ol.style.Stroke({ color: [parseInt(hcol.substring(0,2), 16), parseInt(hcol.substring(2,4), 16), parseInt(hcol.substring(4), 16), vis], width: polwidth }) }) ); window[pol].changed(); window[pol].set('visi', vis); } function isvisib(pol) { if (window[pol].get('visi') == 1) return "checked"; else return ""; } function dec2dms(dec) { dec = Math.abs(dec); var decd = Math.floor(dec); var decm = Math.floor((dec - decd) * 60); var decs = Math.floor((dec - decd - (decm / 60)) * 3600); return "" + decd + "° " + decm + "' " + decs + "\""; } function changecolor(mark) { var colactive = window[mark].get('icol'); if (++colactive == tcolor.length) colactive = 0; var ncol = tcolor[colactive]; var visib = window[window[mark].get('poly')].get('visi'); window[window[mark].get('poly')].setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ //color: '#' + hcol, // version courte initiale color: [parseInt(ncol.substring(0,2), 16), parseInt(ncol.substring(2,4), 16), parseInt(ncol.substring(4), 16), visib ], // version avec canal alpha pour cacher/afficher width: polwidth }) })); window[mark].set('icol', "" + colactive); window[window[mark].get('poly')].set('col', "" + ncol); return "#" + ncol; } function redraw(pol) { var p = pol.substring(2); var mrk = window["M_" + p]; var fi = mrk.get('fid'); var lo = mrk.get('lon'); mrk.set('tra', 1); downloadUrl(tld + '/' + cxml1 + '?id=' + p + "&l=" + lo, function(data) { var vtrace = data.documentElement.getElementsByTagName("m"); var err = parseFloat(vtrace[0].getAttribute("e")); var idd = vtrace[0].getAttribute("i"); var encodedt = vtrace[0].getAttribute("r"); if (err === 0 && encodedt.length > 2) { var format = new ol.format.Polyline({ //factor: 1e6 }); var line = format.readGeometry(encodedt, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:900913' }); window['P_' + idd].getGeometry().setCoordinates([]); window['P_' + idd].setGeometry(line); } }); } function taskbox() { var vtas = false; if (document.getElementById('taskbox').checked) { vtas = true; if (wlt == 2) { --wlt; reseton(); resetoff(); } } else { if (wlt == 1) { ++wlt; reseton(); resetoff(); } } taskLayer.setVisible(vtas); } function reclbox() { if (document.getElementById('reclbox').checked) { vrecl = true; rempl(6, "r"); } else { vrecl = false; rempl(6, " "); } receiverLayer.setVisible(vrecl); rehash(); } function checkrec() { downloadUrl(tld + '/' + rxml, function(data) { var vlrec = data.documentElement.getElementsByTagName("m"); var err = parseFloat(vlrec[0].getAttribute("e")); if (err === 0 && vlrec.length > 1) { selrec = ""; // effacer markers var j = -1; while (receivers[++j]) { receiverLayerSource.removeFeature(window["R_" + receivers[j][0]]); delete window["R_" + receivers[j][0]]; } receivers.length = 0; for (var i = 1; i < vlrec.length; i++) { var re = vlrec[i].getAttribute("a"); var rlat = parseFloat(vlrec[i].getAttribute("b")); var rlon = parseFloat(vlrec[i].getAttribute("c")); var ract = parseInt(vlrec[i].getAttribute("d")); var rind = 2000 * ract; selrec += ""; receivers.push([re, rlat, rlon]); // lat et lon stockées mais jamais utilisées ? window["R_" + re] = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.fromLonLat([rlon,rlat])), lat: rlat, lon: rlon, mark: "R", info: re }); window["R_" + re].setStyle(new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], opacity: 1, src: "" + tld + "/pict/rec" + ract + ".png", }) })); receiverLayerSource.addFeature(window["R_" + re]); } setTimeout(checkrec, 120000); } else { selrec = ""; setTimeout(checkrec, 20000); } reclbox(); }); } function receiv() { if (document.getElementById('recbox').checked) { vrec = true; } else { vrec = false; } } function affinfodata(mark) { var mrk = window[mark]; var vz = mrk.get('vz') * m2kt[unit]; var vx = mrk.get('speed') * kh2kt[unit]; var al = mrk.get('alt') * m2ft[unit]; document.getElementById("aclt").innerHTML = mrk.get('tim'); document.getElementById("acla").innerHTML = mrk.get('lat'); document.getElementById("aclo").innerHTML = mrk.get('lon'); document.getElementById("acal").innerHTML = al.toFixed() + " " + am2ft[unit]; document.getElementById("acsp").innerHTML = vx.toFixed() + " " + akh2kt[unit]; document.getElementById("actr").innerHTML = mrk.get('track'); document.getElementById("acvz").innerHTML = ((vz >= 0) ? "+" : "–") + Math.abs(vz).toFixed(1) + " " + am2kt[unit]; var re = mrk.get('rec'); var red = "" + re + ""; if (typeof(window["R_" + re]) != 'undefined') { var mre = window["R_" + re]; var di = dist(mrk.get('lat'), mrk.get('lon'), mre.get('lat'), mre.get('lon')); red += " (" + di.toFixed() + " Km)"; } else { red += " (?)"; } document.getElementById("acrx").innerHTML = red; } function affinfodata2(mark) { var mrk = window[mark]; document.getElementById("acmo").innerHTML = mrk.get('model'); } function affinfo(mark) { affinfodata(mark); var mrk = window[mark]; var rg = mrk.get('reg'); var fi = mrk.get('fid'); var vd = "block"; if (fi == rg) vd = "none"; document.getElementById("ac1").style.display = vd; document.getElementById("accn").innerHTML = mrk.get('cn'); document.getElementById("acre").innerHTML = rg; document.getElementById("acty").innerHTML = ftype[mrk.get('type') * 1]; document.getElementById("acmo").innerHTML = ""; if (fi != "hidden") { //document.getElementById("acfi").innerHTML = "" + fi + ""; document.getElementById("acfi").innerHTML = "" + fi + ""; document.getElementById("acif").innerHTML = "Infos    Pictures"; if (mrk.get('dinfo') === "") { downloadUrl(tld + '/' + dxml + '?i=' + mark + '&f=' + fi, function(data) { var dat = data.documentElement.getElementsByTagName("m"); var err = parseFloat(dat[0].getAttribute("g")); var mrk = dat[0].getAttribute("i"); if (err === 0) { window[mrk].set('model', "" + dat[0].getAttribute("c")); affinfodata2(mrk); document.getElementById("ac2").style.display = "block"; window[mrk].set('dinfo', "ok"); } else { window[mrk].set('dinfo', "_"); document.getElementById("ac2").style.display = "none"; } }); } else { if (mrk.get('dinfo') != "_") { affinfodata2(mark); document.getElementById("ac2").style.display = "block"; } else { document.getElementById("ac2").style.display = "none"; } } } else { document.getElementById("acfi").innerHTML = fi; document.getElementById("ac2").style.display = "none"; document.getElementById("acif").innerHTML = ""; document.getElementById("acmo").innerHTML = ""; } acaff = mark; document.getElementById("ac").style.display = "block"; } function settomap() { var extent = map.getView().calculateExtent(map.getSize()); var bottomLeft = ol.proj.transform(ol.extent.getBottomLeft(extent),'EPSG:3857', 'EPSG:4326'); var topRight = ol.proj.transform(ol.extent.getTopRight(extent),'EPSG:3857', 'EPSG:4326'); amax = topRight[1]; amin = bottomLeft[1]; omax = topRight[0]; omin = bottomLeft[0]; if (amax > 85) amax = 85; if (amin < -85) amin = -85; if (omax > 180) omax = 180; if (omin < -180) omin = -180; document.getElementById('latmax').value = amax; document.getElementById('latmin').value = amin; document.getElementById('lonmax').value = omax; document.getElementById('lonmin').value = omin; if (bound === true) bounds(); if (vstm === true) { boundc = "&b=" + amax + "&c=" + amin + "&d=" + omax + "&e=" + omin; hashs = "&s=1"; rehash(); } } function astm() { if (document.getElementById('astmbox').checked) { vstm = true; if (document.getElementById('boundsbox').checked) { bound = false; document.getElementById('boundsbox').checked = false; hashb = ""; } settomap(); } else { vstm = false; if (bound === false) boundc = ""; hashs = ""; rehash(); } } function dist(lat1, lon1, lat2, lon2) { var torad = Math.PI / 180; lat1 *= torad; lon1 *= torad; lat2 *= torad; lon2 *= torad; var dt = Math.acos((Math.sin(lat1) * Math.sin(lat2)) + (Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2))); dt *= 6366; return dt; } function baro_reSize() { switch(pathl) { case 30: document.getElementById('dbaro').style.width = "155px"; // 70+85 // weird behaviour for canvas sizing versus scaling document.getElementById('div_baro').style.width = "70px"; document.getElementById('div_baro').width = 70; X_lines = 5+1; break; case 60: document.getElementById('dbaro').style.width = "225px"; // 140+85 // weird behaviour for canvas sizing versus scaling document.getElementById('div_baro').style.width = "140px"; document.getElementById('div_baro').width = 140; X_lines = 10+1; break; default: document.getElementById('dbaro').style.width = "295px" ; //210+85 // weird behaviour for canvas sizing versus scaling document.getElementById('div_baro').style.width = "210px"; document.getElementById('div_baro').width = 210; X_lines = 15+1; } } function baro_plot() { var j = -1; while (online[++j]) { // * if (window["P_" + online[j][2]].getVisible() === true) { if (window["P_" + online[j][2]].get('visi') == 1) { baro_plotData(online[j][0],online[j][3],window["B_" + online[j][2]]); } } } function gesmark() { if (nbreq > 0) { --nbreq; return; } ++nbreq; downloadUrl(tld + '/' + cxml + "?a=" + all + boundc + recc + parc + tz + hashy, function(data) { ++w; var planeurs = data.documentElement.getElementsByTagName("m"); online.length = 0; offline.length = 0; var colcn; var del = "N"; for (var i = 0; i < planeurs.length; i++) { // récupération des données transmises pour ce planeur var tab = planeurs[i].getAttribute("a").split(","); var fid = tab[12]; if (wlt == 1) { if (wlist.indexOf(fid) == -1) continue; } var ps = tab[3]; var lat = parseFloat(tab[0]); var lon = parseFloat(tab[1]); var cn = tab[2]; if (cn == "") cn = "_"; var alt = tab[4]; var tim = tab[5]; var ddf = tab[6]; var track = tab[7]; var speed = tab[8]; var vz = tab[9]; var typ = tab[10]; var rec = tab[11]; var crc = tab[13]; var posi = new ol.geom.Point(ol.proj.fromLonLat([lon,lat])); var te = 0; //altitude sol // elevator.getElevationForLocations({'locations': [posi]}, function(results, status) { // if (status == google.maps.ElevationStatus.OK) { // if (results[0]) { // te = Math.round(results[0].elevation); // } // } // }); var posiBaton = new ol.geom.Point(ol.proj.fromLonLat([lon,lat+(0.00001*(alt-te))])); var polyvar = "P_" + crc; var markvar = "M_" + crc; var stickvar = "S_" + crc; var barovar = "B_" + crc; var visib = 1; if (typeof(window[polyvar]) == 'undefined') // If aircraft not already created { // create path color for array hcol = tcolor[ccolor]; if (hnew === true) visib = 0; // * false; // create polyline window[polyvar] = new ol.Feature({ geometry: new ol.geom.LineString([ol.proj.fromLonLat([lon,lat])]) }); window[polyvar].setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ //color: '#' + hcol, // version courte initiale color: [parseInt(hcol.substring(0,2), 16), parseInt(hcol.substring(2,4), 16), parseInt(hcol.substring(4), 16), visib ], // version avec canal alpha pour cacher/afficher width: polwidth }) })); try { traceLayerSource.addFeature(window[polyvar]); } catch(err) { console.log("Pol:"); console.log(window[polyvar]); } window[polyvar].set('poly', "" + polyvar); window[polyvar].set('visi', visib); window[polyvar].set('col', "" + hcol); window[polyvar].set('nom', "" + cn + " - " + ps); // création du Baton d'altitude window[stickvar] = new ol.Feature({ geometry: new ol.geom.LineString([ol.proj.fromLonLat([lon,lat])]) }); window[stickvar].setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: [0, 0, 0, visib ], // version avec canal alpha pour cacher/afficher // black for now // color: [parseInt(hcol.substring(0,2), 16), parseInt(hcol.substring(2,4), 16), parseInt(hcol.substring(4), 16), visib ], // version avec canal alpha pour cacher/afficher width: polwidth }) })); window[stickvar].set('nom', "" + cn + " - " + ps); window[stickvar].set('baton', "" + stickvar); window[stickvar].set('col', "000000"); // stick color is black sticksLayerSource.addFeature(window[stickvar]); // création du Marker window[markvar] = new ol.Feature({ geometry: posi, title: cn + " - " + ps + " @ " + alt + "m", // id: markvar lat: lat, lon: lon }); window[markvar].setStyle(new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], opacity: visib, src: "" + tld + "/markers/" + cn + ftypec[typ * 1] + ".png" }) })); window[markvar].set('poly', "" + polyvar); window[markvar].set('mark', "" + markvar); window[markvar].set('stick', "" + stickvar); window[markvar].set('nom', "" + cn + " - " + ps); window[markvar].set('cn', "" + cn); window[markvar].set('reg', "" + ps); if (fid == "0") fid = "hidden"; window[markvar].set('fid', "" + fid); window[markvar].set('type', "" + typ); window[markvar].set('icol', "" + ccolor); window[markvar].set('off', 0); window[markvar].set('dinfo', ""); // * window[markvar].setTitle("" + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit] + " @ " + tim); window[markvar].set('speed', "" + speed); window[markvar].set('track', "" + track); window[markvar].set('vz', "" + vz); window[markvar].set('tim', "" + tim); window[markvar].set('rec', "" + rec); window[markvar].set('alt', "" + alt); window[markvar].set('tra', 0); window[markvar].set('visi', visib); iconLayerSource.addFeature(window[markvar]); // create array and add barogram time and altitude window[barovar] = []; window[barovar].push([tim.toSeconds(),alt]); // reset the time scale on the barogram Set_XY_Scale(tim,alt); if (++ccolor == tcolor.length) ccolor = 0; } // fin du if typeof... var difalt = vz * 1; colcn = window[polyvar].get('col'); if (ddf < 600) { // if online (active during 10 last minutes) if (ddf > 120) afdif = "n"; else if (difalt === 0) afdif = "z"; else if (difalt < -4) afdif = "mmm"; else if (difalt < -1) afdif = "mm"; else if (difalt < 0) afdif = "m"; else if (difalt > 4) afdif = "ppp"; else if (difalt > 1) afdif = "pp"; else afdif = "p"; online.push([cn, alt * 1, crc, '#'+colcn, afdif]); if (window[markvar].get('off') == 1) { window[markvar].setStyle(new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], src: "" + tld + "/markers/" + cn + ftypec[typ * 1] + ".png" }) })); window[markvar].set('off', 0); window[markvar].changed(); map.render(); } if (window[markvar].get('tra') === 0) { // partial path, not whole path // * if (window[polyvar].getPath().getLength() >= pathl) window[polyvar].getPath().removeAt(0); // remove first point of the trace if (window[polyvar].getGeometry().getCoordinates().length >= pathl) { window[polyvar].getGeometry().setCoordinates( window[polyvar].getGeometry().getCoordinates().slice(1) ); } } // * window[polyvar].getPath().push(posi); // ajout d'une position sur le tracé window[polyvar].getGeometry().appendCoordinate(ol.proj.fromLonLat([lon, lat])); window[polyvar].changed(); map.render(); if (typeof(window[markvar]) != 'undefined') { if (stick === 1) { window[stickvar].getGeometry().setCoordinates([ol.proj.fromLonLat([lon,lat]),ol.proj.fromLonLat([lon,lat+(0.00001*(alt-te))])]); window[markvar].setGeometry(posiBaton); // déplace le marker } else { try { window[markvar].setGeometry(posi); // déplace le marker } catch(err) { console.log("err maj posi du marker " + markvar + " : " + err.message); } } try { window[markvar].changed(); } catch (err) { console.log("Mar ch"); console.log(window[markvar]); } map.render(); // change l'altitude affichée // * window[markvar].setTitle("" + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit] + " @ " + tim); window[markvar].set('title', "" + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit] + " @ " + tim); window[markvar].set('speed', "" + speed); window[markvar].set('track', "" + track); window[markvar].set('vz', "" + vz); window[markvar].set('tim', "" + tim); window[markvar].set('rec', "" + rec); window[markvar].set('alt', "" + alt); window[markvar].set('lat', lat); window[markvar].set('lon', lon); } // check display time and remove old data if (window[barovar].length >= pathl) window[barovar].shift(); // remove first point of the trace // add barogram data window[barovar].push([tim.toSeconds(),alt]); Set_XY_Scale(tim,alt); } else { // offline if (all === 0) { // if offline not displayed // if (typeof(window[polyvar]) != 'undefined') { // si pas déjà effacé if (typeof(window[markvar]) != 'undefined') { // si pas déjà effacé // // efface et détruit le PolyLine et le Marker // efface et détruit le baton, le PolyLine et le Marker /// ### window[stickvar].setMap(null); delete window[stickvar]; delete window[barovar]; iconLayerSource.removeFeature(window[markvar]); traceLayerSource.removeFeature(window[polyvar]); map.render(); delete window[markvar]; delete window[polyvar]; if (autoc == markvar) { autoc = ""; document.getElementById("divInfoac").innerHTML = " "; document.getElementById("divInfoac").style.display = "none"; } if (acaff == markvar) acaff = ""; } } else { // if offline displayed offline.push([cn, alt * 1, crc, '#'+colcn, "n"]); if (window[markvar].get('off') === 0) { window[markvar].setStyle(new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], src: "" + tld + "/markers/" + cn + "_o.png" }) })); window[markvar].set('off', 1); window[markvar].changed(); map.render(); } } } if (autoc == markvar) { document.getElementById("divInfoac").innerHTML = "AC: " + cn + " - " + ps + " @ " + (alt * m2ft[unit]).toFixed() + am2ft[unit]; if (cton === false) map.getView().setCenter(ol.proj.transform([lon, lat], 'EPSG:4326', 'EPSG:3857')); } if (acaff == markvar) affinfodata(markvar); } // fin du for (var i = 0; i < planeurs.length; i++) // tri et affichage du tableau afftab(); baro_plotRefresh(); baro_plot(); if (--nbreq < 0) { nbreq = 0; } else { tmgm = setTimeout(gesmark, 10000); } }); } function wd() { if (w === 0) { clearTimeout(tmgm); gesmark(); } w = 0; tmwd = setTimeout(wd, 30000); } function rehash() { // window.location.replace("#" + hashc + hashz + hashm + hasho + hashb + hashs + hashl + hashw + hashp + hashu + hashn + hashy); window.location.replace("#" + hashc + hashz + hashm + hasho + hashb + hashs + hashl + hashw + hashp + hashu + hashn + hashy + hasha + hashg); } function rempl(po, c) { var thl = hl; hl = thl.substring(0, po) + c + thl.substring(po + 1); thl = hl.replace(/ /g, ''); if (thl === '') hashl = ''; else hashl = "&l=" + thl; } function taskclic() { document.getElementById("chfile").click(); } function deg2rad(deg) { var pi = Math.PI; return deg * (pi/180); } function discap(latdep,londep,latarr,lonarr) { // retourne la distance en km et le cap en degrés (les latitudes et longitudes fournies sont en radian, ouest et sud sont négatifs. var varc = Math.acos( (Math.sin(latdep)*Math.sin(latarr)) + (Math.cos(latdep)*Math.cos(latarr)*Math.cos(londep-lonarr)) ); distance = 6371 * varc; if (londep == lonarr) { if (latarr == latdep) { cap = 0; } else { if (latarr > latdep) { cap = 0; } else { cap = 180; } } } else { // ********* calcul cap ************ var radpole = 1.57079633; // 90°=1.57... rad var vara = radpole - latarr; var varb = radpole - latdep; var res = (Math.cos(vara)-(Math.cos(varb)*Math.cos(varc)))/(Math.sin(varb)*Math.sin(varc)); if (res > 1) { res=1; } else { if (res < -1) { res = -1; } } cap=Math.acos(res)*57.29577951; // car 1 rad= 57.29577951 degrés if (londep > lonarr) { cap = 360 - cap; } } cap = Math.round(cap); } function loadtask(cont) { var tasks = []; try { tasks = tasks.concat(parseJSONTasks(cont)); } catch (err) { tasks.push(parseXCSoarTask(cont)); } for (var i = 0; i < tasks.length; i++) { showTask(tasks[i]); filterDevices(tasks[i].wlist); } taskLayer.setVisible(true); } function parseJSONTasks(cont) { var res = JSON.parse(cont); var tasks = []; for (var i = 0; i < res.tasks.length; i++) { var task = {}; task.name = res.tasks[i].name; task.color = res.tasks[i].color; var tp = []; if (typeof res.tasks[i].legs != 'undefined') { for (var ii = 0; ii < res.tasks[i].legs.length; ii++) { if (res.tasks[i].legs[ii][0] == 'C') { // Circle console.log("Circle 1"); tp[tp.length - 1].type = "circle"; tp[tp.length - 1].radius = res.tasks[i].legs[ii][1]; } else if (res.tasks[i].legs[ii][0] == 'L') { // Line console.log("Line"); tp[tp.length - 1].type = "line"; tp[tp.length - 1].radius = res.tasks[i].legs[ii][1]; } else if (res.tasks[i].legs[ii][0][0] == 'Q') { // Quadrant console.log("Quadrant"); tp[tp.length - 1].type = "quadrant"; if (res.tasks[i].legs[ii][0].length > 1) tp[tp.length - 1].angle = Number(res.tasks[i].legs[ii][0].substr(1)); else tp[tp.length - 1].angle = 90; tp[tp.length - 1].radius = res.tasks[i].legs[ii][1]; } else if (res.tasks[i].legs[ii][0] == 'K') { // Key hole console.log("Keyhole"); tp[tp.length - 1].type = "keyhole"; tp[tp.length - 1].radius = res.tasks[i].legs[ii][1]; } else if (typeof res.tasks[i].legs[ii][1] == 'undefined') { // circle (old method) console.log("Circle old"); tp[tp.length - 1].type = "circle"; tp[tp.length - 1].radius = res.tasks[i].legs[ii][0]; } else { // turn point tp.push({ lat: res.tasks[i].legs[ii][0], lon: res.tasks[i].legs[ii][1] }); } } } task.turnpoints = tp; if (typeof res.tasks[i].wlist != 'undefined') { task.wlist = []; for (var ii = 0; ii < res.tasks[i].wlist.length; ii++) { task.wlist.push(res.tasks[i].wlist[ii]); } } tasks.push(task); } return tasks; } 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; } /* - Next function from : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Latitude/longitude spherical geodesy tools (c) Chris Veness 2002-2019 */ /* MIT Licence */ /* www.movable-type.co.uk/scripts/latlong.html */ /* www.movable-type.co.uk/scripts/geodesy-library.html#latlon-spherical */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function destinationPoint(slat, slon, distance, bearing) { var radius=6371e3; var δ,θ,φ1,λ1,sinφ2,φ2,y,x,λ2,lat,lon; δ = distance / radius; // angular distance in radians θ = Number(bearing).toRadians(); φ1 = slat.toRadians(); // latitude λ1 = slon.toRadians(); // longitude sinφ2 = Math.sin(φ1) * Math.cos(δ) + Math.cos(φ1) * Math.sin(δ) * Math.cos(θ); φ2 = Math.asin(sinφ2); y = Math.sin(θ) * Math.sin(δ) * Math.cos(φ1); x = Math.cos(δ) - Math.sin(φ1) * sinφ2; λ2 = λ1 + Math.atan2(y, x); lat = φ2.toDegrees(); lon = λ2.toDegrees(); return [lat, lon]; } function showTask(task) { var tc, tn, ltp; var tp = []; var capOut, capIn, capRetour, bis, azim, radius; var angledeb, anglefin; var cx1,cy1,cx2,cy2; var angle,result; tn = task.name || 'task ' + task.length; tc = task.color || 'FF0000'; for (var ii = 0; ii < task.turnpoints.length; ii++) { if (ii == 0) { // départ discap(deg2rad(task.turnpoints[ii].lat), deg2rad(task.turnpoints[ii].lon), deg2rad(task.turnpoints[ii+1].lat), deg2rad(task.turnpoints[ii+1].lon)); // cap vers le point suivant capOut = Math.round(cap); // cap vers le point suivant bis = ( capOut + 180 ) % 360; azim = bis; } else if (ii == (task.turnpoints.length - 1) ) { // arrivée discap(deg2rad(task.turnpoints[ii].lat), deg2rad(task.turnpoints[ii].lon), deg2rad(task.turnpoints[ii-1].lat), deg2rad(task.turnpoints[ii-1].lon)); // cap vers le point précédent capOut = Math.round(cap); // cap vers le point précédent bis = ( capOut + 180 ) % 360; azim = bis; } else { // point entre départ et arrivée discap(deg2rad(task.turnpoints[ii-1].lat), deg2rad(task.turnpoints[ii-1].lon), deg2rad(task.turnpoints[ii].lat), deg2rad(task.turnpoints[ii].lon)); capIn = Math.round(cap); // cap arrivant au TP discap(deg2rad(task.turnpoints[ii].lat), deg2rad(task.turnpoints[ii].lon), deg2rad(task.turnpoints[ii+1].lat), deg2rad(task.turnpoints[ii+1].lon)); capOut = Math.round(cap); // cap partant du TP capRetour = (capOut + 180) % 360; bis = Math.round( capIn + (capRetour - capIn) / 2 ); azim = (bis + 90) % 360; if (Math.abs(capRetour - capIn) > 180) bis = ( bis +180 ) % 360; } console.log("capout:"+capOut); console.log("bis:"+bis); if ((task.turnpoints[ii].type == 'circle')) { // circle var cc = ol.geom.Polygon.circular( /* WGS84 Sphere */ // ### IGC is 6371000 ? new ol.Sphere(6378137), [task.turnpoints[ii].lon, task.turnpoints[ii].lat], task.turnpoints[ii].radius, /* Number of verticies */ 64 ); cc.transform('EPSG:4326', 'EPSG:3857'); var circle = new ol.Feature({ geometry: cc }); circle.setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: '#' + tc, width: polwidth }), fill: new ol.style.Fill({ color: [parseInt(tc.substring(0,2), 16), parseInt(tc.substring(2,4), 16), parseInt(tc.substring(4), 16), 0.1 ] }) })); taskLayerSource.addFeature(circle); } else if ((task.turnpoints[ii].type == 'line')) { // line angledeb = (azim - 90 ) % 360; anglefin = (azim + 90 ) % 360; result = destinationPoint(task.turnpoints[ii].lat, task.turnpoints[ii].lon, task.turnpoints[ii].radius, angledeb); cy1 = result[0]; cx1 = result[1]; result = destinationPoint(task.turnpoints[ii].lat, task.turnpoints[ii].lon, task.turnpoints[ii].radius, anglefin); cy2 = result[0]; cx2 = result[1]; var tpline = []; // #### console.log("adeb:"+angledeb); console.log("afin:"+anglefin); console.log("cx1:"+cx1); console.log("cy1:"+cy1); console.log("cx2:"+cx2); console.log("cy2:"+cy2); tpline.push(ol.proj.fromLonLat([cx1, cy1])); tpline.push(ol.proj.fromLonLat([cx2, cy2])); var dline = new ol.Feature({ geometry: new ol.geom.LineString( tpline ) }); dline.setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: '#' + tc, width: polwidth }) })); taskLayerSource.addFeature(dline); } else if ((task.turnpoints[ii].type == 'quadrant')) { // quadrant var pointList = [], i, dAngle = 64 + 1, azimuth; pointList.push(ol.proj.fromLonLat([task.turnpoints[ii].lon, task.turnpoints[ii].lat])); console.log("Q bis:"+bis); angle = task.turnpoints[ii].angle; angledeb = (bis - (angle/2) ) % 360; anglefin = (bis + (angle/2) ) % 360; console.log("Q deb:"+angledeb); console.log("Q fin:"+anglefin); for (i = 0; i < dAngle; i++) { azimuth = angledeb + (angle) * i / (dAngle - 1); result = destinationPoint(task.turnpoints[ii].lat, task.turnpoints[ii].lon, task.turnpoints[ii].radius, azimuth); cy2 = result[0]; cx2 = result[1]; pointList.push(ol.proj.fromLonLat([cx2, cy2])); } pointList.push(ol.proj.fromLonLat([task.turnpoints[ii].lon, task.turnpoints[ii].lat])); var dline = new ol.Feature({ geometry: new ol.geom.Polygon( [pointList] ) }); dline.setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: '#' + tc, width: polwidth }), fill: new ol.style.Fill({ color: [parseInt(tc.substring(0,2), 16), parseInt(tc.substring(2,4), 16), parseInt(tc.substring(4), 16), 0.1 ] }) })); taskLayerSource.addFeature(dline); } point = ol.proj.fromLonLat([task.turnpoints[ii].lon, task.turnpoints[ii].lat]); tp.push(point); } var taskpath = new ol.Feature({ geometry: new ol.geom.LineString( tp ) }); taskpath.setStyle(new ol.style.Style({ stroke: new ol.style.Stroke({ color: '#' + tc, width: polwidth }) })); taskpath.set('nom', '' + tn); taskLayerSource.addFeature(taskpath); document.getElementById('dtaskbox').innerHTML = ''; } 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 var files = document.getElementById('chfile').files; if (!files.length) { alert('Please select a file!'); return; } var file = files[0]; var reader = new FileReader(); reader.onloadend = function(evt) { if (evt.target.readyState == FileReader.DONE) { var cont = evt.target.result; cont = cont.trim(); loadtask(cont); } }; reader.readAsText(file); } function initialize() { var has = window.location.hash.substring(1).split('&'); // parse the parameters var parh = []; var cent = []; var gmdelay = 0; // to delay first call to gesmark if task file required for (var i = 0; i < has.length; i++) { var x = has[i].split('='); parh[x[0]] = x[1]; } // parameter c=lat,lon (center of the map) if (typeof(parh.c) != 'undefined') { cent = parh.c.split(','); vlat = parseFloat(cent[0]); vlon = parseFloat(cent[1]); hashc = "c=" + vlat.toFixed(5) + "," + vlon.toFixed(5); } // parameter o=1 (display offline) if (typeof(parh.o) != 'undefined') { if (parh.o == "1") { all = 1; hasho = "&o=1"; } } airspaceoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return 'http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_approved_airspaces_geometries@png/' + z + '/' + x + '/' + y + '.png'; }, wrapx: false }), opacity: 1, visible: false }); airportoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return 'http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_approved_airports@png/' + z + '/' + x + '/' + y + '.png'; }, wrapx: false }), opacity: 1, visible: false }); windoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ /* tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return "http://weather.openportguide.de/tiles/actual/wind_stream/0h/" + z + "/" + x + "/" + y + ".png"; }, */ url: 'http://weather.openportguide.de/tiles/actual/wind_stream/0h/{z}/{x}/{y}.png', wrapx: false }), opacity: 1, visible: false }); presoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ /* tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return "http://weather.openportguide.de/tiles/actual/surface_pressure/0h/" + z + "/" + x + "/" + y + ".png"; }, */ url: 'http://weather.openportguide.de/tiles/actual/surface_pressure/0h/{z}/{x}/{y}.png', wrapx: false }), opacity: 1, visible: false }); tempoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ /* tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return "http://weather.openportguide.de/tiles/actual/air_temperature/0h/" + z + "/" + x + "/" + y + ".png"; }, */ url: 'http://weather.openportguide.de/tiles/actual/air_temperature/0h/{z}/{x}/{y}.png', wrapx: false }), opacity: 1, visible: false }); rainoverlay = new ol.layer.Tile({ source: new ol.source.XYZ({ /* tileUrlFunction: function(tileCoord, projection) { var z = tileCoord[0]; var x = tileCoord[1]; var y = (1 << z) + tileCoord[2]; return "http://weather.openportguide.de/tiles/actual/precipitation_shaded/0h/" + z + "/" + x + "/" + y + ".png"; }, */ url: 'http://weather.openportguide.de/tiles/actual/precipitation_shaded/0h/{z}/{x}/{y}.png', wrapx: false }), opacity: 0.4, visible: false }); OSMLayer = new ol.layer.Tile({ source: new ol.source.OSM(), visible: true }); MapsForFreeLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: '
Background map: Maps-For-Free.com
' }) ], url: 'https://maps-for-free.com/layer/relief/z{z}/row{y}/{z}_{x}-{y}.jpg', wrapx: false }), opacity: 1, visible: false }); MapsForFreeLayerW = new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'https://maps-for-free.com/layer/water/z{z}/row{y}/{z}_{x}-{y}.gif', wrapx: false }), opacity: 1, visible: false }); OSMTopoLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: '
Background map: OpenTopoMap
' }) ], url: '//{a-c}.tile.opentopomap.org/{z}/{x}/{y}.png', wrapx: false }), opacity: 1, visible: false }); IGNSatelliteLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: '
Background map: IGN
' }) ], url: '//wxs.ign.fr/pratique/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&STYLE=normal&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg', wrapx: false }), opacity: 1, visible: false }); l4UMapsLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: '
Background map: 4UMaps.com
' }) ], url: 'https://tileserver.4umaps.com/{z}/{x}/{y}.png', wrapx: false }), opacity: 1, visible: false }); StamenTerrainLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ attributions: [ new ol.Attribution({ html: '
Background map: Map tiles by Stamen Design
' }) ], url: '//{a-d}.tile.stamen.com/terrain/{z}/{x}/{y}.jpg', wrapx: false }), opacity: 1, visible: false }); iconLayerSource = new ol.source.Vector({ attributions: [ new ol.Attribution({html:'
Powered by Open Glider Network'}) ], features: [] }); iconLayer = new ol.layer.Vector({ source: iconLayerSource, zIndex: 200 }); sticksLayerSource = new ol.source.Vector({ features: [] }); sticksLayer = new ol.layer.Vector({ source: sticksLayerSource, zIndex: 150, opacity: 1, visible: false }); traceLayerSource = new ol.source.Vector({ features: [] }); traceLayer = new ol.layer.Vector({ source: traceLayerSource, zIndex: 100 }); taskLayerSource = new ol.source.Vector({ features: [] }); taskLayer = new ol.layer.Vector({ source: taskLayerSource, zIndex: 70 }); receiverLayerSource = new ol.source.Vector({ features: [] }); receiverLayer = new ol.layer.Vector({ source: receiverLayerSource, zIndex: 50, opacity: 1, visible: false }); attribution = new ol.control.Attribution({ collapsed: true, tipLabel: 'Show credits' }); scaleLineControl = new ol.control.ScaleLine(); map = new ol.Map({ interactions: ol.interaction.defaults().extend([ new ol.interaction.DragRotateAndZoom() ]), layers: [ MapsForFreeLayer, MapsForFreeLayerW, OSMTopoLayer, IGNSatelliteLayer, l4UMapsLayer, StamenTerrainLayer, OSMLayer, receiverLayer, airportoverlay, airspaceoverlay, windoverlay, presoverlay, tempoverlay, rainoverlay, taskLayer, traceLayer, sticksLayer, iconLayer ], target: 'map_canvas', controls: ol.control.defaults({ attributionOptions: { //collapsible: false collapsible: true } }).extend([ scaleLineControl, attribution ]), view: new ol.View({ center: ol.proj.fromLonLat([vlon,vlat]), zoom: 10 }) }); map.on('singleclick', function(event) { var receiver = false; var recinfo = ""; var coord; map.forEachFeatureAtPixel(event.pixel, function(feature,layer) { if(typeof(feature.get('mark'))!='undefined'){ if ( feature.get('mark').substring(0,1) == "M" ) { affinfo(feature.get('mark')); document.getElementById('lonlatoverlay').style.display = "none"; return; } if ( feature.get('mark').substring(0,1) == "R" ) { receiver = true; recinfo = feature.get("info"); coord = feature.getGeometry().getCoordinates(); } } }); if (receiver) { document.getElementById("lonlatoverlay").innerHTML = recinfo; lonlatoverlay.setPosition(coord); document.getElementById('lonlatoverlay').style.display = "block"; } else document.getElementById('lonlatoverlay').style.display = "none"; }); map.on('moveend', function(event) { // get zoom level hashz = "&z=" + map.getView().getZoom(); // get center var nc = ol.proj.toLonLat( map.getView().getCenter() ); hashc = "c=" + nc[1].toFixed(5) + "," + nc[0].toFixed(5); // get rotate var rotation = map.getView().getRotation(); if (rotation == 0) { document.getElementById('NorthButton').style.display = "none"; } else { document.getElementById('NorthButton').style.display = "block"; document.getElementById('NorthButton').style.transform = "rotate("+ rotation +"rad)"; } rehash(); if (vstm === true) settomap(); document.getElementById('lonlatoverlay').style.display = "none"; }); map.on('pointermove', function(event) { var changed = false; map.forEachFeatureAtPixel(event.pixel, function(feature,layer) { if(typeof(feature.get('col'))!='undefined'){ lastpol = feature.get('poly'); focuson(lastpol); document.getElementById("divInfo").innerHTML = "    " + feature.get('nom'); changed = true; return; } }); if (!changed) { focusoff(lastpol); document.getElementById("divInfo").innerHTML = " ... "; } }); map.getViewport().addEventListener('contextmenu', function (evt) { evt.preventDefault(); var nb = 0; map.forEachFeatureAtPixel([evt.layerX,evt.layerY], function(feature,layer) { ++nb; if ( feature.get('mark').substring(0,1) == "M" ) { redraw('P_' + feature.get('mark').substring(2)); } }); if (nb == 0) { var coord = map.getEventCoordinate(evt); // transform it to decimal degrees var degrees = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326'); // format a human readable version var hdms = ol.coordinate.toStringHDMS(degrees); // update the overlay element's content document.getElementById("lonlatoverlay").innerHTML = hdms; // position the element (using the coordinate in the map's projection) lonlatoverlay.setPosition(coord); document.getElementById('lonlatoverlay').style.display = "block"; } }); northbutton = document.createElement('button'); northbutton.setAttribute("id", "NorthButton"); northbutton.style.display = "none"; northbutton.innerHTML = '↑'; handleRotateNorth = function(e) { map.getView().setRotation(0); }; // add button to rotate noth up northbutton.addEventListener('click', handleRotateNorth, false); // add button to switch map mapbutton = document.createElement('button'); mapbutton.innerHTML = 'M'; map_selector = function(e) { // select map layer if (++map_id == 6) map_id = 0; chmap(map_id); } mapbutton.addEventListener('click', map_selector, false); divInfo = document.createElement("div"); divInfo.id = "divInfo"; divInfo.className = "divInfoclass"; divInfo.style.width = "120px"; divInfo.style.float = "left"; divInfo.style.display = "block"; divInfo.appendChild(document.createTextNode("...")); // add fullscrenn button fullsbutton = document.createElement('button'); fullsbutton.innerHTML = "⛶"; screen_mode = function(e) { // switch fullscreen mode /normal mode if (1 >= outerHeight - innerHeight) { // test if fullscreen mode if(document.exitFullscreen) { document.exitFullscreen(); } else if(document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if(document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.msExitFullscreen) { window.top.document.msExitFullscreen(); } } else { var el = document.documentElement; if(el.requestFullscreen) { el.requestFullscreen(); } else if(el.mozRequestFullScreen) { el.mozRequestFullScreen(); } else if(el.webkitRequestFullscreen) { el.webkitRequestFullscreen(); } else if(el.msRequestFullscreen) { el.msRequestFullscreen(); } } } fullsbutton.addEventListener('click', screen_mode, false); zoomdiv = document.getElementsByClassName('ol-zoom ol-unselectable ol-control')[0]; zoomdiv.appendChild(fullsbutton); zoomdiv.appendChild(mapbutton); zoomdiv.appendChild(northbutton); zoomdiv.appendChild(divInfo); // displays credits over the list credits = document.getElementsByClassName('ol-attribution ol-unselectable ol-control')[0]; credits.style.zIndex = "1000"; // parameter m= map type if (typeof(parh.m) != 'undefined') { map_id = parseInt(parh.m); chmap(map_id); hashm = "&m=" + map_id; } /* * // parameter z= zoom level if (typeof(parh.z) != 'undefined') map.setZoom(parseInt(parh.z)); */ if (typeof(parh.z) != 'undefined') map.getView().setZoom(parseInt(parh.z)); // overlay to display coordinate on a right-clic lonlatoverlay = new ol.Overlay({ element: document.getElementById('lonlatoverlay'), positioning: 'bottom-center' }); map.addOverlay(lonlatoverlay); divInfoac = document.createElement("div"); divInfoac.id = "divInfoac"; divInfoac.className = "divInfoclass"; divInfoac.style.width = "170px"; divInfoac.style.cursor = 'pointer'; divInfoac.style.float = "left"; divInfoac.style.left = "10px"; divInfoac.style.top = "1px"; divInfoac.style.position = "absolute"; divInfoac.style.display = "none"; divInfoac.appendChild(document.createTextNode("...")); autoc = ""; coverlay = document.getElementsByClassName('ol-overlaycontainer-stopevent')[0]; coverlay.appendChild(divInfoac); document.getElementById("divInfoac").addEventListener("click", function(){ document.getElementById("divInfoac").innerHTML = " "; autoc = ""; document.getElementById("divInfoac").style.display = "none"; }); document.getElementById("ett1").innerHTML = ett1; document.getElementById("ett2").innerHTML = "
CNAlti.Vz
"; document.getElementById("ac").innerHTML = "   ..::Aircraft::..
CN:
Regist.:
Device Id:
Type:
Model:
Last time:
Latitude:
Longitude:
Altitude:
G.Speed:
Track:  °
Vz:
Receiver:
"; document.getElementById("dtable").innerHTML = "
"; // document.getElementById("menu").innerHTML = "
Hide new gliders
Ignore Offline
Bounds

       
Auto Set to map
..:: Devices ::..
ICAO
Flarm
OGN Trackers
..:: Layers ::..
Temperature
Wind \"\"
Pressure
Precipitation
AirSpaces ( openaip.net )
Airports ( openaip.net )
Receivers
Tasks

..::Units::..
Met. Imp.
..::Path length::..
5' 10' All
Join the
OGN DataBase

Sources
"; // document.getElementById("menu").innerHTML = "
Hide new gliders
Ignore Offline
Bounds

       
Auto Set to map
..:: Devices ::..
ICAO
Flarm
OGN Trackers
..:: Layers ::..
Temperature
Wind \"\"
Pressure
Precipitation
AirSpaces ( openaip.net )
Airports ( openaip.net )
Receivers
Tasks

..::Units::..
Met. Imp.
..::Path length::..
5' 10' All
..:: Altitude ::..
Altitude stick
Join the
OGN DataBase

Sources
"; document.getElementById("menu").innerHTML = "
Hide new gliders
Ignore Offline"+ "
Bounds

       
Auto Set to map"+ "
..:: Devices ::..
ICAO
Flarm
OGN Trackers"+ "
..:: Layers ::..
Temperature
Wind \"\"
Pressure
Precipitation
AirSpaces ( openaip.net )
Airports ( openaip.net )
Receivers
Tasks
"+ "
..::Units::..
Met. Imp."+ "
..::Path length::..
5' 10' All"+ "
..:: Altitude ::..
Altitude stick
Barogram"+ "
Join the
OGN DataBase

Sources
"; // parameter b=lat1,lon1,lat2,lon2 bounds if (typeof(parh.b) != 'undefined') { cent = parh.b.split(','); document.getElementById('latmax').value = parseFloat(cent[0]); document.getElementById('latmin').value = parseFloat(cent[1]); document.getElementById('lonmax').value = parseFloat(cent[2]); document.getElementById('lonmin').value = parseFloat(cent[3]); boundc = "&b=" + cent[0] + "&c=" + cent[1] + "&d=" + cent[2] + "&e=" + cent[3]; document.getElementById('boundsbox').checked = true; bound = true; hashb = "&b=" + cent[0] + "," + cent[1] + "," + cent[2] + "," + cent[3]; } else { // force auto set to map to avoid problem when there is too much aircrafts document.getElementById('astmbox').checked = true; vstm = true; hashs = "&s=1"; } // parameter l= active layers if (typeof(parh.l) != 'undefined') { for (var i = 0; i < parh.l.length; i++) { switch (parh.l[i]) { case 't': // temperature document.getElementById('tembox').checked = true; tempe(); break; case 'v': // wind document.getElementById('winbox').checked = true; wind(); break; case 'p': // pressure document.getElementById('prebox').checked = true; pres(); break; case 'n': // precipitation document.getElementById('raibox').checked = true; rain(); break; case 'z': // airspace document.getElementById('aspbox').checked = true; asp(); break; case 'a': // airport document.getElementById('aptbox').checked = true; apt(); break; case 'r': // receivers document.getElementById('reclbox').checked = true; break; } } } if (typeof(parh.t) != 'undefined') { gmdelay = 1; var xhr = new XMLHttpRequest(); xhr.open("GET", parh.t, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { var status = xhr.status; if ((status >= 200 && status < 300) || status === 304) { loadtask(xhr.responseText); } else { alert("Task Request unsuccessful" + status); } } gesmark(); }; xhr.send(null); } // parameter w=0 (Don't display the warning) var warn = 1; if (typeof(parh.w) != 'undefined') { if (parh.w == "0") { warn = 0; hashw = "&w=0"; } } // parameter n=0 (Hide the panel) if (typeof(parh.n) != 'undefined') { if (parh.n == "0") { alist(); } } if (warn == 1) { document.getElementById("popup").innerHTML = "\"close\"

Warning!


The data on this site can be ambiguous in certain situations and the displayed position of an aircraft or glider can be displaced relative to the actual position.
Before raising an alert please contact us so we can interpret the data correctly.


If you want your devices to be identified, join the OGN DataBase.

"; op(300); } // parameter u=i units imperial ou metric (default)) if (typeof(parh.u) != 'undefined') { if (parh.u == "i") { document.getElementById('uni').checked = true; unit = "i"; hashu = "&u=i"; scaleLineControl.setUnits(unitlist[unit]); } } // parameter a=0 (Display an altitude stick) if (typeof(parh.a) != 'undefined') { if (parh.a == "1") { document.getElementById('stick').checked = true; stick = 1; hasha = "&a=1"; sticksLayer.setVisible(true); } } // parameter g=0 (Display a barogram) if (typeof(parh.g) != 'undefined') { if (parh.g == "1") { document.getElementById('baro').checked = true; document.getElementById('dbaro').style.display = "block"; document.getElementById('dbaro').style.visibility = "visible"; barogram = 1; hashg = "&g=1"; } } // parameter p=1,2 or 3 path length 5", 10" or all points if (typeof(parh.p) != 'undefined') { if (parh.p == "2") { // 10 minutes pathl = 60; document.getElementById('rp2').checked = true; hashp = "&p=2"; } else if (parh.p == "3") { // all points pathl = 99999; document.getElementById('rp3').checked = true; hashp = "&p=3"; } baro_reSize(); } // parameter device type d=1 ICAO ,2 Flarm or 3 OGN tracker if (typeof(parh.y) != 'undefined') { if ((parh.y & 1) == 1) { document.getElementById('ICAObox').checked = true; } if ((parh.y & 2) == 2) { document.getElementById('Flarmbox').checked = true; } if ((parh.y & 4) == 4) { document.getElementById('OGNbox').checked = true; } devtype(); } else { document.getElementById('ICAObox').checked = true; document.getElementById('Flarmbox').checked = true; document.getElementById('OGNbox').checked = true; } tz = "&z=" + (tz / -60); // the javascript gettimezone function return negative value in minutes then /-60 to have correct hours rehash(); checkrec(); const body = document.querySelector('body'); body.onkeydown = function(e) { if (e.keyCode == 9) { if (document.getElementById('latmin')===document.activeElement || document.getElementById('latmax')===document.activeElement || document.getElementById('lonmin')===document.activeElement || document.getElementById('lonmax')===document.activeElement) { // nothing } else { // swap menu e.preventDefault(); onofff(); } } }; tmwd = setTimeout(wd, 30000); if (gmdelay == 0) gesmark(); // barogram plotting baro_Init(); }