From d2042777a3ada512e383f72e0a73a8f7480cd776 Mon Sep 17 00:00:00 2001 From: Marat Fayzullin Date: Sat, 23 Sep 2023 12:22:14 -0400 Subject: [PATCH] Implementing separate aircraft markers. --- htdocs/gfx/adsb-72.png | Bin 0 -> 65821 bytes htdocs/lib/GoogleMaps.js | 19 ++++ htdocs/lib/Leaflet.js | 3 + htdocs/lib/MapMarkers.js | 198 ++++++++++++++++++++++++++++++++++++++- htdocs/map-google.js | 37 ++++---- owrx/aircraft.py | 53 +++++------ 6 files changed, 265 insertions(+), 45 deletions(-) create mode 100644 htdocs/gfx/adsb-72.png diff --git a/htdocs/gfx/adsb-72.png b/htdocs/gfx/adsb-72.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb8c621363b5766650c741bdd08e3fa0162b55d GIT binary patch literal 65821 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 literal 0 HcmV?d00001 diff --git a/htdocs/lib/GoogleMaps.js b/htdocs/lib/GoogleMaps.js index 92b27dd1..291625e3 100644 --- a/htdocs/lib/GoogleMaps.js +++ b/htdocs/lib/GoogleMaps.js @@ -78,6 +78,25 @@ GAprsMarker.prototype.place = function() { } }; +// +// GoogleMaps-Specific AircraftMarker +// + +function GAircraftMarker() { $.extend(this, new AircraftMarker()); } +GAircraftMarker.prototype = new GMarker(); + +GAircraftMarker.prototype.place = function() { + // Project location and place symbol + var div = this.div; + if (div) { + var point = this.getProjection().fromLatLngToDivPixel(this.position); + if (point) { + div.style.left = point.x - 36 + 'px'; + div.style.top = point.y - 36 + 'px'; + } + } +}; + // // GoogleMaps-Specific SimpleMarker // diff --git a/htdocs/lib/Leaflet.js b/htdocs/lib/Leaflet.js index 589c1272..938f4180 100644 --- a/htdocs/lib/Leaflet.js +++ b/htdocs/lib/Leaflet.js @@ -66,6 +66,9 @@ function LFeatureMarker() { $.extend(this, new LMarker(), new FeatureMarker()); // Leaflet-Specific AprsMarker function LAprsMarker () { $.extend(this, new LMarker(), new AprsMarker()); } +// Leaflet-Specific AircraftMarker +function LAircraftMarker () { $.extend(this, new LMarker(), new AircraftMarker()); } + // // Leaflet-Specific Locator // diff --git a/htdocs/lib/MapMarkers.js b/htdocs/lib/MapMarkers.js index b600aeab..cbe3d79a 100644 --- a/htdocs/lib/MapMarkers.js +++ b/htdocs/lib/MapMarkers.js @@ -390,8 +390,7 @@ FeatureMarker.prototype.getInfoHTML = function(name, receiverMarker = null) { // // APRS Marker -// Represents APRS transmitters, as well as AIS (vessels) -// and HFDL (planes). +// Represents APRS transmitters, as well as AIS (vessels). // Derived classes have to implement: // setMarkerOpacity() // @@ -700,3 +699,198 @@ AprsMarker.prototype.getInfoHTML = function(name, receiverMarker = null) { + commentString + weatherString + detailsString + messageString + hopsString; }; + +// +// Aircraft Marker +// Represents aircraft reported by various aeronautic services, +// such as HFDL, ACARS, VDL2, and ADSB. +// Derived classes have to implement: +// setMarkerOpacity() +// + +function AircraftMarker() {} + +AircraftMarker.prototype = new Marker(); + +AircraftMarker.prototype.update = function(update) { + this.lastseen = update.lastseen; + this.mode = update.mode; + this.comment = update.location.comment; + // HFDL, ACARS, VDL2, ADSB + this.altitude = update.location.altitude; + this.aircraft = update.location.aircraft; + this.destination = update.location.destination; + this.origin = update.location.origin; + this.flight = update.location.flight; + this.icao = update.location.icao; + this.vspeed = update.location.vspeed; + this.squawk = update.location.squawk; + this.rssi = update.location.rssi; + this.msglog = update.location.msglog; + + // Implementation-dependent function call + this.setMarkerPosition(update.callsign, update.location.lat, update.location.lon); + + // Age locator + this.age(new Date().getTime() - update.lastseen); +}; + +AircraftMarker.prototype.draw = function() { + var div = this.div; + var overlay = this.overlay; + if (!div || !overlay) return; + + if (this.symbol) { + var tableId = this.symbol.table === '/' ? 0 : 1; + div.style.background = 'url(static/gfx/adsb-72.png)'; + div.style['background-size'] = '576px 792px'; + div.style['background-position-x'] = -this.symbol.x * 72 + 'px'; + div.style['background-position-y'] = -this.symbol.y * 72 + 'px'; + } + + // If aircraft is flying at a significant altitude... + if (this.altitude >= 500) { + // r = elevation, a = rotation, = shadow offset + var r = Math.round(this.altitude / 1000); + var a = - Math.PI * (this.course? this.course - 45 : -45) / 180; + var x = r * Math.cos(a); + var y = r * Math.sin(a); + div.style.filter = 'drop-shadow(' + x + 'px ' + y + 'px 0.5px rgba(0,0,0,0.5))'; + } else { + div.style.filter = 'none'; + } + + div.style.transform = 'scale(0.5)'; + + if (this.course) { + div.style.transform += ' rotate(' + this.course + 'deg)'; + } + + if (this.symbol && this.symbol.table !== '/' && this.symbol.table !== '\\') { + overlay.style.display = 'block'; + overlay.style['background-position-x'] = -this.symbol.x * 72 + 'px'; + overlay.style['background-position-y'] = -this.symbol.y * 72 + 'px'; + } else { + overlay.style.display = 'none'; + } + + if (this.opacity) { + div.style.opacity = this.opacity; + } else { + div.style.opacity = null; + } + + if (this.place) this.place(); +}; + +AircraftMarker.prototype.create = function() { + var div = this.div = document.createElement('div'); + + div.style.position = 'absolute'; + div.style.cursor = 'pointer'; + div.style.width = '72px'; + div.style.height = '72px'; + + var overlay = this.overlay = document.createElement('div'); + overlay.style.width = '72px'; + overlay.style.height = '72px'; + overlay.style.background = 'url(static/gfx/adsb-72.png)'; + overlay.style['background-size'] = '576px 792px'; + overlay.style.display = 'none'; + + div.appendChild(overlay); + + return div; +}; + +AircraftMarker.prototype.getAnchorOffset = function() { + return [0, -12]; +}; + +AircraftMarker.prototype.getInfoHTML = function(name, receiverMarker = null) { + var timeString = moment(this.lastseen).fromNow(); + var commentString = ''; + var detailsString = ''; + var messageString = ''; + var distance = ''; + + if (this.comment) { + commentString += '
' + Marker.makeListTitle('Comment') + '
' + + this.comment + '
'; + } + + if (this.msglog) { + messageString += '
' + Marker.makeListTitle('Messages') + + '
' +
+            this.msglog.join('\n
') + '
'; + } + + if (this.icao) { + detailsString += Marker.makeListItem('ICAO', Marker.linkify(this.icao, modes_url)); + } + + if (this.aircraft) { + detailsString += Marker.makeListItem('Aircraft', Marker.linkify(this.aircraft, flight_url)); + } + + if (this.squawk) { + detailsString += Marker.makeListItem('Squawk', this.squawk); + } + + if (this.origin) { + detailsString += Marker.makeListItem('Origin', this.origin); + } + + if (this.destination) { + detailsString += Marker.makeListItem('Destination', this.destination); + } + + // Combine course and speed if both present + if (this.course && this.speed) { + detailsString += Marker.makeListItem('Course', + Marker.degToCompass(this.course) + ' ' + + this.speed.toFixed(1) + ' km/h' + ); + } else { + if (this.course) { + detailsString += Marker.makeListItem('Course', Marker.degToCompass(this.course)); + } + if (this.speed) { + detailsString += Marker.makeListItem('Speed', this.speed.toFixed(1) + ' km/h'); + } + } + + // Combine altitude and vertical speed + if (this.altitude) { + var alt = this.altitude.toFixed(0) + ' m'; + if (this.vspeed > 0) alt += ' ↗' + this.vspeed + ' m/m'; + else if (this.vspeed < 0) alt += ' ↘' + (-this.vspeed) + ' m/m'; + detailsString += Marker.makeListItem('Altitude', alt); + } + + if (this.rssi) { + detailsString += Marker.makeListItem('RSSI', this.rssi + ' dB'); + } + + if (detailsString.length > 0) { + detailsString = '
' + Marker.makeListTitle('Details') + detailsString + '
'; + } + + if (receiverMarker) { + distance = ' at ' + Marker.distanceKm(receiverMarker.position, this.position) + ' km'; + } + + // Linkify title based on what it is (vessel, flight, mode-S code, or else) + var url = modes_url; + if (this.flight) { + name = this.flight; + url = this.flight.match(/^[A-Z]{3}[0-9]+[A-Z]*$/)? flight_url : null; + } else if (this.aircraft) { + name = this.aircraft; + url = flight_url; + } + + return '

' + Marker.linkify(name, url) + distance + '

' + + '
' + timeString + ' using ' + this.mode + '
' + + commentString + detailsString + messageString; +}; diff --git a/htdocs/map-google.js b/htdocs/map-google.js index f0a11419..d8c4a824 100644 --- a/htdocs/map-google.js +++ b/htdocs/map-google.js @@ -160,13 +160,24 @@ MapManager.prototype.processUpdates = function(updates) { case 'latlon': var marker = self.mman.find(update.callsign); var markerClass = GSimpleMarker; - var aprsOptions = {} + var options = {} + + switch(update.mode) { + case 'HFDL': case 'VDL2': case 'ADSB': case 'ACARS': + markerClass = GAircraftMarker; + break; + case 'APRS': case 'AIS': + markerClass = GAprsMarker; + break; + } + + options.color = update.location.color? + update.location.color : self.mman.getColor(update.mode); if (update.location.symbol) { - markerClass = GAprsMarker; - aprsOptions.symbol = update.location.symbol; - aprsOptions.course = update.location.course; - aprsOptions.speed = update.location.speed; + options.symbol = update.location.symbol; + options.course = update.location.course; + options.speed = update.location.speed; } // If new item, create a new marker for it @@ -188,7 +199,7 @@ MapManager.prototype.processUpdates = function(updates) { marker.setMap(self.mman.isEnabled(update.mode)? map : undefined); // Apply marker options - marker.setMarkerOptions(aprsOptions); + marker.setMarkerOptions(options); if (expectedCallsign && expectedCallsign == update.callsign) { map.panTo(marker.position); @@ -206,16 +217,10 @@ MapManager.prototype.processUpdates = function(updates) { var options = {} // If no symbol or color supplied, use defaults by type - if (update.location.symbol) { - options.symbol = update.location.symbol; - } else { - options.symbol = self.mman.getSymbol(update.mode); - } - if (update.location.color) { - options.color = update.location.color; - } else { - options.color = self.mman.getColor(update.mode); - } + options.symbol = update.location.symbol? + update.location.symbol : self.mman.getSymbol(update.mode); + options.color = update.location.color? + update.location.color : self.mman.getColor(update.mode); // If new item, create a new marker for it if (!marker) { diff --git a/owrx/aircraft.py b/owrx/aircraft.py index 30583f61..3d6b88d3 100644 --- a/owrx/aircraft.py +++ b/owrx/aircraft.py @@ -39,30 +39,30 @@ MODE_S_FORMATS = [ # Aircraft categories # ADSB_CATEGORIES = { - "A0": ("^", "/"), # No ADS-B emitter category information - "A1": ("'", "/"), # Light (< 15500 lbs) - "A2": ("'", "/"), # Small (15500 to 75000 lbs) - "A3": ("^", "/"), # Large (75000 to 300000 lbs) - "A4": ("^", "/"), # High vortex large (aircraft such as B-757) - "A5": ("^", "/"), # Heavy (> 300000 lbs) - "A6": ("^", "/"), # High performance (> 5g acceleration and 400 kts) - "A7": ("X", "/"), # Rotorcraft, regardless of weight - "B0": ("^", "/"), # No ADS-B emitter category information - "B1": ("g", "/"), # Glider or sailplane, regardless of weight - "B2": ("O", "/"), # Airship or balloon, regardless of weight - "B3": ("g", "/"), # Parachutist / skydiver - "B4": ("g", "/"), # Ultralight / hang-glider / paraglider - "B5": ("^", "/"), # Reserved - "B6": ("S", "\\"), # Unmanned aerial vehicle, regardless of weight - "B7": ("S", "/"), # Space / trans-atmospheric vehicle - "C0": ("D", "/"), # No ADS-B emitter category information - "C1": ("f", "/"), # Surface vehicle – emergency vehicle - "C2": ("u", "\\"), # Surface vehicle – service vehicle - "C3": ("D", "/"), # Point obstacle (includes tethered balloons) - "C4": ("D", "/"), # Cluster obstacle - "C5": ("D", "/"), # Line obstacle - "C6": ("D", "/"), # Reserved - "C7": ("D", "/"), # Reserved + "A0": (0, 0), # No ADS-B emitter category information + "A1": (3, 0), # Light (< 15500 lbs) + "A2": (5, 0), # Small (15500 to 75000 lbs) + "A3": (4, 0), # Large (75000 to 300000 lbs) + "A4": (0, 0), # High vortex large (aircraft such as B-757) + "A5": (1, 7), # Heavy (> 300000 lbs) + "A6": (7, 0), # High performance (> 5g acceleration and 400 kts) + "A7": (6, 5), # Rotorcraft, regardless of weight + "B0": (0, 0), # No ADS-B emitter category information + "B1": (1, 6), # Glider or sailplane, regardless of weight + "B2": (2, 0), # Airship or balloon, regardless of weight + "B3": (10, 0), # Parachutist / skydiver + "B4": (10, 0), # Ultralight / hang-glider / paraglider + "B5": (0, 0), # Reserved + "B6": (4, 3), # Unmanned aerial vehicle, regardless of weight + "B7": (4, 5), # Space / trans-atmospheric vehicle + "C0": (4, 8), # No ADS-B emitter category information + "C1": (2, 8), # Surface vehicle – emergency vehicle + "C2": (3, 8), # Surface vehicle – service vehicle + "C3": (5, 8), # Point obstacle (includes tethered balloons) + "C4": (6, 9), # Cluster obstacle + "C5": (2, 8), # Line obstacle + "C6": (2, 8), # Reserved + "C7": (2, 8), # Reserved } @@ -83,11 +83,10 @@ class AircraftLocation(LatLngLocation): if "category" in self.data and self.data["category"] in ADSB_CATEGORIES: # Add APRS-like symbol by aircraft category cat = ADSB_CATEGORIES[self.data["category"]] - res["symbol"] = getSymbolData(cat[0], cat[1]) + res["symbol"] = { "x": cat[0], "y": cat[1] } else: # Add APRS-like aircraft symbol (red or blue, depending on mode) - mod = '/' if self.data["mode"]=="ADSB" else '\\' - res["symbol"] = getSymbolData('^', mod) + res["symbol"] = { "x": 0, "y": 0 } # Convert aircraft-specific data into APRS-like data for x in ["icao", "aircraft", "flight", "speed", "altitude", "course", "destination", "origin", "vspeed", "squawk", "rssi", "msglog"]: if x in self.data: