4 <title>heat map</title>
6 <script src="js/jquery-3.1.0.min.js"></script>
7 <script src="js/chart.umd.js"></script>
8 <script src="js/js.storage.min.js"></script>
9 <script src="js/kismet.ui.theme.js"></script>
11 <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
12 <link rel="stylesheet" href="css/leaflet.css" />
13 <link rel="stylesheet" type="text/css" href="css/jquery.jspanel.min.css" />
14 <link rel="stylesheet" type="text/css" href="css/Control.Loading.css" />
16 <script src="js/leaflet.js"></script>
17 <script src="js/Leaflet.MultiOptionsPolyline.min.js"></script>
18 <script src="js/Control.Loading.js"></script>
19 <script src="js/chroma.min.js"></script>
21 <script src="js/js.storage.min.js"></script>
22 <script src="js/kismet.utils.js"></script>
23 <script src="js/kismet.units.js"></script>
25 <script src="js/datatables.min.js"></script>
26 <script src="js/dataTables.scrollResize.js"></script>
30 --adsb-sidebar-background: white;
31 --adsb-sidebar-background-offset: #f9f9f9;
35 --adsb-sidebar-background: #222;
36 --adsb-sidebar-background-offset: #444;
37 --map-tiles-filter: brightness(0.6) invert(1) contrast(3) hue-rotate(200deg) saturate(0.3) brightness(0.7);
41 filter: var(--map-tiles-filter, none);
51 font: 10pt "Helvetica Neue", Arial, Helvetica, sans-serif;
59 -ms-transform: translate(-50%, -50%);
60 transform: translate(-50%, -50%);
69 border: 1px solid black;
70 background: var(--adsb-sidebar-background);
81 border: 1px solid black;
82 background: var(--adsb-sidebar-background);
94 border: 1px solid black;
97 background: linear-gradient(to right,
129 display: inline-block;
134 box-sizing: border-box;
135 height: calc(100% - 125px);
136 padding: 0.5em 0.5em 1.5em 0.5em;
137 border-radius: 0.5em;
138 background: var(--adsb-sidebar-background-offset);
145 <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin="" />
146 <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script>
147 <script src="/js/leaflet-heat.js"></script>
149 <div id="warning" class="warning">
151 <p>To display the Russ map, your browser will connect to the Leaflet and Open Street Map servers to fetch the map tiles. This requires you have a functional Internet connection, and will reveal something about your location (the bounding region where planes have been seen.)
152 <p><input id="dontwarn" type="checkbox">Don't warn me again</input>
153 <p><button id="continue">Continue</button>
160 if (kismet.getStorage('kismet.base.unit.distance') === 'metric' ||
161 kismet.getStorage('kismet.base.unit.distance') === '')
165 $('#alt_min').html("0m");
166 $('#alt_mini').html("3000m");
167 $('#alt_maxi').html("9000m");
168 $('#alt_max').html("12000m");
170 $('#alt_min').html("0ft");
171 $('#alt_mini').html("10000ft");
172 $('#alt_maxi').html("30000ft");
173 $('#alt_max').html("40000ft");
177 var window_visible = true;
179 // Visibility detection from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
180 // Set the name of the hidden property and the change event for visibility
181 var hidden, visibilityChange;
182 if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
184 visibilityChange = "visibilitychange";
185 } else if (typeof document.msHidden !== "undefined") {
187 visibilityChange = "msvisibilitychange";
188 } else if (typeof document.webkitHidden !== "undefined") {
189 hidden = "webkitHidden";
190 visibilityChange = "webkitvisibilitychange";
193 function handleVisibilityChange() {
194 if (document[hidden]) {
195 window_visible = false;
197 window_visible = true;
201 // Warn if the browser doesn't support addEventListener or the Page Visibility API
202 if (typeof document.addEventListener === "undefined" || hidden === undefined) {
205 // Handle page visibility change
206 document.addEventListener(visibilityChange, handleVisibilityChange, false);
209 var urlparam = new URL(window.location.href);
210 var param_url = urlparam.searchParams.get('parent_url') + "/";
211 var param_prefix = urlparam.searchParams.get('local_uri_prefix', "");
212 var KISMET_PROXY_PREFIX = urlparam.searchParams.get('KISMET_PROXY_PREFIX', "");
214 if (param_prefix == 0)
217 var local_uri_prefix = param_url + param_prefix;
218 if (typeof(KISMET_URI_PREFIX) !== 'undefined')
219 local_uri_prefix = KISMET_URI_PREFIX;
221 var map_configured = false;
230 data = kismet.sanitizeObject(d);
232 if (!map_configured) {
233 var lat1 = data['kismet.wireless.map.min_lat'];
234 var lon1 = data['kismet.wireless.map.min_lon'];
235 var lat2 = data['kismet.wireless.map.max_lat'];
236 var lon2 = data['kismet.wireless.map.max_lon'];
241 map.fitBounds([[lat1, lon1], [lat2, lon2]])
242 L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
244 attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
245 className: 'map-tiles',
248 map_configured = true;
252 // 'top': $(dt.settings()[0].nScrollBody).scrollTop(),
253 // 'left': $(dt.settings()[0].nScrollBody).scrollLeft()
256 //console.log(data['kismet.wireless.map.devices'].length);
257 //console.log(data['kismet.wireless.map.devices']);
258 /*var locationPoints = [];
259 //for (var d = 0; d < data['kismet.wireless.map.devices'].length; d++) {
261 // var tmp = data['kismet.wireless.map.devices'][d];
262 // //console.log(tmp);
263 // locationPoints = locationPoints.concat(tmp);
264 // //dt.row.add([icao, id, kismet_units.renderHeightDistanceUnitless(altitude, 0), kismet_units.renderSpeedUnitless(speed, 0, true), heading.toFixed(0), packets]);
270 //console.log(locationPoints);
271 //locationPoints = locationPoints.map(function (p) { return [p[0], p[1]]; });
273 var addressPoints = data['kismet.wireless.map.devices'];
274 addressPoints = addressPoints.map(function (p) { return [p[1], p[0]]; });
275 var heat = L.heatLayer(addressPoints).addTo(map);
276 var window_visible = true;
279 var load_maps = kismet.getStorage('kismet.russ.maps_ok', false);
281 function poll_map() {
282 if (window_visible && !$('#map').is(':hidden') && load_maps) {
283 $.get(local_uri_prefix + KISMET_PROXY_PREFIX + "phy/RUSS/map_data.json")
287 //.always(function(d) {
288 // tid = setTimeout(function() { poll_map(); }, 2000);
291 tid = setTimeout(function() { poll_map(); }, 2000);
295 // Set a global timeout
299 withCredentials: true
304 $('#warning').hide();
306 $('#continue').on('click', function() {
307 if ($('#dontwarn').is(":checked"))
308 kismet.putStorage('kismet.russ.maps_ok', true);
309 $('#warning').hide();