From 97758a0abcc97fb148b8a8f277f3bde29898eceb Mon Sep 17 00:00:00 2001 From: TwinFan Date: Sun, 19 Jun 2022 00:45:15 +0200 Subject: [PATCH 1/7] Fix/OGN: Skip static objects if so configured, see #223 --- Src/LTOpenGlider.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Src/LTOpenGlider.cpp b/Src/LTOpenGlider.cpp index 953a7c3..c0583d6 100644 --- a/Src/LTOpenGlider.cpp +++ b/Src/LTOpenGlider.cpp @@ -211,7 +211,8 @@ bool OpenGliderConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) } // We sliently skip all static objects - if (std::stoi(tok[GNF_FLARM_ACFT_TYPE]) == FAT_STATIC_OBJ) + if (dataRefs.GetHideStaticTwr() && + std::stoi(tok[GNF_FLARM_ACFT_TYPE]) == FAT_STATIC_OBJ) continue; // We also skip records, which are outdated by the time they arrive @@ -558,8 +559,11 @@ bool OpenGliderConnection::APRSProcessLine (const std::string& ln) // We silently skip all static objects and those who do not want to be tracked uint8_t senderDetails = (uint8_t)std::stoul(m.str(M_SEND_DETAILS), nullptr, 16); FlarmAircraftTy acTy = FlarmAircraftTy((senderDetails & 0b00111100) >> 2); - if ((senderDetails & 0b11000000) || // "No tracking" or "stealth mode" set? - (acTy == FAT_STATIC_OBJ)) // Static object? + if (senderDetails & 0b11000000) // "No tracking" or "stealth mode" set? + return true; // -> ignore + + if (dataRefs.GetHideStaticTwr() && // Shall hide static objects and it is + acTy == FAT_STATIC_OBJ) // Static object? return true; // -> ignore // Timestamp - skip too old records From 2f3983d325a153182bad2e828f3829080c3a5e31 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Sun, 19 Jun 2022 00:49:35 +0200 Subject: [PATCH 2/7] Feat: Allow Export in RTTFC format, see #229 --- Include/DataRefs.h | 15 +++- .../xcdebugger/Expressions.xcexplist | 43 +++++++---- Resources/SendTraffic.py | 12 +-- Src/DataRefs.cpp | 77 +++++++++++++++---- Src/LTFlightData.cpp | 68 ++++++++++++---- Src/SettingsUI.cpp | 7 ++ docs/readme.html | 26 +++++-- 7 files changed, 188 insertions(+), 60 deletions(-) diff --git a/Include/DataRefs.h b/Include/DataRefs.h index 68115ed..7cf87cf 100644 --- a/Include/DataRefs.h +++ b/Include/DataRefs.h @@ -220,8 +220,11 @@ enum dataRefsXP { DR_PLANE_PITCH, DR_PLANE_ROLL, DR_PLANE_HEADING, + DR_PLANE_MAG_HEADING, ///< sim/flightmodel/position/mag_psi float n degrees The real magnetic heading of the aircraft DR_PLANE_TRACK, - DR_PLANE_TRUE_AIRSPEED, + DR_PLANE_KIAS, ///< sim/flightmodel/position/indicated_airspeed float y kias Air speed indicated - this takes into account air density and wind direction + DR_PLANE_TAS, ///< sim/flightmodel/position/true_airspeed float n meters/sec Air speed true - this does not take into account air density at altitude! + DR_PLANE_GS, ///< sim/flightmodel/position/groundspeed float n meters/sec The ground speed of the aircraft DR_PLANE_VVI, ///< sim/flightmodel/position/vh_ind float n meters/second VVI (vertical velocity in meters per second) DR_PLANE_ONGRND, DR_PLANE_REG, ///< sim/aircraft/view/acf_tailnum byte[40] y string Tail number @@ -386,6 +389,7 @@ enum dataRefsLT { DR_DBG_EXPORT_FD, DR_DBG_EXPORT_USER_AC, DR_DBG_EXPORT_NORMALIZE_TS, + DR_DBG_EXPORT_FORMAT, // channel configuration options DR_CFG_FSC_ENV, @@ -425,6 +429,12 @@ enum cmdRefsLT { CNT_CMDREFS_LT // always last, number of elements }; +/// Which format to use for exporting flight tracking data +enum exportFDFormat { + EXP_FD_AITFC = 1, ///< use AITFC format, the older shorter format + EXP_FD_RTTFC, ///< user RTTFC format, introduced with RealTraffic v9 +}; + // first/last channel; number of channels: constexpr int DR_CHANNEL_FIRST = DR_CHANNEL_FUTUREDATACHN_ONLINE; constexpr int DR_CHANNEL_LAST = CNT_DATAREFS_LT-1; @@ -606,6 +616,7 @@ class DataRefs unsigned uDebugAcFilter = 0; // icao24 for a/c filter int bDebugAcPos = false;// output debug info on position calc into log file? int bDebugLogRawFd = false;// log raw flight data to LTRawFD.log + exportFDFormat eDebugExportFdFormat = EXP_FD_AITFC; ///< Which format to use when exporting flight data? int bDebugExportFd = false;// export flight data to LTExportFD.csv int bDebugExportUserAc = false;///< export user's aircraft data to LTExportFD.csv float lastExportUserAc = 0.0f; ///< last time user's aircraft data has been written to export file @@ -912,6 +923,8 @@ class DataRefs inline bool GetDebugLogRawFD() const { return bDebugLogRawFd; } void SetDebugLogRawFD (bool bLog) { bDebugLogRawFd = bLog; } + exportFDFormat GetDebugExportFormat() const { return eDebugExportFdFormat; } + void SetDebugExportFormat (exportFDFormat e) { eDebugExportFdFormat = e; } bool GetDebugExportFD() const { return bDebugExportFd; } void SetDebugExportFD (bool bExport) { bDebugExportFd = bExport; } bool GetDebugExportUserAc() const { return bDebugExportUserAc; } diff --git a/LiveTraffic.xcodeproj/project.xcworkspace/xcuserdata/birger.xcuserdatad/xcdebugger/Expressions.xcexplist b/LiveTraffic.xcodeproj/project.xcworkspace/xcuserdata/birger.xcuserdatad/xcdebugger/Expressions.xcexplist index 2a1946a..707e9bf 100644 --- a/LiveTraffic.xcodeproj/project.xcworkspace/xcuserdata/birger.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/LiveTraffic.xcodeproj/project.xcworkspace/xcuserdata/birger.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -73,16 +73,19 @@ contextName = "Apt::FindEdgesForHeading(double, double, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> >&, TaxiEdge::edgeTy) const:LTApt.cpp"> + value = "vecTaxiEdges[222]"> + value = "vecTaxiEdgesIdxHead[3321]"> + value = "lst[1385]"> + + @@ -94,9 +97,6 @@ - - @@ -123,10 +123,10 @@ contextName = "LTFlightData::AddDynData(LTFlightData::FDDynamicData const&, int, int, positionTy*):LTFlightData.cpp"> + value = "posDeque"> + value = "dynDataDeque"> @@ -254,10 +254,10 @@ value = "cull"> + value = "iter->second"> + value = "tcas"> @@ -442,7 +442,7 @@ contextName = "LTAircraft::CalcPPos():LTAircraft.cpp"> + value = "from"> @@ -454,7 +454,7 @@ value = "ppos"> + value = "turn"> @@ -552,10 +552,10 @@ value = "mapFd"> + value = "sizeof(bool)"> + value = "dataRefs"> @@ -593,6 +593,14 @@ + + + + + + @@ -1112,10 +1120,10 @@ value = "_startTime"> + value = "_targetTime"> + value = "_deltaDist"> @@ -1131,6 +1139,9 @@ + + diff --git a/Resources/SendTraffic.py b/Resources/SendTraffic.py index 480086e..ba16ed8 100755 --- a/Resources/SendTraffic.py +++ b/Resources/SendTraffic.py @@ -10,7 +10,7 @@ MIT License -Copyright (c) 2021 B.Hoppe +Copyright (c) 2022 B.Hoppe Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -106,7 +106,9 @@ def sendTrafficData(ln: str, doSend: int) -> int: # split into its fields fields = ln.split(',') - # should have found 15 fields! + # should have found at least 15 fields, + # the first 15 are by and large very similar between AITFC and RTTFC, + # #1 is the a/c id and #14 is the timestamp in both cases if len(fields) < 15: print ("Found {} fields, expected at least 15, in line {}".format(len(fields), ln)) return 0 @@ -158,7 +160,7 @@ def updateUserPos(): """ === MAIN === """ # --- Handling command line argumens --- -parser = argparse.ArgumentParser(description='SendTraffic 1.0.1: Sends air traffic tracking data from a file out on a UDP port for LiveTraffic to receive it on the RealTraffic channel. ' +parser = argparse.ArgumentParser(description='SendTraffic 1.1.0: Sends air traffic tracking data from a file out on a UDP port for LiveTraffic to receive it on the RealTraffic channel. ' 'In LiveTraffic, activate the "RealTraffic" channel to receive the data and have it displayed as moving planes. ' 'From LiveTraffic, you can also export tracking data in a matching format using the Debug options "Export Tracking Data" and/or "Export User Aircraft". ' 'The latter allows you to fly yourself and have your aircraft\'s movements written as tracking data. ' @@ -171,7 +173,7 @@ def updateUserPos(): parser.add_argument('--historic', metavar='NUM', help='Send historic data, ie. reduce included timestamp by this many seconds', type=int, default=0) parser.add_argument('-l', '--loop', help='Endless loop: restart from the beginning when reaching end of file. Will work best if data contains loop with last position(s) being roughly equal to first position(s).', action='store_true') parser.add_argument('--host', metavar='NAME_OR_IP', help='UDP target host or ip to send the data to, defaults to \'localhost\'', default='localhost') -parser.add_argument('--port', metavar='NUM', help='UDP port to send traffic data to, defaults to 49003', type=int, default=49003) +parser.add_argument('--port', metavar='NUM', help='UDP port to send traffic data to, defaults to 49005', type=int, default=49005) parser.add_argument('--weatherPort', metavar='NUM', help='UDP port to send weather data to, defaults to 49004', type=int, default=49004) parser.add_argument('-v', '--verbose', help='Verbose output: Informs of each sent record', action='store_true') parser.add_argument('-u', '--getUserPos', help='Developer demo: Get user aircraft\'s position by reading from UDP port 49002; activate ForeFlight output in LiveTraffic, or "Broadcast to all third-party apps" in X-Plane\'s Network settings.', action='store_true') @@ -213,7 +215,7 @@ def updateUserPos(): line = line.strip() # Can be traffic or weather data - if line.startswith('AITFC'): + if line.startswith('AITFC') or line.startswith('RTTFC') : sendTrafficData(line, _sendLn) _sendLn = 1 # send all following lines else: diff --git a/Src/DataRefs.cpp b/Src/DataRefs.cpp index 8669164..140f1d3 100644 --- a/Src/DataRefs.cpp +++ b/Src/DataRefs.cpp @@ -321,11 +321,14 @@ const char* DATA_REFS_XP[] = { "sim/flightmodel/position/latitude", "sim/flightmodel/position/longitude", "sim/flightmodel/position/elevation", - "sim/flightmodel/position/true_theta", - "sim/flightmodel/position/true_phi", - "sim/flightmodel/position/true_psi", - "sim/flightmodel/position/hpath", - "sim/flightmodel/position/true_airspeed", + "sim/flightmodel/position/true_theta", // pitch + "sim/flightmodel/position/true_phi", // roll + "sim/flightmodel/position/true_psi", // true heading + "sim/flightmodel/position/mag_psi", // magnetic heading + "sim/flightmodel/position/hpath", // track + "sim/flightmodel/position/indicated_airspeed", // KIAS (apparently really in knots) + "sim/flightmodel/position/true_airspeed", // TAS + "sim/flightmodel/position/groundspeed", // GS "sim/flightmodel/position/vh_ind", // float n meters/second VVI (vertical velocity in meters per second)" "sim/flightmodel/failures/onground_any", "sim/aircraft/view/acf_tailnum", // byte[40] y string Tail number @@ -516,6 +519,7 @@ DataRefs::dataRefDefinitionT DATA_REFS_LT[CNT_DATAREFS_LT] = { {"livetraffic/dbg/export_fd", DataRefs::LTGetInt, DataRefs::LTSetBool, GET_VAR, false }, {"livetraffic/dbg/export_user_ac", DataRefs::LTGetInt, DataRefs::LTSetBool, GET_VAR, false }, {"livetraffic/dbg/export_normalize_ts", DataRefs::LTGetInt, DataRefs::LTSetBool, GET_VAR, true }, + {"livetraffic/dbg/export_format", DataRefs::LTGetInt, DataRefs::LTSetCfgValue, GET_VAR, true }, // channel configuration options {"livetraffic/channel/fscharter/environment", DataRefs::LTGetInt, DataRefs::LTSetBool, GET_VAR, true }, @@ -594,6 +598,7 @@ void* DataRefs::getVarAddr (dataRefsLT dr) case DR_DBG_EXPORT_FD: return &bDebugExportFd; case DR_DBG_EXPORT_USER_AC: return &bDebugExportUserAc; case DR_DBG_EXPORT_NORMALIZE_TS: return &bDebugExportNormTS; + case DR_DBG_EXPORT_FORMAT: return &eDebugExportFdFormat; // channel configuration options case DR_CFG_FSC_ENV: return &fscEnv; @@ -1010,7 +1015,7 @@ void DataRefs::UpdateUsersPlanePos () lastUsersPlanePos = pos; // also fetch true airspeed and track - lastUsersTrueAirspeed = XPLMGetDataf(adrXP[DR_PLANE_TRUE_AIRSPEED]); + lastUsersTrueAirspeed = XPLMGetDataf(adrXP[DR_PLANE_TAS]); lastUsersTrack = XPLMGetDataf(adrXP[DR_PLANE_TRACK]); } @@ -1038,17 +1043,55 @@ void DataRefs::ExportUserAcData() modeS_ID = DEFAULT_MODES_ID; // output a tracking data record - char buf[256]; - snprintf(buf, sizeof(buf), "AITFC,%u,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,,,%.0f\n", - modeS_ID, - lastUsersPlanePos.lat(), lastUsersPlanePos.lon(), - nanToZero(dataRefs.WeatherPressureAlt_ft(lastUsersPlanePos.alt_ft())), - XPLMGetDataf(adrXP[DR_PLANE_VVI]), - (lastUsersPlanePos.IsOnGnd() ? '0' : '1'), - lastUsersPlanePos.heading(), lastUsersTrueAirspeed * KT_per_M_per_S, - EXPORT_USER_CALL, - userIcao, userReg, - lastUsersPlanePos.ts() - nanToZero(LTFlightData::fileExportTsBase)); + char buf[1024]; + switch (dataRefs.GetDebugExportFormat()) { + case EXP_FD_AITFC: + snprintf(buf, sizeof(buf), "AITFC,%u,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,,,%.0f\n", + modeS_ID, // hexid + lastUsersPlanePos.lat(), lastUsersPlanePos.lon(), // lat, lon + nanToZero(dataRefs.WeatherPressureAlt_ft(lastUsersPlanePos.alt_ft())), // alt + XPLMGetDataf(adrXP[DR_PLANE_VVI]), // vs + (lastUsersPlanePos.IsOnGnd() ? '0' : '1'), // airborne + lastUsersPlanePos.heading(), lastUsersTrueAirspeed * KT_per_M_per_S, // hdg, spd + EXPORT_USER_CALL, // cs + userIcao, userReg, // type, tail, + lastUsersPlanePos.ts() - nanToZero(LTFlightData::fileExportTsBase)); // timestamp: if requested normalize timestamp in output + break; + + case EXP_FD_RTTFC: + snprintf(buf, sizeof(buf), + "RTTFC,%u,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,,,%.0f," + "%s,%s,%s,%.0f," + "%.1f,%.1f,-1,-1,%.0f,%.0f," // IAS, TAS, (Mach, track_rate), roll, mag_heading + "%.2f,%.0f,%s,%s," + "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1," // nav_qnh, nav_altitude_mcp, nav_altitude_fms, nav_heading, nav_modes, seen, rssi, winddir, windspd, OAT, TAT + "0,,\n", // isICAOhex + // equivalent to AITFC + modeS_ID, // hexid + lastUsersPlanePos.lat(), lastUsersPlanePos.lon(), // lat, lon + nanToZero(dataRefs.WeatherPressureAlt_ft(lastUsersPlanePos.alt_ft())), // baro_alt + XPLMGetDataf(adrXP[DR_PLANE_VVI]), // baro_rate + (lastUsersPlanePos.IsOnGnd() ? '1' : '0'), // gnd + lastUsersTrack, XPLMGetDataf(adrXP[DR_PLANE_GS]) * KT_per_M_per_S, // track, gsp + EXPORT_USER_CALL, // cs_icao + userIcao, userReg, // ac_type, ac_tailno + lastUsersPlanePos.ts() - nanToZero(LTFlightData::fileExportTsBase), // timestamp: if requested normalize timestamp in output + // additions by RTTFC + "XP", // source + EXPORT_USER_CALL, // cs_iata (copy of cs_icao) + "lt_export", // msg_type + nanToZero(lastUsersPlanePos.alt_ft()), // alt_geom + XPLMGetDataf(adrXP[DR_PLANE_KIAS]), // IAS + lastUsersTrueAirspeed * KT_per_M_per_S, // TAS + lastUsersPlanePos.roll(), // roll + XPLMGetDataf(adrXP[DR_PLANE_MAG_HEADING]), // mag_heading + lastUsersPlanePos.heading(), // true_heading + XPLMGetDataf(adrXP[DR_PLANE_VVI]), // geom_rate + "none", // emergency + ""); // category + break; + } + LTFlightData::ExportAddOutput((unsigned long)std::lround(lastUsersPlanePos.ts()), buf); } diff --git a/Src/LTFlightData.cpp b/Src/LTFlightData.cpp index 1e4c06d..e75f16f 100644 --- a/Src/LTFlightData.cpp +++ b/Src/LTFlightData.cpp @@ -1641,20 +1641,60 @@ void LTFlightData::ExportFD(const FDDynamicData& inDyn, return; // output a tracking data record - char buf[256]; - snprintf(buf, sizeof(buf), "AITFC,%lu,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,%s,%s,%.0f\n", - key().num, - pos.lat(), pos.lon(), - nanToZero(dataRefs.WeatherPressureAlt_ft(pos.alt_ft())), - inDyn.vsi, - (pos.IsOnGnd() ? '0' : '1'), - inDyn.heading, inDyn.spd, - statData.call.c_str(), - statData.acTypeIcao.c_str(), - statData.reg.c_str(), - statData.originAp.c_str(), - statData.destAp.c_str(), - pos.ts() - nanToZero(fileExportTsBase)); // if requested normalize timestamp in output + char buf[1024]; + switch (dataRefs.GetDebugExportFormat()) { + case EXP_FD_AITFC: + snprintf(buf, sizeof(buf), + "AITFC,%lu,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,%s,%s,%.0f\n", + key().num, // hexid + pos.lat(), pos.lon(), // lat, lon + nanToZero(dataRefs.WeatherPressureAlt_ft(pos.alt_ft())), // alt + inDyn.vsi, // vs + (pos.IsOnGnd() ? '0' : '1'), // airborne + inDyn.heading, inDyn.spd, // hdg,spd + statData.call.c_str(), // cs + statData.acTypeIcao.c_str(), // type + statData.reg.c_str(), // tail + statData.originAp.c_str(), // from + statData.destAp.c_str(), // to + pos.ts() - nanToZero(fileExportTsBase)); // timestamp: if requested normalize timestamp in output + break; + + case EXP_FD_RTTFC: + snprintf(buf, sizeof(buf), + "RTTFC,%lu,%.6f,%.6f,%.0f,%.0f,%c,%.0f,%.0f,%s,%s,%s,%s,%s,%.0f," + "%s,%s,%s,%.0f," + "-1,-1,-1,-1,-1,-1," // IAS, TAS, Mach, track_rate, roll, mag_heading + "%.2f,%.0f,%s,%s," + "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1," // nav_qnh, nav_altitude_mcp, nav_altitude_fms, nav_heading, nav_modes, seen, rssi, winddir, windspd, OAT, TAT + "%c,,\n", + // equivalent to AITFC + key().num, // hexid + pos.lat(), pos.lon(), // lat, lon + nanToZero(dataRefs.WeatherPressureAlt_ft(pos.alt_ft())), // baro_alt + inDyn.vsi, // baro_rate + (pos.IsOnGnd() ? '1' : '0'), // gnd + inDyn.heading, inDyn.spd, // track, gsp + statData.call.c_str(), // cs_icao + statData.acTypeIcao.c_str(), // ac_type + statData.reg.c_str(), // ac_tailno + statData.originAp.c_str(), // from_iata + statData.destAp.c_str(), // to_iata + pos.ts() - nanToZero(fileExportTsBase), // timestamp: if requested normalize timestamp in output + // additions by RTTFC + inDyn.pChannel ? inDyn.pChannel->ChName() : "LT", // source + statData.call.c_str(), // cs_iata (copy of cs_icao) + "lt_export", // msg_type + nanToZero(pos.alt_ft()), // alt_geom + // -- here follows a set of 6 fields we can't fill, they are set constant already in the format string, see above + pos.heading(), // true_heading + inDyn.vsi, // geom_rate + "none", // emergency + statData.isGrndVehicle() ? "C2" : "", // category + // -- here follows a set of 11 fields we can't fill, they are set constant already in the format string, see above + key().eKeyType == KEY_ICAO ? '1' : '0'); // isICAOhex + break; + } ExportAddOutput((unsigned long)std::lround(pos.ts()), buf); } diff --git a/Src/SettingsUI.cpp b/Src/SettingsUI.cpp index 51ed436..9164b5e 100644 --- a/Src/SettingsUI.cpp +++ b/Src/SettingsUI.cpp @@ -708,6 +708,13 @@ void LTSettingsUI::buildInterface() "Exports user's aircraft positions as tracking data to 'LTExportFD.csv'\nfor analysis or use by feeding scripts."); ImGui::FilteredCfgCheckbox("Export: Normalize Time", sFilter, DR_DBG_EXPORT_NORMALIZE_TS, "In each export file, have all timestamps start at zero.\nMakes it easier to combine data from different files later."); + if (ImGui::FilteredLabel("Export file format", sFilter)) { + if (ImGui::RadioButton("AITFC", dataRefs.GetDebugExportFormat() == EXP_FD_AITFC)) + dataRefs.SetDebugExportFormat(EXP_FD_AITFC); + ImGui::SameLine(); + if (ImGui::RadioButton("RTTFC", dataRefs.GetDebugExportFormat() == EXP_FD_RTTFC)) + dataRefs.SetDebugExportFormat(EXP_FD_RTTFC); + } if (!*sFilter) ImGui::TreePop(); } diff --git a/docs/readme.html b/docs/readme.html index 821e87d..0c25796 100755 --- a/docs/readme.html +++ b/docs/readme.html @@ -138,6 +138,7 @@

v3.0.0 X-Plane 12 Support

  • lin|mac|win_x64/LiveTraffic.xpl
  • Resources/Doc8643.txt
  • Resources/FlightModels.prf
  • +
  • Resources/SendTraffic.py
  • @@ -159,15 +160,18 @@

    v3.0.0 X-Plane 12 Support

    -
  • NEW #225 Option Basics > Cooperation > Hide all a/c in Replay.
  • - NEW #18 feature: Planes correct angle for wind, crab and de-crab for take-off/landing. - The wind considered is taken from current simulator's weather, ie. the same that affects your own aircraft, too. + NEW #225 option Basics > Cooperation > Hide all a/c in Replay + to have all aircraft hidden while X-Plane is in Replay mode.
  • - NEW #223 option + NEW #223 option Basics > Cooperation > Hide static objects to remove static objects like towers from all data streams where identifiable.
  • +
  • + NEW #18 feature: Planes correct angle for wind, crab and de-crab for take-off/landing. + The wind considered is taken from current simulator's weather, ie. the same that affects your own aircraft, too. +
  • General performance improvements, especially noticeable if many more aircraft are seen in the data than can be displayed. @@ -180,9 +184,17 @@

    v3.0.0 X-Plane 12 Support

  • RealTraffic: NEW #229 support for trafic info format "RTTFC" introduced with RT v9, - broadcasted on port 49005, becoming the default. - Older formats continue to work, too.
    - Port number for traffic data is now configurable in Settings > Input Channels > Realtraffic. + broadcasted on port 49005, becoming the default listening port. + Older formats continue to work, too, no matter the network port.
    + The network port LiveTraffic listens to is now configurable in Settings > Input Channels > RealTraffic. +
  • +
  • + The Export functionality + is also extended to support RealTraffic's RTTFC format: + There is a new setting Advanced > Export > Export file format + to choose between the previous AITFC and the new RTTFC format.
    + Use the updated Resources/SendTraffic.py to send + AITFC or RTTFC data back into LiveTraffic.
  • ADDED more potential Ground Vehicles to FlightModels.prf, thanks to @sawiczja and @larsras. From 0821c04ee4ae31eb1149693d6e9dc651e92f8709 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Sun, 19 Jun 2022 21:29:22 +0200 Subject: [PATCH 3/7] Remove ADSBEx Historic option --- Include/Constants.h | 2 - Include/DataRefs.h | 9 +- Include/LTADSBEx.h | 48 ---- Src/DataRefs.cpp | 168 ++----------- Src/LTADSBEx.cpp | 559 -------------------------------------------- Src/LTChannel.cpp | 27 +-- Src/LTMain.cpp | 2 +- 7 files changed, 29 insertions(+), 786 deletions(-) diff --git a/Include/Constants.h b/Include/Constants.h index 98c0b84..50ed5c7 100644 --- a/Include/Constants.h +++ b/Include/Constants.h @@ -166,11 +166,9 @@ constexpr const char* REMOTE_SIGNATURE = "TwinFan.plugin.XPMP2.Remote"; #define MSG_TIMESTAMPS "Current System time is %sZ, current simulated time is %s" #define MSG_AI_LOAD_ACF "Changing AI control: X-Plane is now loading AI Aircraft models..." #define MSG_REQUESTING_LIVE_FD "Requesting live flight data online..." -#define MSG_READING_HIST_FD "Reading historic flight data..." #define MSG_NUM_AC_INIT "Initially created %d aircraft" #define MSG_NUM_AC_ZERO "No more aircraft displayed" #define MSG_BUF_FILL_COUNTDOWN "Filling buffer: seeing %d aircraft, displaying %d, still %ds to buffer" -#define MSG_HIST_WITH_SYS_TIME "When using historic data you cannot run X-Plane with 'always track system time',\ninstead, choose the historic date in X-Plane's date/time settings." #define INFO_WEATHER_UPDATED "Weather updated: QNH %.f hPa at %s (%.2f / %.2f)" #define INFO_AC_ADDED "Added aircraft %s, operator '%s', a/c model '%s', flight model [%s], bearing %.0f, distance %.1fnm, from channel %s" #define INFO_AC_MDL_CHANGED "Changed CSL model for aircraft %s, operator '%s': a/c model now '%s' (Flight model '%s')" diff --git a/Include/DataRefs.h b/Include/DataRefs.h index 7cf87cf..98ca851 100644 --- a/Include/DataRefs.h +++ b/Include/DataRefs.h @@ -360,7 +360,6 @@ enum dataRefsLT { DR_CFG_LOG_LEVEL, DR_CFG_MSG_AREA_LEVEL, DR_CFG_LOG_LIST_LEN, - DR_CFG_USE_HISTORIC_DATA, DR_CFG_MAX_NUM_AC, DR_CFG_FD_STD_DISTANCE, DR_CFG_FD_SNAP_TAXI_DIST, @@ -625,7 +624,6 @@ class DataRefs std::string XPSystemPath; std::string LTPluginPath; // path to plugin directory std::string DirSeparator; - int bUseHistoricData = false; int bChannel[CNT_DR_CHANNELS]; // is channel enabled? double chTsOffset = 0.0f; // offset of network time compared to system clock int chTsOffsetCnt = 0; // how many offset reports contributed to the calculated average offset? @@ -803,7 +801,6 @@ class DataRefs std::string GetSimTimeString() const; // livetraffic/sim/date and .../time - static void LTSetSimDateTime(void* p, int i); static int LTGetSimDateTime(void* p); /// Are we in replay mode? @@ -824,10 +821,8 @@ class DataRefs inline logLevelTy GetLogLevel() { return iLogLevel; } inline logLevelTy GetMsgAreaLevel() { return iMsgAreaLevel; } - // livetraffic/cfg/use_historic_data: Simulate history - static void LTSetUseHistData(void*, int i); - bool SetUseHistData (bool bUseHistData, bool bForceReload); - inline bool GetUseHistData() const { return bUseHistoricData; } + /// Reinit data usage + void ForceDataReload (); // general config values static void LTSetCfgValue(void* p, int val); diff --git a/Include/LTADSBEx.h b/Include/LTADSBEx.h index 591b6d2..c5b8910 100644 --- a/Include/LTADSBEx.h +++ b/Include/LTADSBEx.h @@ -146,52 +146,4 @@ class ADSBExchangeConnection : public LTOnlineChannel, LTFlightDataChannel }; -//MARK: ADS-B Exchange (Historic) Constants -#define ADSBEX_HIST_NAME "ADS-B Exchange Historic" -constexpr int ADSBEX_HIST_MIN_CHARS = 20; // minimum nr chars per line to be a 'reasonable' line -constexpr int ADSBEX_HIST_MAX_ERR_CNT = 5; // after that many errorneous line we stop reading -#define ADSBEX_HIST_PATH "Custom Data/ADSB" // TODO : Move to options: relative to XP main -#define ADSBEX_HIST_PATH_2 "Custom Data/ADSB2" // TODO : Move to options: fallback, if first one doesn't work -#define ADSBEX_HIST_DATE_PATH "%c%04d-%02d-%02d" -#define ADSBEX_HIST_FILE_NAME "%c%04d-%02d-%02d-%02d%02dZ.json" -#define ADSBEX_HIST_PATH_EMPTY "Historic Data Path doesn't exist or folder empty at %s" -#define ADSBEX_HIST_TRY_FALLBACK "Trying fallback as primary Historic Data Path doesn't exist or folder empty at %s" -#define ADSBEX_HIST_FALLBACK_EMPTY "Also fallback Historic Data Path doesn't exist or folder empty at %s" -#define ADSBEX_HIST_FILE_ERR "Could not open historic file '%s': %s" -#define ADSBEX_HIST_READ_FILE "Reading from historic file %s" -#define ADSBEX_HIST_LN1_END "\"acList\":[" // end of first line -#define ADSBEX_HIST_LAT "\"Lat\":" // latitude tag -#define ADSBEX_HIST_LONG "\"Long\":" // longitude tag -#define ADSBEX_HIST_COS "\"Cos\":[" // start of short trails -#define ADSBEX_HIST_LAST_LN "]" // begin of last line -#define ADSBEX_HIST_LN1_UNEXPECT "First line doesn't look like hist file: %s" -#define ADSBEX_HIST_LN_ERROR "Error reading line %d of hist file %s" -#define ADSBEX_HIST_TRAIL_ERR "Trail data not quadrupels (%s @ %f)" -#define ADSBEX_HIST_START_FILE "START OF FILE " -#define ADSBEX_HIST_END_FILE "END OF FILE " - -// -//MARK: ADS-B Exchange Historical Data -// -class ADSBExchangeHistorical : public LTFileChannel, LTFlightDataChannel -{ - // helper type to select best receiver per a/c from multiple in one file - struct FDSelection - { - int quality; // quality value - std::string ln; // line of flight data from file - }; - - typedef std::map mapFDSelectionTy; - -public: - ADSBExchangeHistorical (std::string base = ADSBEX_HIST_PATH, - std::string fallback = ADSBEX_HIST_PATH_2); - virtual bool FetchAllData (const positionTy& pos); - virtual bool IsLiveFeed() const { return false; } - virtual LTChannelType GetChType() const { return CHT_TRACKING_DATA; } - virtual bool ProcessFetchedData (mapLTFlightDataTy& fdMap); -}; - - #endif /* LTADSBEx_h */ diff --git a/Src/DataRefs.cpp b/Src/DataRefs.cpp index 140f1d3..2f921b3 100644 --- a/Src/DataRefs.cpp +++ b/Src/DataRefs.cpp @@ -463,8 +463,8 @@ DataRefs::dataRefDefinitionT DATA_REFS_LT[CNT_DATAREFS_LT] = { {"livetraffic/bulk/quick", DataRefs::LTGetBulkAc, NULL, (void*)DR_AC_BULK_QUICK, false }, {"livetraffic/bulk/expensive", DataRefs::LTGetBulkAc, NULL, (void*)DR_AC_BULK_EXPENSIVE, false }, - {"livetraffic/sim/date", DataRefs::LTGetSimDateTime, DataRefs::LTSetSimDateTime, (void*)1, false }, - {"livetraffic/sim/time", DataRefs::LTGetSimDateTime, DataRefs::LTSetSimDateTime, (void*)2, false }, + {"livetraffic/sim/date", DataRefs::LTGetSimDateTime, NULL, (void*)1, false }, + {"livetraffic/sim/time", DataRefs::LTGetSimDateTime, NULL, (void*)2, false }, {"livetraffic/ver/nr", GetLTVerNum, NULL, NULL, false }, {"livetraffic/ver/date", GetLTVerDate, NULL, NULL, false }, @@ -490,7 +490,6 @@ DataRefs::dataRefDefinitionT DATA_REFS_LT[CNT_DATAREFS_LT] = { {"livetraffic/cfg/log_level", DataRefs::LTGetInt, DataRefs::LTSetLogLevel, GET_VAR, true }, {"livetraffic/cfg/msg_area_level", DataRefs::LTGetInt, DataRefs::LTSetLogLevel, GET_VAR, true }, {"livetraffic/cfg/log_list_len", DataRefs::LTGetInt, DataRefs::LTSetCfgValue, GET_VAR, true }, - {"livetraffic/cfg/use_historic_data", DataRefs::LTGetInt, DataRefs::LTSetUseHistData, GET_VAR, false }, {"livetraffic/cfg/max_num_ac", DataRefs::LTGetInt, DataRefs::LTSetCfgValue, GET_VAR, true, true }, {"livetraffic/cfg/fd_std_distance", DataRefs::LTGetInt, DataRefs::LTSetCfgValue, GET_VAR, true, true }, {"livetraffic/cfg/fd_snap_taxi_dist", DataRefs::LTGetInt, DataRefs::LTSetCfgValue, GET_VAR, true }, @@ -569,7 +568,6 @@ void* DataRefs::getVarAddr (dataRefsLT dr) case DR_CFG_LOG_LEVEL: return &iLogLevel; case DR_CFG_MSG_AREA_LEVEL: return &iMsgAreaLevel; case DR_CFG_LOG_LIST_LEN: return &logListLen; - case DR_CFG_USE_HISTORIC_DATA: return &bUseHistoricData; case DR_CFG_MAX_NUM_AC: return &maxNumAc; case DR_CFG_FD_STD_DISTANCE: return &fdStdDistance; case DR_CFG_FD_SNAP_TAXI_DIST: return &fdSnapTaxiDist; @@ -1373,83 +1371,20 @@ void DataRefs::ClearCameraAc(void*) /// Compute simulated time (seconds since Unix epoch, including fractionals) void DataRefs::UpdateSimTime() { - // using historic data means: we take the date configured in X-Plane's date&time settings - if ( bUseHistoricData ) - { - // cache parts of the calculation as the difficult part can only - // change at the full hour - static time_t cacheStartOfZuluDay = -1; - static int lastCalcZHour = -1; - static int lastLocalDateDays = -1; - - // current zulu time of day - double z = XPLMGetDataf(adrXP[DR_ZULU_TIME_SEC]); - // X-Plane's local date, expressed in days since January 1st - int localDateDays = XPLMGetDatai(adrXP[DR_LOCAL_DATE_DAYS]); - - // if the zulu hour or the date changed since last full calc then the full calc - // might change, so redo it once and cache the result - if (int(z/SEC_per_H) != lastCalcZHour || - localDateDays != lastLocalDateDays) - { - // challenge: Xp doesn't provide "ZuluDateDays". The UTC day might - // not be the same as the local day we get with GetLocalDateDays. - // So the approach is as follows: In reality, the time diff between - // local and zulu can't be more than 12 hours. - // So if the diff between local and zulu time appears greater than 12 hours - // we have to adjust the date by one day, which can happen into the past as well as - // into the future: - // l = local time - // z = zulu time - // 0 = local midnight - // d = z - l - // - // 1 -----0--l---z----- l < z, 0 < d <= 12 - // 2 -----0--z---l----- z < l, -12 <= d < 0 - // 3 --z--0---l-------- z > l, d > 12, z-day less than l-day - // 4 --l--0---z-------- l > z, d < -12, z-day greater than l-day - double l = XPLMGetDataf(adrXP[DR_LOCAL_TIME_SEC]); // local time in seconds - double d = z - l; // time doesn't move between the two calls within the same drawing frame so the diff is actually a multiple of hours (or at least minutes), but no fractional seconds - - // we only need to adapt d if abs(d) is greater than 12 hours - if ( d > 12 * SEC_per_H ) - localDateDays--; - else if ( d < -12 * SEC_per_H ) - localDateDays++; - - // calculate the right zulu day - cacheStartOfZuluDay = - // cater for year-wrap-around as X-Plane doesn't configure the year - (( localDateDays <= iTodaysDayOfYear ) ? tStartThisYear : tStartPrevYear) + - // add seconds for each completed day of that year - localDateDays * SEC_per_D; - - // the zulu hour/date we did the calculation for - lastCalcZHour = int(z / SEC_per_H); - lastLocalDateDays = localDateDays; - } - - // add current zulu time to start of zulu day - lastSimTime = cacheStartOfZuluDay + z; - } - else - { - // we use current system time (no matter what X-Plane simulates), - // but lagging behind by the buffering time - using namespace std::chrono; - lastSimTime = - // system time in seconds with fractionals - GetSysTime() - // minus the buffering time - - GetFdBufPeriod() + // we use current system time (no matter what X-Plane simulates), + // but lagging behind by the buffering time + using namespace std::chrono; + lastSimTime = + // system time in seconds with fractionals + GetSysTime() + // minus the buffering time + - GetFdBufPeriod() #ifdef DEBUG - // minus debugging delay - - fdBufDebug + // minus debugging delay + - fdBufDebug #endif - // plus the offset compared to network (this corrects for wrong system clock time as compared to reality) - + GetChTsOffset(); - } - + // plus the offset compared to network (this corrects for wrong system clock time as compared to reality) + + GetChTsOffset(); } // Current sim time as a human readable string, including 10th of seconds @@ -1458,49 +1393,6 @@ std::string DataRefs::GetSimTimeString() const return ts2string(GetSimTime()); } -// livetraffic/sim/date and .../time -void DataRefs::LTSetSimDateTime(void* p, int i) -{ - long bDateTime = (long)reinterpret_cast(p); - - // as we are setting a specific date/time we switch XP to "don't use system time" - dataRefs.SetUseSystemTime(false); - - // setting date? - if ( bDateTime == 1) { - // range check: if month/day only add _any_ year...doesn't matter (much) for day-of-year calc - if ( 0101 <= i && i <= 1231 ) - i += 20180000; - - // range check: 19000101 <= i <= 29991231 - if ( i < 19000101 || i > 29991231 ) return; - - // calculate days since beginning of year: mktime fills that field - std::tm tm; - memset (&tm, 0, sizeof(tm)); - tm.tm_year = i / 10000 - 1900; - tm.tm_mon = (i % 10000) / 100 - 1; - tm.tm_mday = i % 100; - tm.tm_hour = 12; // pretty safe re local time zone...not absolutely, though - mktime(&tm); - - // set the data ref for local_date_days to adjust X-Planes date immediately - dataRefs.SetLocalDateDays(tm.tm_yday); - } else { - // setting time, range check: 000000 <= i <= 235959 - if ( i < 0 || i > 235959 ) return; - - // seconds since midnight - int sec = i / 10000 * SEC_per_H + // hour - (i % 10000) / 100 * SEC_per_M + // minute - i % 100; - dataRefs.SetZuluTimeSec((float)sec); - } - - // finally, if we are not already using historic data switch to use it - // and force reloading all data - dataRefs.SetUseHistData(true, true); -} int DataRefs::LTGetSimDateTime(void* p) { @@ -1579,27 +1471,9 @@ void DataRefs::SetMsgAreaLevel ( int i ) else iMsgAreaLevel = logLevelTy(i); } -// switch usage of historic data -void DataRefs::LTSetUseHistData(void*, int useHistData) -{ - dataRefs.SetUseHistData(useHistData != 0, false); -} - // switch usage of historic data, return success -bool DataRefs::SetUseHistData (bool bUseHistData, bool bForceReload) +void DataRefs::ForceDataReload () { - // short-cut if no actual change...cause changing it is expensive - if ( !bForceReload && dataRefs.bUseHistoricData == (int)bUseHistData ) - return true; - - // change to historical data but running with system time? - if ( bUseHistData && - (XPLMGetDatai(adrXP[DR_USE_SYSTEM_TIME]) != 0) ) - { - SHOW_MSG(logERR, MSG_HIST_WITH_SYS_TIME); - return false; - } - // if we change this setting while running // we 'simulate' a re-initialization if (pluginState >= STATE_ENABLED) { @@ -1610,23 +1484,11 @@ bool DataRefs::SetUseHistData (bool bUseHistData, bool bForceReload) // disable myself / stop all connections LTMainDisable(); - // Now set the new setting - dataRefs.bUseHistoricData = bUseHistData; - // create the connections to flight data if ( LTMainEnable() ) { // display aircraft (if that was the case previously) dataRefs.SetAircraftDisplayed(bShowAc); - return true; } - else { - return false; - } - } - else { - // not yet running, i.e. init phase: just set the value - dataRefs.bUseHistoricData = bUseHistData; - return true; } } diff --git a/Src/LTADSBEx.cpp b/Src/LTADSBEx.cpp index 857d48d..3925fa6 100644 --- a/Src/LTADSBEx.cpp +++ b/Src/LTADSBEx.cpp @@ -534,562 +534,3 @@ size_t ADSBExchangeConnection::DoTestADSBExAPIKeyCB (char *ptr, size_t, size_t n // all consumed return nmemb; } - -// -//MARK: ADS-B Exchange Historical Data -// -ADSBExchangeHistorical::ADSBExchangeHistorical (std::string base, - std::string fallback ) : -LTChannel(DR_CHANNEL_ADSB_EXCHANGE_HISTORIC, ADSBEX_HIST_NAME), -LTFileChannel(), -LTFlightDataChannel() -{ - // determine full path (might be local to XP System Path) - pathBase = LTCalcFullPath(base); - // must contain _something_ - if ( LTNumFilesInPath (pathBase) < 1) { - // first path didn't work, try fallback - if ( !fallback.empty() ) { - SHOW_MSG(logWARN,ADSBEX_HIST_TRY_FALLBACK,pathBase.c_str()); - // determine full path (might be local to XP System Path) - pathBase = LTCalcFullPath(fallback); - // must contain _something_ - if ( LTNumFilesInPath (pathBase) < 1) { - SetValid(false,false); - SHOW_MSG(logERR,ADSBEX_HIST_FALLBACK_EMPTY,pathBase.c_str()); - } else { - SetValid(true); - } - } else { - // there is no fallback...so that's it - SetValid(false,false); - SHOW_MSG(logERR,ADSBEX_HIST_PATH_EMPTY,pathBase.c_str()); - } - } else { - // found something in the primary path, good! - SetValid(true); - } -} - -// reads ADS-B data from historical files into the buffer 'fileData'. -// ADS-B provides one file per minute of the day (UTC) -// https://www.adsbexchange.com/data/ -bool ADSBExchangeHistorical::FetchAllData (const positionTy& pos) -{ - // save last path verified to minimize I/O - std::string lastCheckedPath; - - // the bounding box: only aircraft in this box are considered - boundingBoxTy box (pos, dataRefs.GetFdStdDistance_m()); - - // simulated "now" in full minutes UTC - time_t now = stripSecs(dataRefs.GetSimTime()); - - // first-time read? - if ( !zuluLastRead ) - zuluLastRead = now; - else { - // make sure we don't read too much... - // if for whatever reason we haven't had time to read files in the past 5 minutes - zuluLastRead = std::max(zuluLastRead, - now - 5 * SEC_per_M); - } - - // Loop over files until 1 minutes ahead of (current sim time + regular buffering) - for (time_t until = now + (dataRefs.GetFdBufPeriod() + SEC_per_M); - zuluLastRead <= until; - zuluLastRead += SEC_per_M) // increase by one minute per iteration - { - // put together path and file name - char sz[50]; - struct tm tm_val; - gmtime_s(&tm_val, &zuluLastRead); - snprintf(sz,sizeof(sz),ADSBEX_HIST_DATE_PATH, - dataRefs.GetDirSeparator()[0], - tm_val.tm_year + 1900, - tm_val.tm_mon + 1, - tm_val.tm_mday); - std::string pathDate = pathBase + sz; - - // check path, if not the same as last iteration - if ((pathDate != lastCheckedPath) && - (LTNumFilesInPath(pathDate) < 1)) { - SetValid(false,false); - SHOW_MSG(logERR,ADSBEX_HIST_PATH_EMPTY,pathDate.c_str()); - return false; - } else { - lastCheckedPath = pathDate; // path good, don't check again - } - - // add hour-based file name - snprintf(sz,sizeof(sz),ADSBEX_HIST_FILE_NAME, - dataRefs.GetDirSeparator()[0], - tm_val.tm_year + 1900, - tm_val.tm_mon + 1, - tm_val.tm_mday, - tm_val.tm_hour, tm_val.tm_min); - pathDate += sz; - - // open the file - std::ifstream f(pathDate); - if ( !f ) { // couldn't open - char sErr[SERR_LEN]; - strerror_s(sErr, sizeof(sErr), errno); - SHOW_MSG(logERR,ADSBEX_HIST_FILE_ERR,pathDate.c_str(),sErr); - IncErrCnt(); - return false; - } - LOG_MSG(logINFO,ADSBEX_HIST_READ_FILE,pathDate.c_str()); - - // read the first line, which is expected to end with "acList":[ - char lnBuf[5000]; // lines with positional data can get really long... - f.getline(lnBuf,sizeof(lnBuf)); - if (!f || f.gcount() < ADSBEX_HIST_MIN_CHARS || - !strstr(lnBuf,ADSBEX_HIST_LN1_END)) - { - // no significant number of chars read or end of line unexpected - SHOW_MSG(logERR,ADSBEX_HIST_LN1_UNEXPECT,pathDate.c_str()); - IncErrCnt(); - return false; - } - - // store a start-of-file indicator - listFd.emplace_back(std::string(ADSBEX_HIST_START_FILE) + sz); - - // now loop over the positional lines - int cntErr = 0; // count errors to bail out if file too bad - - // we make use of the apparent fact that the hist files - // contain one aircraft per line. We decide here already if the line - // is relevant to us (based on position falling into our bounding box) - // as we don't want to run 22 MB through the JSON parser in memory - for ( int i = 2; f.good() && !f.eof(); i++ ) { - // read a fresh line from the filex - lnBuf[0]=0; - f.getline(lnBuf,sizeof(lnBuf)); - - // just ignore the last line, this is closing line or even empty - if ( f.eof() || strstr(lnBuf,ADSBEX_HIST_LAST_LN) == lnBuf) - break; - - // otherwise it shoud contain reasonable info - if ( !f || - f.gcount() < ADSBEX_HIST_MIN_CHARS || - !strchr (lnBuf,'{') // should also contain '{' - ) { - // no significant number of chars read, looks invalid, skip - SHOW_MSG(logWARN,ADSBEX_HIST_LN_ERROR,i,pathDate.c_str()); - if (++cntErr > ADSBEX_HIST_MAX_ERR_CNT) { - // this file is too bad...skip rest - IncErrCnt(); - break; - } - continue; - } - - // there are occasionally lines starting with the comma - // (which is supposed to be at the end of the line) - // remove that comma, otherwise the line is no valid JSON by itself - if (lnBuf[0] != '{') - memmove(lnBuf,strchr(lnBuf,'{'),strlen(strchr(lnBuf,'{'))+1); - - // there are two good places for positional info: - // tags Lat/Long or the trail after tag Cos - positionTy acPos; - const char* pLat = strstr(lnBuf,ADSBEX_HIST_LAT); - const char* pLong = strstr(lnBuf,ADSBEX_HIST_LONG); - const char* pCos = strstr(lnBuf,ADSBEX_HIST_COS); - if ( pLat && pLong ) { // found Lat/Long tags - pLat += strlen(ADSBEX_HIST_LAT); - pLong += strlen(ADSBEX_HIST_LONG); - acPos.lat() = atof(pLat); - acPos.lon() = atof(pLong); - } else if ( pCos ) { // only found trails? (rare...) - pCos += strlen(ADSBEX_HIST_COS); // move to _after_ [ - // there follow: lat, lon, time, alt, lat, lon, time, alt... - // we take the first lat/lon - acPos.lat() = atof(pCos); - // move on to lat - after the comma - pCos = strchr(pCos,','); - if ( !pCos ) { // no comma is _not_ valid, - SHOW_MSG(logWARN,ADSBEX_HIST_LN_ERROR,i,pathDate.c_str()); - if (++cntErr > ADSBEX_HIST_MAX_ERR_CNT) { - // this file is too bad...skip rest - IncErrCnt(); - break; - } - continue; - } - acPos.lon() = atof(++pCos); - } else // no positional info... - continue; // valid but useless for our purposes -> ignore line - - // if the position is within the bounding box then we save for later -#ifdef DEBUG - std::string dbg (acPos.dbgTxt()); - dbg += " in "; - dbg += box; -#endif - if ( box.contains(acPos) ) - listFd.emplace_back(lnBuf); - } - - // store an end-of-file indicator - listFd.emplace_back(std::string(ADSBEX_HIST_END_FILE) + sz); - - // close the file - f.close(); - } - - // Success - return true; -} - - -bool ADSBExchangeHistorical::ProcessFetchedData (mapLTFlightDataTy& fdMap) -{ - // We need to calculate distance to current camera later on - const positionTy viewPos = dataRefs.GetViewPos(); - - // any a/c filter defined for debugging purposes? - std::string acFilter ( dataRefs.GetDebugAcFilter() ); - - // data is expected in listFd, one line per flight data - // iterate the lines - for (std::list::iterator lnIter = listFd.begin(); - lnIter != listFd.end(); - ++lnIter) - { - // must be a start-of-file indicator - LOG_ASSERT(lnIter->find(ADSBEX_HIST_START_FILE) == 0); - - // *** Per a/c select just one best receiver, discard other lines *** - // Reason is that despite any attempts of smoothening the flight path - // when combining multiple receivers there still are spikes causing - // zig zag routes or sudden up/down movement. - // So instead of trying to combine the data from multiple lines - // (=receivers) for one a/c we _select_ one of these lines and only - // work with that one line. - mapFDSelectionTy selMap; // selected lines of current file - - // loop over flight data lines of current file - for (++lnIter; - lnIter != listFd.end() && lnIter->find(ADSBEX_HIST_END_FILE) == std::string::npos; - ++lnIter) - { - // the line as read from the historic file - std::string& ln = *lnIter; - - // each individual line should work as a JSON object - JSON_Value* pRoot = json_parse_string(ln.c_str()); - if (!pRoot) { LOG_MSG(logERR,ERR_JSON_PARSE); IncErrCnt(); return false; } - JSON_Object* pJAc = json_object(pRoot); - if (!pJAc) { LOG_MSG(logERR,ERR_JSON_MAIN_OBJECT); IncErrCnt(); return false; } - - // the key: transponder Icao code - LTFlightData::FDKeyTy fdKey (LTFlightData::KEY_ICAO, - jog_s(pJAc, ADSBEX_TRANSP_ICAO)); - - // not matching a/c filter? -> skip it - if (!acFilter.empty() && (fdKey != acFilter)) - { - json_value_free (pRoot); - continue; - } - - // the receiver we are dealing with right now - int rcvr = (int)jog_l(pJAc, ADSBEX_RCVR); - - // variables we need for quality indicator calculation - int sig = (int)jog_l(pJAc, ADSBEX_SIG); - JSON_Array* pCosList = json_object_get_array(pJAc, ADSBEX_COS); - int cosCount = int(json_array_get_count(pCosList)/4); - - // quality is made up of signal level, number of elements of the trail - int qual = (sig + cosCount); - - // and we award the currently used receiver a 50% award: we value to - // stay with the same receiver minute after minute (file-to-file) - // as this is more likely to avoid spikes when connection this - // minute's trail with last minute's trail - - - - mapLTFlightDataTy::iterator fdIter = fdMap.find(fdKey); - if ( fdIter != fdMap.end() && fdIter->second.GetRcvr() == rcvr ) { - qual *= 3; - qual /= 2; - } - - // did we find another line for this a/c earlier in this file? - mapFDSelectionTy::iterator selIter = selMap.find(fdKey.key); - - // if so we have to compare qualities, the better one survives - if ( selIter != selMap.end() ) - { - // now...is quality better than the earlier line(s) in the file? - if ( qual > selIter->second.quality ) { - // replace the content, _move_ the line here...we don't need copies - selIter->second.quality = qual; - selIter->second.ln = std::move(ln); - } - } else { - // first time we see this a/c in this file -> add to map - selMap.emplace(std::make_pair(fdKey.key, FDSelection {qual, std::move(ln)} )); - } - - // done with interpreting this line - json_value_free (pRoot); - - } // loop over lines of current files - - // now we only process the selected lines in order to actually - // add flight data to our processing - for ( mapFDSelectionTy::value_type selVal: selMap ) - { - // each individual line should work as a JSON object - JSON_Value* pRoot = json_parse_string(selVal.second.ln.c_str()); - if (!pRoot) { LOG_MSG(logERR,ERR_JSON_PARSE); IncErrCnt(); return false; } - JSON_Object* pJAc = json_object(pRoot); - if (!pJAc) { LOG_MSG(logERR,ERR_JSON_MAIN_OBJECT); IncErrCnt(); return false; } - - try { - // from here on access to fdMap guarded by a mutex - // until FD object is inserted and updated - std::unique_lock mapFdLock (mapFdMutex); - - // get the fd object from the map, key is the transpIcao - // this fetches an existing or, if not existing, creates a new one - LTFlightData::FDKeyTy fdKey (LTFlightData::KEY_ICAO, - selVal.first); - LTFlightData& fd = fdMap[fdKey]; - - // also get the data access lock once and for all - // so following fetch/update calls only make quick recursive calls - std::lock_guard fdLock (fd.dataAccessMutex); - // now that we have the detail lock we can release the global one - mapFdLock.unlock(); - - // completely new? fill key fields - if ( fd.empty() ) - fd.SetKey(fdKey); - - // fill static - LTFlightData::FDStaticData stat; - stat.reg = jog_s(pJAc, ADSBEX_REG); - stat.country = jog_s(pJAc, ADSBEX_COUNTRY); - stat.acTypeIcao = jog_s(pJAc, ADSBEX_AC_TYPE_ICAO); - stat.mil = jog_sb(pJAc, ADSBEX_MIL); - stat.trt = transpTy(jog_sl(pJAc,ADSBEX_TRT)); - stat.opIcao = jog_s(pJAc, ADSBEX_OP_ICAO); - stat.call = jog_s(pJAc, ADSBEX_CALL); - - // dynamic data - LTFlightData::FDDynamicData dyn; - - // ADS-B returns Java tics, that is milliseconds, we use seconds - double posTime = jog_n(pJAc, ADSBEX_POS_TIME) / 1000.0; - - // non-positional dynamic data - dyn.radar.code = jog_sl(pJAc, ADSBEX_RADAR_CODE); - dyn.gnd = jog_sb(pJAc, ADSBEX_GND); - dyn.heading = jog_sn_nan(pJAc, ADSBEX_HEADING); - dyn.spd = jog_sn(pJAc, ADSBEX_SPD); - dyn.vsi = jog_sn(pJAc, ADSBEX_VSI); - dyn.ts = posTime; - dyn.pChannel = this; - - // altitude, if airborne - const double alt_ft = dyn.gnd ? NAN : jog_sn_nan(pJAc, ADSBEX_ELEVATION); - - // position data, including short trails - positionTy mainPos (jog_sn_nan(pJAc, ADSBEX_LAT), - jog_sn_nan(pJAc, ADSBEX_LON), - // ADSB data is feet, positionTy expects meter - alt_ft * M_per_FT, - posTime, - dyn.heading); - - // Update flight data - fd.UpdateData(std::move(stat), mainPos.dist(viewPos)); - - fd.AddDynData(dyn, - (int)jog_sl(pJAc, ADSBEX_RCVR), - (int)jog_sl(pJAc, ADSBEX_SIG)); - - // position is kinda important...we continue only with valid data - if ( mainPos.isNormal() ) - { - // we need a good take on the ground status of mainPos - // for later landing detection - mainPos.f.onGrnd = dyn.gnd ? GND_ON : GND_OFF; - - // FIXME: Called from outside main thread, - // can produce wrong terrain alt (2 cases here) - // Probably: Just add positions and let updated - // AppendNewPos / CalcNewPos do the job of landing detection - fd.TryDeriveGrndStatus(mainPos); - - // Short Trails ("Cos" array), if available - bool bAddedTrails = false; - dequePositionTy trails; - JSON_Array* pCosList = json_object_get_array(pJAc, ADSBEX_COS); - - // short-cut: if we are in the air then skip adding trails - // they might be good on the ground...in the air the - // positions can be too inaccurate causing jumps in speed, vsi, heading etc... - if (mainPos.f.onGrnd == GND_OFF) - pCosList = NULL; - - // found trails and there are at least 2 quadrupels, i.e. really a "trail" not just a single pos? - if (json_array_get_count(pCosList) >= 8) { - if (json_array_get_count(pCosList) % 4 == 0) // trails should be made of quadrupels - // iterate trail data in form of quadrupels (lat,lon,timestamp,alt): - for (size_t i=0; i< json_array_get_count(pCosList); i += 4) { - trails.emplace_back(json_array_get_number(pCosList, i), // latitude - json_array_get_number(pCosList, i+1), // longitude - json_array_get_number(pCosList, i+3) * M_per_FT, // altitude (convert to meter) - json_array_get_number(pCosList, i+2) / 1000.0); // timestamp (convert form ms to s) - // only keep new trail if it is a valid position - const positionTy& addedTrail = trails.back(); - if ( !addedTrail.isNormal() ) { - LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),addedTrail.dbgTxt().c_str()); - trails.pop_back(); // otherwise remove right away - } - } - else - LOG_MSG(logERR,ADSBEX_HIST_TRAIL_ERR,fdKey.c_str(),posTime); - } - - // if we did find enough trails work on them - if ( trails.size() >= 2 ) { - // ideally, the main position should have the exact same timestamp - // as the last trail item and a similar altitude (+/- 500m) - positionTy& lastTrail = trails.back(); -#ifdef DEBUG - std::string dbgMain(mainPos.dbgTxt()); - std::string dbgLast(lastTrail.dbgTxt()); -#endif - if (mainPos.hasSimilarTS(lastTrail) && - (std::abs(mainPos.alt_m() - lastTrail.alt_m()) < 500)) - { - // reason we check this is: altitude data in the trails - // seems to always be a multiple of 500ft, which would mean - // that even during climb/decend the plane would do - // kinda "step climbs" of 500ft, which looks unrealistic. - // Altitude in the main position is exact though. - // We take that main altitude for the last trail quadrupel: - lastTrail.alt_m() = mainPos.alt_m(); - - // Now we look into our already known positions for the - // last known position before mainPos - // and calculate a smooth climb/descend path between the two: - const dequePositionTy& posList = fd.GetPosDeque(); -#ifdef DEBUG - std::string dbgPosList(positionDeque2String(posList)); -#endif - dequePositionTy::const_iterator iBef = - positionDequeFindBefore(posList, mainPos.ts() - SIMILAR_TS_INTVL); - // if we find an earlier position we take that as reference, - // otherwise we fall back to the first trails element: - const positionTy& refPos = iBef == posList.end() ? - trails.front() : *iBef; - - // *** Landing Detection *** - // Issue: Altitude of trails is untrustworthy, - // but reliable main positions are historically - // available only every 60 seconds. - // During Final/Landing that might be too long: - // Imagine last position is 30m above ground, - // but 60 seconds later only we can touch down? That's a looooong flare... - // So: We try determining this case and then - // replace altitude with VSI-based calculation. - if (!refPos.IsOnGnd() && mainPos.IsOnGnd()) - { - // aircraft model to use - const LTAircraft::FlightModel& mdl = - LTAircraft::FlightModel::FindFlightModel(fd); - - // this is the Landing case - // we look for the VSI of the last two already - // known off-ground positions, one is refPos - const double vsiBef = - // is there an even earlier pos before refPos in the list? - iBef != posList.begin() ? - std::prev(iBef)->between(refPos).vsi : // take the vsi between these two - mdl.VSI_FINAL * Ms_per_FTm; // no, assume reasonable vsi - - const double vsiDirectMain = refPos.vsi_m(mainPos); - - if (vsiBef < -(mdl.VSI_STABLE * Ms_per_FTm) && vsiBef < vsiDirectMain) - { - // reasonable negative VSI, which is less (steeper) than direct way down to mainPos - for(positionTy& posIter: trails) { - // calc altitude based on vsiBef, as soon as we touch ground it will be normalized to terrain altitude - posIter.alt_m() = refPos.alt_m() + vsiBef * (posIter.ts()-refPos.ts()); - posIter.f.onGrnd = GND_UNKNOWN; - fd.TryDeriveGrndStatus(posIter); - // only add pos if not off ground - // (see above: airborne we don't want too many positions) - if (posIter.f.onGrnd != GND_OFF) - fd.AddNewPos(posIter); - } - - // we added trails, don't add any more - bAddedTrails = true; - } - } - - // didn't add anything yet? - // (this includes the standard non-landing case - // and the landing case in which we couldn't determine VSI) - if (!bAddedTrails) - { - // this is the non-landing case - // adapt all altitudes to form a smooth path - // from refPos to mainPos - // and add the altered position to our known positions - const double altDiff = lastTrail.alt_m() - refPos.alt_m(); - const double tsDiff = lastTrail.ts() - refPos.ts(); - - // only valid if there is _any_ timestamp difference between first and last trail pos - // there _should_ be...but sometimes there simply isn't - if ( tsDiff > 0 ) { - for(positionTy& posIter: trails) { - posIter.alt_m() = refPos.alt_m() + altDiff * (posIter.ts()-refPos.ts()) / tsDiff; - posIter.f.onGrnd = GND_UNKNOWN; - fd.AddNewPos(posIter); - } - bAddedTrails = true; - } - } -#ifdef DEBUG - dbgPosList = positionDeque2String(posList); -#endif - } - } - - // if we didn't add the trails then just add the main position - if (!bAddedTrails) { - // no trails (or just one pos): we just add the main position - fd.AddNewPos(mainPos); - } - } - else { - LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),mainPos.dbgTxt().c_str()); - } - } catch(const std::system_error& e) { - LOG_MSG(logERR, ERR_LOCK_ERROR, "mapFd", e.what()); - } - - // cleanup JSON - json_value_free (pRoot); - } // for all _selected_ lines of an input file - - } // for all input files - - // list is processed - listFd.clear(); - return true; -} - diff --git a/Src/LTChannel.cpp b/Src/LTChannel.cpp index ad5e9cd..6027b6e 100644 --- a/Src/LTChannel.cpp +++ b/Src/LTChannel.cpp @@ -659,21 +659,17 @@ bool LTFlightDataEnable() { // create list of flight and master data connections listFDC.clear(); - if ( dataRefs.GetUseHistData() ) { - // load historic data readers - listFDC.emplace_back(new ADSBExchangeHistorical); - } else { - // load live feed readers (in order of priority) - listFDC.emplace_back(new RealTrafficConnection(mapFd)); - listFDC.emplace_back(new OpenSkyConnection); - listFDC.emplace_back(new ADSBExchangeConnection); - listFDC.emplace_back(new OpenGliderConnection); - listFDC.emplace_back(new FSCConnection); - // load online master data connections - listFDC.emplace_back(new OpenSkyAcMasterdata); - // load other channels - listFDC.emplace_back(new ForeFlightSender(mapFd)); - } + + // load live feed readers (in order of priority) + listFDC.emplace_back(new RealTrafficConnection(mapFd)); + listFDC.emplace_back(new OpenSkyConnection); + listFDC.emplace_back(new ADSBExchangeConnection); + listFDC.emplace_back(new OpenGliderConnection); + listFDC.emplace_back(new FSCConnection); + // load online master data connections + listFDC.emplace_back(new OpenSkyAcMasterdata); + // load other channels + listFDC.emplace_back(new ForeFlightSender(mapFd)); // Success only if there are still connections left return listFDC.size() > 0; @@ -802,7 +798,6 @@ bool LTFlightDataShowAircraft() // tell the user we do something in the background SHOW_MSG(logINFO, - dataRefs.GetUseHistData() ? MSG_READING_HIST_FD : MSG_REQUESTING_LIVE_FD); // flag for: as soon as data arrives start buffer countdown diff --git a/Src/LTMain.cpp b/Src/LTMain.cpp index 49d5c63..2274330 100644 --- a/Src/LTMain.cpp +++ b/Src/LTMain.cpp @@ -725,7 +725,7 @@ float LoopCBAircraftMaintenance (float inElapsedSinceLastCall, float, int, void* if (dataRefs.IsReInitAll()) { // force an initialization SHOW_MSG(logWARN, MSG_REINIT) - dataRefs.SetUseHistData(dataRefs.GetUseHistData(), true); + dataRefs.ForceDataReload(); // and reset the re-init flag dataRefs.SetReInitAll(false); // Log a new timestamp From 633e97ff3e6a93405add378b35abc18f1a4005b6 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Wed, 22 Jun 2022 22:51:18 +0200 Subject: [PATCH 4/7] ADSBEx v2 format, direct API --- .../REST/ADSBExchange_20180402_1955_UTC.json | 817 ------------------ Data/ADSB/REST/ADSBExchange_v2.json | 470 ++++++++++ Include/DataRefs.h | 3 + Include/LTADSBEx.h | 48 +- Include/LTFlightData.h | 13 +- Src/LTADSBEx.cpp | 212 +++-- Src/LTFlightData.cpp | 7 +- Src/LTOpenSky.cpp | 1 - docs/readme.html | 7 +- 9 files changed, 627 insertions(+), 951 deletions(-) delete mode 100644 Data/ADSB/REST/ADSBExchange_20180402_1955_UTC.json create mode 100644 Data/ADSB/REST/ADSBExchange_v2.json diff --git a/Data/ADSB/REST/ADSBExchange_20180402_1955_UTC.json b/Data/ADSB/REST/ADSBExchange_20180402_1955_UTC.json deleted file mode 100644 index 70f66fa..0000000 --- a/Data/ADSB/REST/ADSBExchange_20180402_1955_UTC.json +++ /dev/null @@ -1,817 +0,0 @@ -{ - "acList": [ - { - "Alt": 35050, - "AltT": 0, - "Bad": false, - "Brng": 114.1, - "CMsgs": 519, - "CNum": "2621", - "Call": "ASL10P", - "CallSus": false, - "Cou": "Serbia", - "Dst": 18.27, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524252768600)/", - "FlightsCount": 0, - "From": "EHAM Amsterdam Airport Schiphol, Netherlands", - "GAlt": 35248, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "4C01E2", - "Id": 4981218, - "InHg": 30.11811, - "Interested": false, - "Lat": 51.337299, - "Long": 7.17918, - "Man": "Airbus", - "Mdl": "Airbus A319 131", - "Mil": false, - "Mlat": false, - "Op": "Air Serbia", - "OpIcao": "ASL", - "PosTime": 1524254089709, - "Rcvr": 1, - "Reg": "YU-APC", - "Spd": 442.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "0142", - "TSecs": 1325, - "Tisb": false, - "To": "LYBE Belgrade Nikola Tesla, Belgrad, Serbia", - "Trak": 133.8, - "TrkH": false, - "Trt": 2, - "Type": "A319", - "Vsi": 1536, - "VsiT": 0, - "WTC": 2, - "Year": "2005" - }, - { - "Alt": 9750, - "AltT": 0, - "Bad": false, - "Brng": 138.9, - "CMsgs": 1148, - "CNum": "7256", - "Call": "DLH1HC", - "CallSus": false, - "Cou": "Germany", - "Dst": 21.73, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524251573209)/", - "FlightsCount": 0, - "GAlt": 9738, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Help": false, - "Icao": "3C66B8", - "Id": 3958456, - "InHg": 29.9080849, - "Interested": false, - "Lat": 51.257366, - "Long": 7.144623, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Lufthansa", - "OpIcao": "DLH", - "PosTime": 1524254093272, - "Rcvr": 1, - "Reg": "D-AIUX", - "Sig": 25, - "Spd": 233.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TAlt": 8992, - "TSecs": 2520, - "Tisb": false, - "Trak": 237.3, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": -1088, - "VsiT": 1, - "WTC": 2, - "Year": "2016" - }, - { - "Alt": 10600, - "AltT": 0, - "Bad": false, - "Brng": 339.7, - "CMsgs": 1269, - "CNum": "1988", - "Call": "EWG3TP", - "CallSus": false, - "Cou": "Austria", - "Dst": 10.79, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524251380241)/", - "FlightsCount": 0, - "GAlt": 10828, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Icao": "44094E", - "Id": 4458830, - "InHg": 30.1476383, - "Interested": false, - "Lat": 51.495806, - "Long": 6.885223, - "Man": "Airbus", - "Mdl": "Airbus A321 211", - "Mil": false, - "Mlat": false, - "Op": "Niki", - "OpIcao": "NLY", - "PosTime": 1524254093272, - "Rcvr": 1, - "Reg": "OE-LCG", - "Sig": 5, - "Spd": 262.7, - "SpdTyp": 0, - "Species": 1, - "Sqk": "", - "TSecs": 2713, - "Tisb": false, - "Trak": 55.7, - "TrkH": false, - "Trt": 2, - "Type": "A321", - "Vsi": -832, - "VsiT": 0, - "WTC": 2, - "Year": "2003" - }, - { - "Alt": 5500, - "AltT": 0, - "Bad": false, - "Brng": 67.1, - "CMsgs": 1461, - "CNum": "19000266", - "Call": "AFR1106", - "CallSus": true, - "Cou": "France", - "Dst": 17.84, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524251059100)/", - "FlightsCount": 0, - "From": "LFPG Charles de Gaulle, Paris, France", - "GAlt": 5698, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "398567", - "Id": 3769703, - "InHg": 30.11811, - "Interested": false, - "Lat": 51.46699, - "Long": 7.176437, - "Man": "Embraer", - "Mdl": "Embraer EMB-190 STD", - "Mil": false, - "Mlat": true, - "Op": "Hop!", - "OpIcao": "HOP", - "PosTime": 1524254093272, - "Rcvr": 1, - "Reg": "F-HBLH", - "Spd": 257.1, - "SpdTyp": 0, - "Species": 1, - "Sqk": "6033", - "TSecs": 3034, - "Tisb": false, - "To": "EDDL D\u00fcsseldorf, Germany", - "Trak": 187.1, - "TrkH": false, - "Trt": 2, - "Type": "E190", - "Vsi": -1344, - "VsiT": 0, - "WTC": 2, - "Year": "2009" - }, - { - "Alt": 8000, - "AltT": 0, - "Bad": false, - "Brng": 181.7, - "CMsgs": 1425, - "CNum": "7615", - "Call": "EWG48A", - "CallSus": false, - "Cou": "Germany", - "Dst": 15.24, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524250020460)/", - "FlightsCount": 0, - "GAlt": 7988, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Help": false, - "Icao": "3C56F7", - "Id": 3954423, - "InHg": 29.9080849, - "Interested": false, - "Lat": 51.267746, - "Long": 6.93267, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Eurowings", - "OpIcao": "EWG", - "PosTime": 1524254088178, - "Rcvr": 1, - "Reg": "D-AEWW", - "Sig": 131, - "Spd": 254.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "3452", - "TAlt": 8000, - "TSecs": 4073, - "TTrk": 54.84375, - "Tisb": false, - "Trak": 88.9, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": 0, - "VsiT": 1, - "WTC": 2, - "Year": "2017" - }, - { - "Alt": 1875, - "AltT": 0, - "Bad": false, - "Brng": 190.6, - "CMsgs": 2000, - "CNum": "4231", - "Call": "EWG36E", - "CallSus": true, - "Cou": "Germany", - "Dst": 4.85, - "EngMount": 0, - "EngType": 2, - "Engines": "2", - "FSeen": "/Date(1524249812929)/", - "FlightsCount": 0, - "From": "LOWW Vienna, Austria", - "GAlt": 2073, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "3C4A23", - "Id": 3951139, - "InHg": 30.11811, - "Interested": false, - "Lat": 51.3619, - "Long": 6.9263, - "Man": "Bombardier", - "Mdl": "Bombardier DHC-8 402", - "Mil": false, - "Mlat": false, - "Op": "Air Berlin", - "OpIcao": "BER", - "PosTime": 1524254088178, - "Rcvr": 1, - "Reg": "D-ABQC", - "Spd": 178.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TSecs": 4281, - "Tisb": false, - "To": "EDDL D\u00fcsseldorf, Germany", - "Trak": 231.0, - "TrkH": false, - "Trt": 2, - "Type": "DH8D", - "Vsi": -977, - "VsiT": 0, - "WTC": 2, - "Year": "2008" - }, - { - "Alt": 425, - "AltT": 0, - "Bad": false, - "Brng": 219.6, - "CMsgs": 2085, - "CNum": "4333", - "Call": "BEE1CY", - "CallSus": false, - "Cou": "United Kingdom", - "Dst": 13.86, - "EngMount": 0, - "EngType": 2, - "Engines": "2", - "FSeen": "/Date(1524249632804)/", - "FlightsCount": 0, - "From": "EIKN Ireland West Knock, Charleston, Ireland", - "GAlt": 653, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "406D98", - "Id": 4222360, - "InHg": 30.1476383, - "Interested": false, - "Lat": 51.308713, - "Long": 6.811981, - "Man": "Bombardier", - "Mdl": "Bombardier DHC-8 402 NG", - "Mil": false, - "Mlat": true, - "Op": "Flybe", - "OpIcao": "BEE", - "PosTime": 1524253989959, - "Rcvr": 1, - "Reg": "G-PRPB", - "Spd": 107.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "2230", - "TSecs": 4461, - "Tisb": false, - "To": "EGPH Edinburgh, United Kingdom", - "Trak": 232.6, - "TrkH": false, - "Trt": 2, - "Type": "DH8D", - "Vsi": -576, - "VsiT": 0, - "WTC": 2, - "Year": "2010" - }, - { - "Alt": 12200, - "AltT": 0, - "Bad": false, - "Brng": 219.9, - "CMsgs": 2056, - "CNum": "4245", - "Call": "EWG7MU", - "CallSus": true, - "Cou": "Germany", - "Dst": 14.05, - "EngMount": 0, - "EngType": 2, - "Engines": "2", - "FSeen": "/Date(1524249614585)/", - "FlightsCount": 0, - "GAlt": 12428, - "Gnd": true, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "3C4A26", - "Id": 3951142, - "InHg": 30.1476383, - "Interested": false, - "Lat": 51.307701, - "Long": 6.8096, - "Man": "Bombardier", - "Mdl": "Bombardier DHC-8 402", - "Mil": false, - "Mlat": false, - "Op": "Air Berlin", - "OpIcao": "BER", - "PosTime": 1524254033771, - "Rcvr": 1, - "Reg": "D-ABQF", - "Spd": 130.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TSecs": 4479, - "Tisb": false, - "Trak": 233.0, - "TrkH": false, - "Trt": 2, - "Type": "DH8D", - "Vsi": -665, - "VsiT": 1, - "WTC": 2, - "Year": "2009" - }, - { - "Alt": 8000, - "AltT": 0, - "Bad": false, - "Brng": 221.1, - "CMsgs": 2325, - "CNum": "7545", - "Call": "EWG9N", - "CallSus": false, - "Cou": "Germany", - "Dst": 15.7, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524248267913)/", - "FlightsCount": 0, - "From": "EDDL D\u00fcsseldorf, Germany", - "GAlt": 8224, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Help": false, - "Icao": "3C56F6", - "Id": 3954422, - "InHg": 30.1443272, - "Interested": false, - "Lat": 51.298191, - "Long": 6.790848, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Eurowings", - "OpIcao": "EWG", - "PosStale": true, - "PosTime": 1524253379615, - "Rcvr": 1, - "Reg": "D-AEWV", - "Sig": 4, - "Spd": 134.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "3452", - "TAlt": 4000, - "TSecs": 5826, - "TTrk": 269.296875, - "Tisb": false, - "To": "EDDT Berlin-Tegel, Berlin, Germany", - "Trak": 232.3, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": -704, - "VsiT": 0, - "WTC": 2, - "Year": "2016" - }, - { - "Alt": 9400, - "AltT": 0, - "Bad": false, - "Brng": 28.8, - "CMsgs": 2350, - "CNum": "7259", - "Call": "EWG6LW", - "CallSus": false, - "Cou": "Germany", - "Dst": 21.91, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524247816178)/", - "FlightsCount": 0, - "GAlt": 9628, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "3C56ED", - "Id": 3954413, - "InHg": 30.1476383, - "Interested": false, - "Lat": 51.577423, - "Long": 7.091749, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Eurowings", - "OpIcao": "EWG", - "PosTime": 1524254093256, - "Rcvr": 1, - "Reg": "D-AEWM", - "Spd": 270.5, - "SpdTyp": 0, - "Species": 1, - "Sqk": "5522", - "TAlt": 8992, - "TSecs": 6277, - "TTrk": 49.921875, - "Tisb": false, - "Trak": 51.6, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": -960, - "VsiT": 1, - "WTC": 2, - "Year": "2016" - }, - { - "Alt": 5300, - "AltT": 0, - "Bad": false, - "Brng": 243.0, - "CMsgs": 2056, - "CNum": "4126", - "Call": "BEE3TV", - "CallSus": false, - "Cou": "United Kingdom", - "Dst": 20.94, - "EngMount": 0, - "EngType": 2, - "Engines": "2", - "FSeen": "/Date(1524247751694)/", - "FlightsCount": 0, - "From": "EGPH Edinburgh, United Kingdom", - "GAlt": 5528, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "400E8C", - "Id": 4198028, - "InHg": 30.1476383, - "Interested": false, - "Lat": 51.318901, - "Long": 6.6708, - "Man": "Bombardier", - "Mdl": "Bombardier DHC-8 402", - "Mil": false, - "Mlat": false, - "Op": "Flybe", - "OpIcao": "BEE", - "PosTime": 1524254078022, - "Rcvr": 1, - "Reg": "G-JECO", - "Spd": 190.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "2515", - "TSecs": 6342, - "Tisb": false, - "To": "EGLC London City, United Kingdom", - "Trak": 359.0, - "TrkH": false, - "Trt": 2, - "Type": "DH8D", - "Vsi": 1785, - "VsiT": 0, - "WTC": 2, - "Year": "2006" - }, - { - "Alt": 7025, - "AltT": 0, - "Bad": false, - "Brng": 62.1, - "CMsgs": 3224, - "CNum": "3093", - "Call": "EWG74T", - "CallSus": false, - "Cou": "Germany", - "Dst": 24.82, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524244819788)/", - "FlightsCount": 0, - "GAlt": 7223, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Help": false, - "Icao": "3C4890", - "Id": 3950736, - "InHg": 30.11811, - "Interested": false, - "Lat": 51.508667, - "Long": 7.256173, - "Man": "Airbus", - "Mdl": "Airbus A320 214", - "Mil": false, - "Mlat": false, - "Op": "Air Berlin", - "OpIcao": "EWG", - "PosTime": 1524254093240, - "Rcvr": 1, - "Reg": "D-ABDP", - "Sig": 9, - "Spd": 238.5, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TSecs": 9274, - "Tisb": false, - "Trak": 257.7, - "TrkH": false, - "Trt": 2, - "Type": "A320", - "Vsi": 0, - "VsiT": 0, - "WTC": 2, - "Year": "2007" - }, - { - "Alt": 2825, - "AltT": 0, - "Bad": false, - "Brng": 83.6, - "CMsgs": 3817, - "CNum": "7653", - "Call": "AFL2436", - "CallSus": false, - "Cou": "United Kingdom", - "Dst": 6.28, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524243337696)/", - "FlightsCount": 0, - "From": "UUEE Sheremetyevo, Moscow, Russia", - "GAlt": 2813, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "42434B", - "Id": 4342603, - "InHg": 29.9080849, - "Interested": false, - "Lat": 51.411072, - "Long": 7.029172, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Aeroflot Russian Airlines", - "OpIcao": "AFL", - "PosTime": 1524254093240, - "Rcvr": 1, - "Reg": "VP-BFH", - "Spd": 225.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TAlt": 8992, - "TSecs": 10756, - "Tisb": false, - "To": "EDDL D\u00fcsseldorf, Germany", - "Trak": 233.1, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": -320, - "VsiT": 1, - "WTC": 2, - "Year": "2017" - }, - { - "Alt": 675, - "AltT": 0, - "Bad": false, - "Brng": 217.6, - "CMsgs": 4600, - "CNum": "7393", - "Call": "EWG7KM", - "CallSus": false, - "Cou": "Germany", - "Dst": 12.19, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524240851914)/", - "FlightsCount": 0, - "GAlt": 899, - "Gnd": false, - "HasPic": false, - "HasSig": false, - "Help": false, - "Icao": "3C56EE", - "Id": 3954414, - "InHg": 30.1443272, - "Interested": false, - "Lat": 51.317883, - "Long": 6.832199, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Eurowings", - "OpIcao": "EWG", - "PosTime": 1524254093240, - "Rcvr": 1, - "Reg": "D-AEWN", - "Spd": 140.0, - "SpdTyp": 0, - "Species": 1, - "Sqk": "1000", - "TAlt": 4000, - "TSecs": 13242, - "TTrk": 270.0, - "Tisb": false, - "Trak": 233.1, - "TrkH": false, - "Trt": 5, - "Type": "A320", - "Vsi": -768, - "VsiT": 0, - "WTC": 2, - "Year": "2016" - }, - { - "Alt": 7975, - "AltT": 0, - "Bad": false, - "Brng": 36.9, - "CMsgs": 5263, - "CNum": "5557", - "Call": "EWG9PM", - "CallSus": false, - "Cou": "Germany", - "Dst": 22.73, - "EngMount": 0, - "EngType": 3, - "Engines": "2", - "FSeen": "/Date(1524238183460)/", - "FlightsCount": 0, - "GAlt": 8144, - "Gnd": false, - "HasPic": false, - "HasSig": true, - "Help": false, - "Icao": "3C6753", - "Id": 3958611, - "InHg": 30.088583, - "Interested": false, - "Lat": 51.568055, - "Long": 7.136765, - "Man": "Airbus", - "Mdl": "Airbus A320 214SL", - "Mil": false, - "Mlat": false, - "Op": "Eurowings", - "OpIcao": "EWG", - "PosTime": 1524254093240, - "Rcvr": 1, - "Reg": "D-AIZS", - "Sig": 49, - "Spd": 255.2, - "SpdTyp": 0, - "Species": 1, - "Sqk": "3515", - "TSecs": 15910, - "Tisb": false, - "Trak": 57.0, - "TrkH": false, - "Trt": 2, - "Type": "A320", - "Vsi": -320, - "VsiT": 0, - "WTC": 2, - "Year": "2013" - } - ], - "feeds": [ - { - "id": 1, - "name": "From Consolidator", - "polarPlot": false - } - ], - "flgH": 20, - "flgW": 85, - "lastDv": "636597901424941466", - "showFlg": true, - "showPic": true, - "showSil": true, - "shtTrlSec": 65, - "src": 1, - "srcFeed": 1, - "stm": 1524254093928, - "totalAc": 8561 -} diff --git a/Data/ADSB/REST/ADSBExchange_v2.json b/Data/ADSB/REST/ADSBExchange_v2.json new file mode 100644 index 0000000..9ca6277 --- /dev/null +++ b/Data/ADSB/REST/ADSBExchange_v2.json @@ -0,0 +1,470 @@ +{"ac":[ +{"hex":"a20c6d","type":"adsb_icao","flight":"N231CD ","r":"N231CD","t":"SR20","alt_baro":5500,"alt_geom":5675,"gs":140.7,"track":140.77,"baro_rate":0,"geom_rate":0,"squawk":"4642","emergency":"none","category":"A1","lat":34.747879,"lon":-120.051587,"nic":9,"rc":75,"seen_pos":0.375,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":229792,"seen":0.2,"rssi":-13.0,"dst":96.022,"dir":300.8}, +{"hex":"a437b8","type":"adsb_icao","flight":"N371CD ","r":"N371CD","t":"SR22","alt_baro":4825,"alt_geom":4925,"gs":106.0,"track":111.00,"baro_rate":960,"geom_rate":896,"squawk":"1200","emergency":"none","category":"A1","lat":34.563826,"lon":-119.993649,"nic":9,"rc":75,"seen_pos":0.321,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":80568,"seen":0.2,"rssi":-8.0,"dst":88.410,"dir":295.5}, +{"hex":"a0f4c1","type":"adsb_icao","flight":"N1605M ","r":"N1605M","t":"T210","alt_baro":7025,"alt_geom":7275,"gs":152.2,"track":132.60,"baro_rate":0,"geom_rate":0,"squawk":"6370","emergency":"none","category":"A1","lat":34.670896,"lon":-119.985466,"nic":9,"rc":75,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":375377,"seen":0.3,"rssi":-7.9,"dst":90.920,"dir":299.3}, +{"hex":"c04fff","type":"adsb_icao","flight":"ACA599 ","r":"C-GEHQ","t":"B38M","alt_baro":36000,"alt_geom":37200,"gs":479.8,"ias":261,"tas":456,"mach":0.788,"wd":201,"ws":55,"oat":-53,"tat":-25,"track":319.90,"track_rate":0.00,"roll":0.18,"mag_heading":301.64,"true_heading":313.77,"baro_rate":64,"geom_rate":-128,"squawk":"6757","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":36000,"nav_altitude_fms":36000,"nav_heading":300.94,"lat":34.934894,"lon":-119.969616,"nic":8,"rc":186,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21009973,"seen":0.1,"rssi":-2.0,"dst":98.818,"dir":307.6}, +{"hex":"a29fab","type":"adsr_icao","flight":"N2684T ","r":"N2684T","t":"P28A","alt_baro":3500,"alt_geom":3600,"gs":66.7,"track":102.99,"baro_rate":64,"squawk":"4730","emergency":"none","category":"A1","lat":34.381165,"lon":-119.962071,"nic":0,"rc":0,"seen_pos":0.135,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2651017,"seen":0.1,"rssi":-21.1,"dst":82.944,"dir":289.1}, +{"hex":"a3cf82","type":"adsb_icao","flight":"N3447L ","r":"N3447L","t":"T206","alt_baro":3900,"alt_geom":3850,"gs":64.6,"track":98.00,"baro_rate":384,"geom_rate":320,"squawk":"1200","emergency":"none","category":"A1","lat":34.575211,"lon":-119.940547,"nic":9,"rc":75,"seen_pos":0.119,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":182795,"seen":0.1,"rssi":-4.8,"dst":86.326,"dir":296.7}, +{"hex":"a6a7ee","type":"adsb_icao","flight":"N528PC ","r":"N528PC","alt_baro":"ground","gs":11.2,"mag_heading":239.06,"true_heading":251.09,"squawk":"4732","emergency":"none","category":"A1","lat":34.431117,"lon":-119.838467,"nic":9,"rc":75,"seen_pos":0.556,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1313684,"seen":0.6,"rssi":-12.9,"dst":78.211,"dir":292.6}, +{"hex":"a83f45","type":"adsb_icao","flight":"N630RT ","r":"N630RT","t":"DA62","alt_baro":"ground","gs":2.2,"true_heading":163.12,"squawk":"4753","emergency":"none","category":"A1","lat":34.421185,"lon":-119.836401,"nic":9,"rc":75,"seen_pos":0.321,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":756569,"seen":0.2,"rssi":-4.0,"dst":77.897,"dir":292.2}, +{"hex":"a00560","type":"adsr_icao","flight":"N100GX ","r":"N100GX","t":"G150","dbFlags":8,"alt_baro":"ground","gs":0.0,"squawk":"5712","emergency":"none","category":"A2","lat":34.432800,"lon":-119.835266,"nic":0,"rc":0,"seen_pos":2.551,"sil_type":"perhour","mlat":[],"tisb":[],"messages":331329,"seen":0.9,"rssi":-10.2,"dst":78.101,"dir":292.7}, +{"hex":"a65cce","type":"adsb_icao","flight":"EJA509 ","r":"N509QS","t":"C68A","alt_baro":"ground","gs":0.0,"true_heading":253.12,"squawk":"1200","emergency":"none","category":"A2","lat":34.432770,"lon":-119.834776,"nic":9,"rc":75,"seen_pos":26.774,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":8175213,"seen":13.0,"rssi":-11.4,"dst":78.078,"dir":292.7}, +{"hex":"~29890b","type":"tisb_trackfile","alt_baro":5600,"gs":59.0,"track":116.13,"geom_rate":0,"lat":34.478531,"lon":-119.696213,"nic":0,"rc":0,"seen_pos":0.308,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":76720,"seen":0.1,"rssi":-2.0,"dst":72.918,"dir":296.7}, +{"hex":"abfcda","type":"adsb_icao","flight":"SWA304 ","r":"N8713M","t":"B38M","alt_baro":35000,"alt_geom":36325,"gs":503.8,"ias":268,"tas":458,"mach":0.788,"wd":216,"ws":58,"oat":-51,"tat":-23,"track":71.60,"track_rate":0.03,"roll":0.18,"mag_heading":63.98,"true_heading":75.78,"baro_rate":0,"geom_rate":-32,"squawk":"7247","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":35008,"nav_altitude_fms":35008,"nav_heading":63.28,"lat":33.625938,"lon":-119.557858,"nic":8,"rc":186,"seen_pos":0.563,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":14171169,"seen":0.0,"rssi":-21.1,"dst":61.725,"dir":252.5}, +{"hex":"ab34bb","type":"adsb_icao","flight":"N821BR ","r":"N821BR","t":"DA42","alt_baro":8550,"alt_geom":8850,"gs":161.0,"track":301.02,"baro_rate":0,"squawk":"7736","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":8512,"lat":34.462509,"lon":-119.543582,"nic":9,"rc":75,"seen_pos":0.232,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3571146,"seen":0.0,"rssi":-5.4,"dst":65.751,"dir":298.8}, +{"hex":"a59ae1","type":"adsb_icao","flight":"N460PA ","r":"N460PA","t":"E120","alt_baro":1875,"alt_geom":1775,"gs":121.3,"track":188.53,"baro_rate":-448,"squawk":"0471","emergency":"none","category":"A1","lat":33.295303,"lon":-119.483295,"nic":8,"rc":186,"seen_pos":0.434,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2371080,"seen":0.4,"rssi":-15.1,"dst":67.383,"dir":235.3}, +{"hex":"a1de04","type":"adsr_icao","flight":"N2195M ","r":"N2195M","t":"P28B","alt_baro":1500,"alt_geom":1425,"gs":107.5,"track":108.43,"baro_rate":192,"squawk":"4735","emergency":"none","category":"A1","lat":34.381073,"lon":-119.476206,"nic":0,"rc":0,"seen_pos":6.060,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":278496,"seen":5.9,"rssi":-24.9,"dst":60.561,"dir":296.2}, +{"hex":"ab050f","type":"adsb_icao","flight":"UAL1218 ","r":"N809UA","t":"A319","alt_baro":25100,"alt_geom":26175,"gs":404.4,"ias":279,"tas":412,"mach":0.672,"wd":202,"ws":37,"oat":-26,"tat":-3,"track":120.62,"track_rate":-0.06,"roll":-0.53,"mag_heading":114.08,"true_heading":125.90,"baro_rate":-2048,"geom_rate":-2048,"squawk":"6365","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":4992,"lat":33.883209,"lon":-119.402833,"nic":8,"rc":186,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24659194,"seen":0.2,"rssi":-12.8,"dst":51.077,"dir":266.5}, +{"hex":"a17140","type":"adsb_icao","flight":"SKW3385 ","r":"N192SY","t":"E75L","alt_baro":24050,"alt_geom":25000,"gs":362.0,"ias":271,"tas":392,"mach":0.640,"wd":174,"ws":34,"oat":-26,"tat":-6,"track":143.76,"track_rate":-0.06,"roll":0.00,"mag_heading":134.12,"true_heading":146.10,"baro_rate":-1024,"geom_rate":-992,"squawk":"3345","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":6016,"nav_altitude_fms":23008,"nav_modes":["autopilot","vnav","tcas"],"lat":34.744030,"lon":-119.323139,"nic":8,"rc":186,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22094178,"seen":0.0,"rssi":-4.3,"dst":67.210,"dir":316.2}, +{"hex":"ac97c1","type":"adsb_icao","flight":"N910MC ","r":"N910MC","t":"EPIC","alt_baro":6475,"alt_geom":6675,"gs":236.7,"track":265.64,"baro_rate":1216,"geom_rate":1216,"squawk":"4654","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":11008,"lat":34.250995,"lon":-119.320793,"nic":9,"rc":75,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":143167,"seen":0.0,"rssi":-5.4,"dst":50.367,"dir":292.0}, +{"hex":"a148fc","type":"adsr_icao","flight":"N182KA ","r":"N182KA","t":"C182","alt_baro":7500,"alt_geom":7725,"gs":111.0,"track":125.84,"geom_rate":-64,"category":"A1","lat":35.221097,"lon":-119.312382,"nic":7,"rc":371,"seen_pos":0.767,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":163127,"seen":0.5,"rssi":-6.4,"dst":89.677,"dir":329.3}, +{"hex":"a3f7a7","type":"adsb_icao","flight":"N355CW ","r":"N355CW","t":"T206","alt_baro":3750,"alt_geom":3750,"gs":109.1,"track":297.27,"baro_rate":512,"geom_rate":512,"squawk":"4740","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":6496,"lat":34.288239,"lon":-119.250930,"nic":9,"rc":75,"seen_pos":0.231,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":392507,"seen":0.1,"rssi":-7.0,"dst":48.080,"dir":296.0}, +{"hex":"acad84","type":"adsb_icao","flight":"N916FT ","r":"N916FT","t":"C172","alt_baro":3625,"alt_geom":3650,"gs":63.5,"track":56.56,"baro_rate":-512,"squawk":"0272","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":4000,"nav_heading":82.97,"nav_modes":[],"lat":35.320633,"lon":-119.213505,"nic":9,"rc":75,"seen_pos":0.233,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6795191,"seen":0.1,"rssi":-6.4,"dst":92.566,"dir":333.8}, +{"hex":"a1fb1a","type":"adsb_icao","flight":"ATN3511 ","r":"N227AZ","t":"B763","alt_baro":32000,"alt_geom":33175,"gs":422.6,"ias":289,"tas":470,"mach":0.796,"wd":211,"ws":49,"oat":-44,"tat":-14,"track":227.59,"track_rate":0.00,"roll":0.18,"mag_heading":214.28,"true_heading":225.83,"baro_rate":0,"geom_rate":0,"squawk":"5773","emergency":"none","category":"A5","nav_qnh":1013.6,"nav_altitude_mcp":32000,"nav_heading":213.75,"lat":32.780270,"lon":-119.198465,"nic":8,"rc":186,"seen_pos":0.183,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18317777,"seen":0.1,"rssi":-13.8,"dst":80.819,"dir":210.7}, +{"hex":"a5e20a","type":"adsr_icao","flight":"N4786P ","r":"N4786P","t":"C152","alt_baro":300,"alt_geom":300,"gs":56.4,"track":244.80,"geom_rate":-1600,"category":"A1","lat":34.201538,"lon":-119.186806,"nic":0,"rc":0,"seen_pos":0.080,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3434157,"seen":0.0,"rssi":-6.1,"dst":43.091,"dir":291.6}, +{"hex":"3c4582","type":"adsb_icao","flight":"BOX498 ","r":"D-AALB","t":"B77L","alt_baro":21575,"alt_geom":22500,"gs":369.3,"ias":278,"tas":390,"mach":0.628,"wd":183,"ws":25,"oat":-19,"tat":1,"track":144.59,"roll":0.18,"mag_heading":135.00,"true_heading":146.92,"baro_rate":-1984,"geom_rate":-1952,"squawk":"1744","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":16000,"nav_heading":135.70,"lat":34.577978,"lon":-119.179058,"nic":8,"rc":186,"seen_pos":0.084,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":19918991,"seen":0.1,"rssi":-14.6,"dst":55.137,"dir":314.2}, +{"hex":"a86e85","type":"adsb_icao","flight":"ASA1373 ","r":"N642VA","t":"A320","alt_baro":28800,"alt_geom":29950,"gs":491.4,"ias":286,"tas":442,"mach":0.736,"wd":198,"ws":61,"oat":-36,"tat":-10,"track":343.45,"track_rate":0.00,"roll":0.18,"mag_heading":326.95,"true_heading":339.03,"baro_rate":832,"geom_rate":512,"squawk":"2432","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":34016,"lat":35.432236,"lon":-119.146214,"nic":8,"rc":186,"seen_pos":0.233,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":19634922,"seen":0.0,"rssi":-3.7,"dst":97.261,"dir":337.3}, +{"hex":"a969ac","type":"adsr_icao","flight":"N7051R ","r":"N7051R","t":"P28A","alt_baro":3600,"alt_geom":3625,"gs":102.8,"track":100.65,"geom_rate":-64,"category":"A1","lat":35.345438,"lon":-119.130892,"nic":8,"rc":186,"seen_pos":39.106,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":205783,"seen":39.1,"rssi":-7.3,"dst":92.183,"dir":336.5}, +{"hex":"a6daf4","type":"adsb_icao","flight":"N5405A ","r":"N5405A","t":"P210","alt_baro":900,"alt_geom":775,"gs":97.5,"track":321.25,"baro_rate":640,"geom_rate":704,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":2496,"nav_heading":274.92,"lat":34.218613,"lon":-119.119767,"nic":9,"rc":75,"seen_pos":0.347,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":989589,"seen":0.1,"rssi":-6.2,"dst":40.415,"dir":294.7}, +{"hex":"aa9bcb","type":"adsb_icao","flight":"N783BG ","r":"N783BG","t":"C172","alt_baro":"ground","alt_geom":175,"gs":9.8,"track":137.81,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":34.211449,"lon":-119.095273,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","baro_rate","geom_rate"],"messages":4703049,"seen":0.0,"rssi":-17.5,"dst":39.130,"dir":294.8}, +{"hex":"a8a320","type":"adsb_icao","flight":"N656BC ","r":"N656BC","t":"DA40","alt_baro":50,"alt_geom":-50,"gs":43.0,"track":271.33,"baro_rate":256,"geom_rate":0,"squawk":"0406","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":1696,"lat":34.213753,"lon":-119.088993,"nic":9,"rc":75,"seen_pos":0.791,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2321597,"seen":0.2,"rssi":-19.2,"dst":38.904,"dir":295.2}, +{"hex":"a78647","type":"adsb_icao","flight":"N584RM ","r":"N584RM","t":"BE58","alt_baro":"ground","gs":0.0,"mag_heading":303.75,"true_heading":315.59,"category":"A1","lat":34.212229,"lon":-119.084172,"nic":9,"rc":75,"seen_pos":2.712,"version":1,"nac_p":9,"sil":2,"sil_type":"unknown","mlat":[],"tisb":[],"messages":188,"seen":0.4,"rssi":-17.4,"dst":38.648,"dir":295.2}, +{"hex":"a9b3fb","type":"adsb_icao","flight":"N724SC ","r":"N724SC","t":"ULAC","alt_baro":700,"alt_geom":500,"gs":63.0,"track":269.09,"baro_rate":-256,"geom_rate":-256,"squawk":"1200","emergency":"none","category":"A1","lat":34.213614,"lon":-119.054432,"nic":8,"rc":186,"seen_pos":0.027,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":6171511,"seen":0.0,"rssi":-12.5,"dst":37.350,"dir":296.3}, +{"hex":"a2c43e","type":"adsb_icao","flight":"ASA585 ","r":"N278AK","t":"B739","alt_baro":27750,"alt_geom":28850,"gs":488.3,"ias":292,"tas":444,"mach":0.736,"wd":186,"ws":48,"oat":-33,"tat":-8,"track":341.49,"track_rate":0.47,"roll":12.30,"mag_heading":323.44,"true_heading":335.45,"baro_rate":1280,"geom_rate":1216,"squawk":"1063","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":32000,"nav_heading":338.91,"lat":35.195075,"lon":-119.052086,"nic":8,"rc":186,"seen_pos":0.288,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":25650228,"seen":0.1,"rssi":-6.5,"dst":82.364,"dir":336.4}, +{"hex":"a34de0","type":"adsb_icao","flight":"N3117L ","r":"N3117L","t":"PA44","dbFlags":8,"alt_baro":1100,"alt_geom":1025,"gs":97.2,"track":23.66,"baro_rate":-192,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A1","lat":34.201355,"lon":-119.036697,"nic":10,"rc":25,"seen_pos":0.027,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":400634,"seen":0.0,"rssi":-15.3,"dst":36.237,"dir":295.9}, +{"hex":"48436a","type":"adsb_icao","flight":"KLM603 ","r":"PH-BQC","t":"B772","alt_baro":16975,"alt_geom":17725,"gs":339.3,"ias":277,"tas":368,"mach":0.580,"oat":-8,"tat":10,"track":144.72,"roll":0.88,"mag_heading":134.82,"true_heading":146.69,"baro_rate":-1664,"geom_rate":-1696,"squawk":"6042","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":14016,"nav_heading":135.00,"lat":34.383017,"lon":-119.007740,"nic":8,"rc":186,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":14152203,"seen":0.0,"rssi":-12.0,"dst":40.994,"dir":310.6}, +{"hex":"a15054","type":"adsb_icao","flight":"N184JD ","r":"N184JD","t":"P28A","alt_baro":4500,"alt_geom":4475,"gs":88.5,"track":131.79,"baro_rate":-64,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","lat":34.127306,"lon":-118.970032,"nic":9,"rc":75,"seen_pos":0.231,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":94715,"seen":0.1,"rssi":-9.2,"dst":31.440,"dir":291.1}, +{"hex":"a67c03","type":"adsb_icao","flight":"LXJ517 ","r":"N517FX","t":"CL30","alt_baro":45050,"alt_geom":46475,"gs":448.9,"ias":217,"tas":466,"mach":0.808,"wd":166,"ws":16,"oat":-54,"tat":-25,"track":158.98,"roll":-1.05,"mag_heading":147.30,"true_heading":159.27,"baro_rate":192,"geom_rate":0,"squawk":"1642","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":44992,"nav_heading":145.55,"lat":35.095184,"lon":-118.964669,"nic":8,"rc":186,"seen_pos":0.434,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7178292,"seen":0.0,"rssi":-9.1,"dst":75.155,"dir":337.5}, +{"hex":"aa6209","type":"adsb_icao","flight":"N7683H ","r":"N7683H","t":"R22","alt_baro":1500,"alt_geom":1375,"gs":67.9,"track":99.32,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","lat":34.198717,"lon":-118.917904,"nic":9,"rc":75,"seen_pos":0.183,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":566489,"seen":0.1,"rssi":-7.1,"dst":30.939,"dir":300.3}, +{"hex":"86e474","type":"adsb_icao","flight":"JAL15 ","r":"JA865J","t":"B789","alt_baro":10700,"alt_geom":11075,"gs":330.2,"track":272.08,"geom_rate":1024,"squawk":"2414","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":23008,"nav_heading":257.34,"nav_modes":["autopilot","vnav","lnav","tcas"],"lat":33.918612,"lon":-118.893642,"nic":8,"rc":186,"seen_pos":0.375,"version":2,"nic_baro":1,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":10470873,"seen":0.0,"rssi":-8.5,"dst":25.618,"dir":267.3}, +{"hex":"a9ed8f","type":"adsr_icao","flight":"N739MB ","r":"N739MB","t":"C172","alt_baro":4400,"alt_geom":4550,"gs":100.6,"track":6.28,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":34.256628,"lon":-118.887005,"nic":0,"rc":0,"seen_pos":0.197,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":407795,"seen":0.1,"rssi":-14.0,"dst":31.576,"dir":307.2}, +{"hex":"a6681d","type":"adsb_icao","flight":"N5114U ","r":"N5114U","t":"C72R","alt_baro":3550,"alt_geom":3450,"gs":108.0,"track":88.94,"baro_rate":0,"geom_rate":0,"squawk":"4633","emergency":"none","category":"A1","lat":34.291260,"lon":-118.886420,"nic":9,"rc":75,"seen_pos":0.027,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":161697,"seen":0.0,"rssi":-5.5,"dst":32.845,"dir":310.1}, +{"hex":"a4d80e","type":"adsb_icao","flight":"N411CE ","r":"N411CE","t":"B429","alt_baro":1950,"alt_geom":1900,"gs":37.8,"track":52.52,"baro_rate":512,"geom_rate":448,"squawk":"1200","emergency":"none","category":"A7","lat":34.337722,"lon":-118.886375,"nic":9,"rc":75,"seen_pos":0.523,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":271030,"seen":0.0,"rssi":-12.0,"dst":34.696,"dir":313.7}, +{"hex":"a3313b","type":"adsb_icao","flight":"N3045F ","r":"N3045F","t":"C182","alt_baro":5450,"alt_geom":5575,"gs":102.8,"track":97.26,"baro_rate":-384,"geom_rate":-256,"squawk":"4620","emergency":"none","category":"A1","lat":34.275063,"lon":-118.884258,"nic":9,"rc":75,"seen_pos":0.308,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":231090,"seen":0.0,"rssi":-6.0,"dst":32.147,"dir":308.9}, +{"hex":"aa9e04","type":"adsb_icao","flight":"SWA2466 ","r":"N7830A","t":"B737","alt_baro":25925,"alt_geom":27050,"gs":384.4,"track":151.23,"baro_rate":-2240,"squawk":"3311","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":4000,"nav_heading":144.14,"lat":34.286049,"lon":-118.883514,"nic":8,"rc":186,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":23902348,"seen":0.0,"rssi":-7.4,"dst":32.534,"dir":309.9}, +{"hex":"a4c4ec","type":"adsb_icao","flight":"SWA247 ","r":"N406WN","t":"B737","alt_baro":38025,"alt_geom":39350,"gs":497.4,"ias":250,"tas":456,"mach":0.792,"wd":207,"ws":69,"oat":-55,"tat":-27,"track":337.04,"track_rate":0.00,"roll":0.00,"mag_heading":318.52,"true_heading":330.45,"baro_rate":0,"geom_rate":-96,"squawk":"7626","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":38016,"nav_altitude_fms":38000,"nav_heading":317.11,"lat":35.035080,"lon":-118.871902,"nic":8,"rc":186,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21007991,"seen":0.1,"rssi":-8.6,"dst":70.119,"dir":339.8}, +{"hex":"ac4818","type":"adsb_icao","flight":"N8903C ","r":"N8903C","t":"P28A","alt_baro":4650,"alt_geom":4700,"gs":73.0,"track":138.89,"baro_rate":192,"geom_rate":384,"squawk":"0203","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4000,"lat":34.309092,"lon":-118.860054,"nic":9,"rc":75,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2771075,"seen":0.0,"rssi":-3.6,"dst":32.569,"dir":313.0}, +{"hex":"a86107","type":"adsb_icao","flight":"ASA1436 ","r":"N639VA","t":"A320","alt_baro":12400,"alt_geom":13000,"gs":311.6,"track":142.43,"baro_rate":-704,"squawk":"1531","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":6016,"lat":34.203233,"lon":-118.845863,"nic":8,"rc":186,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":19061773,"seen":0.1,"rssi":-9.4,"dst":28.050,"dir":304.4}, +{"hex":"~298f73","type":"tisb_trackfile","alt_baro":1400,"gs":137.4,"track":311.46,"geom_rate":0,"lat":33.903809,"lon":-118.838887,"nic":0,"rc":0,"seen_pos":0.000,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":35769,"seen":0.0,"rssi":0.0,"dst":22.963,"dir":264.7}, +{"hex":"ae279a","type":"mlat","flight":"BULET45 ","dbFlags":1,"alt_baro":1425,"gs":132.0,"track":310.00,"baro_rate":0,"squawk":"1200","lat":33.902170,"lon":-118.838426,"nic":0,"rc":0,"seen_pos":0.569,"alert":0,"spi":0,"mlat":["callsign","gs","track","baro_rate","lat","lon","nic","rc"],"tisb":[],"messages":50015,"seen":0.6,"rssi":-5.9,"dst":22.950,"dir":264.5}, +{"hex":"ae6801","type":"mlat","dbFlags":1,"alt_baro":475,"gs":320.0,"track":51.00,"baro_rate":-11,"squawk":"7111","lat":33.016354,"lon":-118.803989,"nic":0,"rc":0,"seen_pos":2.457,"alert":0,"spi":0,"mlat":["gs","track","baro_rate","lat","lon","nic","rc"],"tisb":[],"messages":428719,"seen":1.1,"rssi":-11.9,"dst":59.373,"dir":201.1}, +{"hex":"a5d0be","type":"adsb_icao","flight":"N474J ","r":"N474J","t":"BE20","alt_baro":17600,"alt_geom":18325,"gs":257.7,"ias":205,"tas":274,"mach":0.428,"wd":164,"ws":16,"oat":-3,"tat":7,"track":151.74,"track_rate":0.00,"roll":0.35,"mag_heading":140.10,"true_heading":152.08,"baro_rate":-32,"geom_rate":-128,"squawk":"3267","emergency":"none","category":"A1","nav_qnh":1010.4,"nav_altitude_mcp":17504,"nav_heading":136.41,"lat":35.264810,"lon":-118.780790,"nic":8,"rc":186,"seen_pos":0.158,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3211798,"seen":0.0,"rssi":-7.2,"dst":81.980,"dir":346.1}, +{"hex":"ab5ade","type":"adsb_icao","flight":"SWA8700 ","r":"N8301J","t":"B738","alt_baro":35000,"alt_geom":36250,"gs":433.4,"ias":262,"tas":450,"mach":0.776,"wd":203,"ws":52,"oat":-52,"tat":-25,"track":128.54,"track_rate":0.00,"roll":0.53,"mag_heading":123.05,"true_heading":134.98,"baro_rate":0,"geom_rate":0,"squawk":"6352","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":35008,"nav_altitude_fms":35008,"nav_heading":120.23,"lat":35.107743,"lon":-118.761635,"nic":8,"rc":186,"seen_pos":0.340,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18427698,"seen":0.3,"rssi":-10.4,"dst":72.617,"dir":345.0}, +{"hex":"c03dc5","type":"adsb_icao","flight":"CFXKE ","r":"C-FXKE","t":"SR22","alt_baro":12100,"alt_geom":12600,"gs":195.5,"track":334.22,"geom_rate":-64,"squawk":"5731","emergency":"none","category":"A1","lat":35.126131,"lon":-118.759060,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":246238,"seen":0.2,"rssi":-5.1,"dst":73.651,"dir":345.4}, +{"hex":"ad42fa","type":"adsb_icao","flight":"N9536D ","r":"N9536D","t":"C172","dbFlags":8,"alt_baro":4600,"alt_geom":4600,"gs":112.6,"track":279.71,"baro_rate":-384,"geom_rate":-384,"squawk":"1200","emergency":"none","category":"A1","lat":34.302200,"lon":-118.719887,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2890207,"seen":0.0,"rssi":-2.8,"dst":27.544,"dir":322.3}, +{"hex":"acb361","type":"adsr_icao","flight":"N9172Y ","r":"N9172Y","t":"P28A","alt_baro":4400,"alt_geom":4475,"gs":111.5,"track":299.55,"baro_rate":512,"geom_rate":512,"squawk":"4743","emergency":"none","category":"A1","lat":34.235687,"lon":-118.705706,"nic":0,"rc":0,"seen_pos":0.814,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":814894,"seen":0.8,"rssi":-11.5,"dst":24.036,"dir":317.7}, +{"hex":"acadb6","type":"adsb_icao","flight":"N916HT ","r":"N916HT","t":"C172","alt_baro":4000,"alt_geom":4025,"gs":121.7,"track":295.30,"baro_rate":-64,"geom_rate":0,"squawk":"4602","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4000,"nav_heading":284.06,"nav_modes":["althold"],"lat":34.124187,"lon":-118.694344,"nic":9,"rc":75,"seen_pos":0.438,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7742331,"seen":0.1,"rssi":-3.5,"dst":19.159,"dir":305.4}, +{"hex":"a7ab30","type":"adsr_icao","flight":"N5932F ","r":"N5932F","t":"P28A","alt_baro":4550,"alt_geom":4625,"gs":114.3,"track":278.56,"baro_rate":0,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","lat":34.274323,"lon":-118.693318,"nic":0,"rc":0,"seen_pos":0.556,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3389382,"seen":0.2,"rssi":-6.6,"dst":25.413,"dir":322.3}, +{"hex":"76cee7","type":"adsb_icao","flight":"SIA11 ","r":"9V-SWG","t":"B77W","alt_baro":6250,"alt_geom":6425,"gs":316.3,"track":264.74,"baro_rate":1088,"geom_rate":2176,"squawk":"7755","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":23008,"nav_heading":250.31,"lat":33.927969,"lon":-118.690796,"nic":8,"rc":186,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":9972114,"seen":0.0,"rssi":-7.1,"dst":15.497,"dir":267.4}, +{"hex":"a2c4db","type":"adsb_icao","flight":"N278GS ","r":"N278GS","t":"F2TH","dbFlags":8,"alt_baro":34000,"alt_geom":35275,"gs":479.4,"ias":283,"tas":472,"mach":0.820,"wd":214,"ws":73,"oat":-55,"tat":-26,"track":314.49,"track_rate":0.00,"roll":-0.53,"mag_heading":294.08,"true_heading":305.74,"baro_rate":64,"geom_rate":64,"squawk":"5753","emergency":"none","category":"A2","nav_qnh":1013.6,"nav_altitude_mcp":34016,"nav_altitude_fms":34000,"nav_modes":["autopilot","althold","tcas"],"lat":33.864578,"lon":-118.669384,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2993046,"seen":0.0,"rssi":-17.0,"dst":15.085,"dir":252.5}, +{"hex":"a163c2","type":"adsb_icao","flight":"SKW3436 ","r":"N189SY","t":"E75L","alt_baro":34000,"alt_geom":35175,"gs":475.9,"ias":252,"tas":426,"mach":0.732,"wd":211,"ws":76,"oat":-50,"tat":-26,"track":345.64,"track_rate":0.00,"roll":0.18,"mag_heading":326.43,"true_heading":338.33,"baro_rate":128,"geom_rate":64,"squawk":"2025","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":34016,"nav_altitude_fms":34000,"nav_modes":["autopilot","vnav","tcas"],"lat":35.122559,"lon":-118.651503,"nic":8,"rc":186,"seen_pos":0.230,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24079960,"seen":0.0,"rssi":-8.8,"dst":72.269,"dir":349.4}, +{"hex":"ad4584","type":"adsb_icao","flight":"SWA1134 ","r":"N954WN","t":"B737","alt_baro":38000,"alt_geom":39350,"gs":508.9,"ias":246,"tas":450,"mach":0.780,"wd":212,"ws":82,"oat":-54,"tat":-27,"track":351.30,"track_rate":0.00,"roll":-0.18,"mag_heading":332.75,"true_heading":344.50,"baro_rate":64,"geom_rate":32,"squawk":"7750","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":38016,"nav_altitude_fms":38000,"nav_heading":329.06,"lat":34.332229,"lon":-118.638496,"nic":8,"rc":186,"seen_pos":0.126,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24296043,"seen":0.0,"rssi":-9.9,"dst":26.833,"dir":331.5}, +{"hex":"a04035","type":"adsb_icao","flight":"EJA115 ","r":"N115QS","t":"GL5T","alt_baro":2525,"alt_geom":2500,"gs":174.2,"track":41.74,"baro_rate":-320,"geom_rate":-320,"squawk":"4711","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":1696,"nav_heading":70.31,"lat":34.259537,"lon":-118.558624,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":11,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2134312,"seen":0.0,"rssi":-3.4,"dst":21.141,"dir":335.2}, +{"hex":"485b45","type":"adsb_icao","flight":"KLM602 ","r":"PH-BKF","t":"B78X","alt_baro":2875,"alt_geom":2850,"gs":271.6,"track":266.20,"baro_rate":1344,"geom_rate":1344,"squawk":"2066","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":12000,"nav_heading":251.02,"nav_modes":["vnav","tcas"],"lat":33.936721,"lon":-118.558788,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":21883257,"seen":0.0,"rssi":-4.0,"dst":8.870,"dir":268.8}, +{"hex":"a6add6","type":"adsr_icao","flight":"N5298J ","r":"N5298J","t":"C172","alt_baro":2200,"alt_geom":2050,"gs":91.9,"track":135.88,"baro_rate":0,"geom_rate":0,"squawk":"0241","emergency":"none","category":"A1","lat":34.235046,"lon":-118.542817,"nic":0,"rc":186,"seen_pos":0.000,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2525498,"seen":0.0,"rssi":-7.3,"dst":19.483,"dir":335.5}, +{"hex":"ab358d","type":"adsb_icao","flight":"N821LA ","r":"N821LA","t":"H60","alt_baro":1400,"alt_geom":1275,"gs":133.7,"track":207.14,"baro_rate":-256,"geom_rate":-256,"squawk":"1206","emergency":"none","category":"A7","lat":34.223923,"lon":-118.542200,"nic":7,"rc":371,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":459402,"seen":0.0,"rssi":-4.8,"dst":18.866,"dir":334.7}, +{"hex":"a2d686","type":"adsb_icao","flight":"N282MK ","r":"N282MK","t":"P28A","alt_baro":5100,"alt_geom":5150,"gs":127.3,"track":325.56,"baro_rate":64,"geom_rate":128,"squawk":"4704","emergency":"none","category":"A1","lat":34.087830,"lon":-118.521481,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3249728,"seen":0.1,"rssi":-5.9,"dst":11.336,"dir":321.6}, +{"hex":"c0307a","type":"adsb_icao","flight":"ACA792 ","r":"C-FSJH","t":"B38M","alt_baro":5925,"alt_geom":6050,"gs":264.0,"track":180.22,"baro_rate":1728,"geom_rate":1792,"squawk":"1364","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":16992,"nav_heading":165.94,"lat":33.781906,"lon":-118.520284,"nic":8,"rc":186,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":19622116,"seen":0.1,"rssi":-5.4,"dst":11.782,"dir":216.4}, +{"hex":"a03a0c","type":"adsb_icao","flight":"N1132X ","r":"N1132X","t":"C172","alt_baro":2250,"alt_geom":2175,"gs":95.8,"track":283.89,"baro_rate":704,"geom_rate":640,"squawk":"6744","emergency":"none","category":"A1","lat":33.999148,"lon":-118.512669,"nic":9,"rc":75,"seen_pos":0.126,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3534396,"seen":0.0,"rssi":-9.8,"dst":7.503,"dir":298.4}, +{"hex":"a0f808","type":"adsr_icao","flight":"N1612E ","r":"N1612E","t":"C172","alt_baro":3400,"alt_geom":3425,"gs":100.0,"track":178.85,"baro_rate":-896,"squawk":"4604","emergency":"none","category":"A1","lat":34.337448,"lon":-118.501730,"nic":0,"rc":0,"seen_pos":0.389,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":29953,"seen":0.4,"rssi":-7.7,"dst":24.626,"dir":345.8}, +{"hex":"a22e9d","type":"adsb_icao","r":"N24KX","t":"SR20","alt_baro":"ground","gs":0.0,"mag_heading":171.56,"true_heading":183.28,"squawk":"1200","emergency":"none","category":"A1","lat":34.215732,"lon":-118.499823,"nic":7,"rc":75,"seen_pos":14.259,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1161082,"seen":3.7,"rssi":-12.5,"dst":17.603,"dir":340.3}, +{"hex":"000000","type":"other","alt_baro":550,"track":158.80,"lat":34.277985,"lon":-118.498928,"nic":0,"rc":0,"seen_pos":30.720,"mlat":[],"tisb":[],"messages":5797714,"seen":30.7,"rssi":-18.4,"dst":21.145,"dir":343.8}, +{"hex":"aa7ad8","type":"adsr_icao","flight":"N7744S ","r":"N7744S","t":"C172","alt_baro":2925,"alt_geom":2825,"gs":81.0,"track":167.16,"baro_rate":-320,"squawk":"4746","emergency":"none","category":"A1","lat":34.348938,"lon":-118.497358,"nic":0,"rc":0,"seen_pos":0.178,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2636910,"seen":0.2,"rssi":-13.6,"dst":25.244,"dir":346.7}, +{"hex":"aab5b5","type":"adsb_icao","flight":"N79AJ ","r":"N79AJ","t":"C525","alt_baro":29025,"alt_geom":30225,"gs":318.1,"track":155.29,"baro_rate":0,"squawk":"3344","emergency":"none","category":"A1","lat":34.582354,"lon":-118.496819,"nic":9,"rc":75,"seen_pos":0.358,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":616720,"seen":0.0,"rssi":-8.3,"dst":39.009,"dir":351.5}, +{"hex":"aa8604","type":"adsb_icao","flight":"N7774Z ","r":"N7774Z","t":"SR22","dbFlags":8,"alt_baro":"ground","gs":16.5,"track":278.44,"squawk":"4632","emergency":"none","category":"A1","lat":34.217194,"lon":-118.495761,"nic":10,"rc":25,"seen_pos":1.529,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":602789,"seen":1.5,"rssi":-12.5,"dst":17.618,"dir":341.0}, +{"hex":"a6905f","type":"adsb_icao","flight":"SIS522 ","r":"N522AC","t":"CL30","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":87.19,"squawk":"4734","emergency":"none","category":"A2","lat":34.219328,"lon":-118.493958,"nic":8,"rc":186,"seen_pos":3.357,"version":2,"nac_p":11,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3570177,"seen":1.2,"rssi":-8.7,"dst":17.711,"dir":341.4}, +{"hex":"aa69ee","type":"adsb_icao","flight":"N770KF ","r":"N770KF","t":"GLEX","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":270.00,"squawk":"7275","emergency":"none","category":"A3","lat":34.204445,"lon":-118.493953,"nic":8,"rc":186,"seen_pos":0.090,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":2678706,"seen":0.1,"rssi":-3.6,"dst":16.866,"dir":340.4}, +{"hex":"a1619b","type":"adsb_icao","flight":"N1886N ","r":"N1886N","t":"GLEX","dbFlags":8,"alt_baro":"ground","gs":0.1,"true_heading":267.19,"squawk":"3263","emergency":"none","category":"A3","lat":34.219505,"lon":-118.493182,"nic":8,"rc":186,"seen_pos":0.867,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":2445507,"seen":0.9,"rssi":-3.0,"dst":17.708,"dir":341.5}, +{"hex":"a4ab85","type":"adsb_icao","flight":"N40NS ","r":"N40NS","t":"GLEX","dbFlags":8,"alt_baro":"ground","gs":0.1,"true_heading":267.19,"squawk":"2655","emergency":"none","category":"A3","lat":34.219208,"lon":-118.493154,"nic":8,"rc":186,"seen_pos":0.713,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":885114,"seen":0.7,"rssi":-9.4,"dst":17.691,"dir":341.5}, +{"hex":"~2980e3","type":"tisb_other","alt_baro":2025,"alt_geom":2800,"gs":99.1,"track":182.31,"geom_rate":-512,"lat":34.262168,"lon":-118.492813,"nic":0,"rc":926,"seen_pos":0.955,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":41612,"seen":0.8,"rssi":-7.0,"dst":20.148,"dir":343.9}, +{"hex":"a71221","type":"adsb_icao","flight":"N555BK ","r":"N555BK","t":"FA50","alt_baro":"ground","gs":1.4,"squawk":"0511","emergency":"none","category":"A6","lat":34.206573,"lon":-118.492041,"nic":8,"rc":186,"seen_pos":21.858,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":39236,"seen":0.0,"rssi":-15.1,"dst":16.955,"dir":340.9}, +{"hex":"a88e32","type":"adsb_icao","flight":"N650RA ","r":"N650RA","t":"C650","alt_baro":800,"alt_geom":650,"gs":0.7,"track":0.00,"geom_rate":0,"category":"A2","lat":34.202454,"lon":-118.491753,"nic":9,"rc":75,"seen_pos":4.537,"version":2,"nic_baro":1,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":5360002,"seen":0.3,"rssi":-21.3,"dst":16.717,"dir":340.6}, +{"hex":"a66ab8","type":"adsb_icao","flight":"N512V ","r":"N512V","t":"COL4","alt_baro":"ground","gs":0.0,"true_heading":171.56,"squawk":"0217","emergency":"none","category":"A1","lat":34.203943,"lon":-118.491540,"nic":9,"rc":75,"seen_pos":0.090,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":20632,"seen":0.1,"rssi":-11.2,"dst":16.798,"dir":340.8}, +{"hex":"a014ff","type":"adsb_icao","flight":"N104QS ","r":"N104QS","t":"GL5T","alt_baro":"ground","gs":33.5,"true_heading":177.19,"squawk":"6717","emergency":"none","category":"A3","lat":34.217560,"lon":-118.491122,"nic":8,"rc":186,"seen_pos":0.463,"version":2,"nac_p":11,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":118905,"seen":0.5,"rssi":-15.9,"dst":17.565,"dir":341.7}, +{"hex":"a1deaa","type":"adsb_icao","flight":"N22AB ","r":"N22AB","t":"SR22","alt_baro":"ground","alt_geom":675,"gs":0.0,"mag_heading":278.44,"true_heading":290.15,"squawk":"0221","emergency":"none","category":"A1","lat":34.204273,"lon":-118.490856,"nic":9,"rc":75,"seen_pos":0.829,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":1,"mlat":[],"tisb":[],"messages":1638399,"seen":0.8,"rssi":-6.4,"dst":16.806,"dir":340.9}, +{"hex":"a28101","type":"adsr_icao","flight":"N260WR ","r":"N260WR","t":"PTS2","alt_baro":1800,"alt_geom":1800,"gs":131.1,"track":177.81,"baro_rate":128,"geom_rate":128,"squawk":"0262","emergency":"none","category":"A1","lat":34.174164,"lon":-118.489286,"nic":0,"rc":0,"seen_pos":0.166,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":15928,"seen":0.0,"rssi":-1.6,"dst":15.081,"dir":338.9}, +{"hex":"a35764","type":"adsb_icao","flight":"N314TP ","r":"N314TP","t":"GLF5","alt_baro":"ground","gs":0.0,"true_heading":87.19,"squawk":"0611","emergency":"none","category":"A3","lat":34.198746,"lon":-118.487899,"nic":8,"rc":186,"seen_pos":24.113,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3130867,"seen":10.6,"rssi":-9.4,"dst":16.444,"dir":341.0}, +{"hex":"ab19a7","type":"adsb_icao","flight":"EJA814 ","r":"N814QS","t":"C750","alt_baro":"ground","gs":0.0,"true_heading":180.00,"squawk":"1361","emergency":"none","category":"A2","lat":34.208817,"lon":-118.487535,"nic":9,"rc":75,"seen_pos":3.684,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":11021290,"seen":2.7,"rssi":-16.0,"dst":17.011,"dir":341.7}, +{"hex":"~29878f","type":"tisb_other","alt_baro":1425,"alt_geom":2200,"gs":134.0,"track":324.41,"geom_rate":0,"lat":34.195551,"lon":-118.460426,"nic":0,"rc":926,"seen_pos":1.516,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":56263,"seen":1.1,"rssi":-9.4,"dst":15.865,"dir":345.4}, +{"hex":"a17c14","type":"adsb_icao","flight":"N195PS ","r":"N195PS","t":"ULAC","alt_baro":475,"alt_geom":375,"gs":61.9,"track":211.12,"baro_rate":640,"geom_rate":1024,"squawk":"1200","emergency":"none","category":"A1","lat":34.009827,"lon":-118.456720,"nic":9,"rc":75,"seen_pos":0.037,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4828317,"seen":0.0,"rssi":-5.6,"dst":5.677,"dir":317.8}, +{"hex":"ad9a4a","type":"adsb_icao","flight":"N976DR ","r":"N976DR","t":"BKUT","alt_baro":150,"alt_geom":50,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":34.015549,"lon":-118.454197,"nic":8,"rc":186,"seen_pos":1.825,"version":2,"nic_baro":1,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1636807,"seen":0.3,"rssi":-2.7,"dst":5.856,"dir":320.9}, +{"hex":"ab5cc1","type":"adsb_icao","flight":"N831HA ","r":"N831HA","t":"AS50","dbFlags":8,"alt_baro":1250,"alt_geom":1150,"gs":132.2,"track":67.31,"baro_rate":-64,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A7","nav_qnh":1012.8,"nav_altitude_mcp":12416,"lat":33.993189,"lon":-118.453274,"nic":9,"rc":75,"seen_pos":0.401,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":27448,"seen":0.1,"rssi":-5.0,"dst":4.854,"dir":311.3}, +{"hex":"a46f00","type":"adsb_icao","flight":"N385MR ","r":"N385MR","t":"ULAC","alt_baro":"ground","gs":32.5,"track":227.81,"squawk":"1200","emergency":"none","category":"A1","lat":34.018822,"lon":-118.447779,"nic":9,"rc":75,"seen_pos":2.055,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3895483,"seen":2.1,"rssi":-2.1,"dst":5.819,"dir":324.6}, +{"hex":"a3f119","type":"adsb_icao","flight":"N353MV ","r":"N353MV","t":"C172","alt_baro":"ground","gs":3.2,"true_heading":320.62,"category":"A1","lat":34.018845,"lon":-118.446869,"nic":9,"rc":75,"seen_pos":13.492,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":6193243,"seen":13.5,"rssi":-4.5,"dst":5.794,"dir":325.0}, +{"hex":"a51717","type":"adsb_icao","flight":"N427R ","r":"N427R","t":"ULAC","alt_baro":150,"alt_geom":50,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":0,"squawk":"0204","emergency":"none","category":"A1","lat":34.018467,"lon":-118.446693,"nic":9,"rc":75,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":5568785,"seen":0.1,"rssi":-5.8,"dst":5.770,"dir":324.9}, +{"hex":"aa5371","type":"adsb_icao","flight":"N7645F ","r":"N7645F","t":"P28A","alt_baro":1300,"alt_geom":1050,"gs":94.4,"track":233.62,"baro_rate":-64,"geom_rate":-1792,"squawk":"0237","emergency":"none","category":"A1","lat":34.024567,"lon":-118.439175,"nic":9,"rc":75,"seen_pos":0.037,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3473560,"seen":0.0,"rssi":-9.0,"dst":5.877,"dir":329.9}, +{"hex":"a2a213","type":"adsb_icao","flight":"SKW153C ","r":"N269SY","t":"E75L","alt_baro":1100,"alt_geom":1025,"gs":144.8,"track":264.05,"true_heading":264.38,"baro_rate":1600,"geom_rate":1856,"squawk":"2444","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":5024,"nav_modes":[],"lat":33.946916,"lon":-118.434792,"nic":8,"rc":186,"seen_pos":0.229,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":18408554,"seen":0.0,"rssi":-7.2,"dst":2.760,"dir":278.8}, +{"hex":"~3184f5","type":"tisb_trackfile","alt_baro":"ground","gs":0.0,"lat":33.942993,"lon":-118.434635,"nic":0,"rc":25,"seen_pos":23.953,"nac_p":0,"nac_v":2,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":122739,"seen":23.7,"rssi":-13.3,"dst":2.726,"dir":274.0}, +{"hex":"~3182f1","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.942971,"lon":-118.434606,"nic":0,"rc":186,"seen_pos":2.860,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":164892,"seen":1.7,"rssi":-14.1,"dst":2.725,"dir":274.0}, +{"hex":"a6745a","type":"adsb_icao","flight":"N515DN ","r":"N515DN","t":"A359","alt_baro":"ground","gs":0.0,"true_heading":264.38,"squawk":"0031","emergency":"none","category":"A5","lat":33.937946,"lon":-118.432085,"nic":8,"rc":186,"seen_pos":1.459,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":14687987,"seen":1.5,"rssi":-16.2,"dst":2.595,"dir":267.5}, +{"hex":"~318c65","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.941644,"lon":-118.431888,"nic":10,"rc":25,"seen_pos":0.851,"nac_p":10,"nac_v":2,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":142013,"seen":0.7,"rssi":-14.4,"dst":2.585,"dir":272.4}, +{"hex":"a2803d","type":"adsb_icao","flight":"AAY1019 ","r":"N260NV","t":"A320","alt_baro":"ground","gs":0.0,"squawk":"1200","emergency":"none","category":"A3","lat":33.943737,"lon":-118.431818,"nic":8,"rc":186,"seen_pos":13.738,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":19393594,"seen":1.6,"rssi":-4.1,"dst":2.590,"dir":275.2}, +{"hex":"~318260","type":"tisb_trackfile","alt_baro":"ground","gs":13.2,"track":250.31,"lat":33.945522,"lon":-118.431356,"nic":0,"rc":0,"seen_pos":15.823,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":140793,"seen":15.8,"rssi":-10.9,"dst":2.579,"dir":277.6}, +{"hex":"~318810","type":"tisb_other","alt_baro":"ground","gs":2.2,"lat":33.947044,"lon":-118.430271,"nic":0,"rc":186,"seen_pos":27.873,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":134370,"seen":27.7,"rssi":-5.7,"dst":2.539,"dir":279.8}, +{"hex":"~3183ed","type":"tisb_other","alt_baro":"ground","gs":18.5,"track":90.00,"lat":33.945869,"lon":-118.427424,"nic":0,"rc":186,"seen_pos":39.800,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":153515,"seen":39.8,"rssi":-4.0,"dst":2.388,"dir":278.7}, +{"hex":"~318a78","type":"tisb_other","alt_baro":"ground","gs":13.2,"track":272.81,"lat":33.936558,"lon":-118.427124,"nic":0,"rc":186,"seen_pos":3.978,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":125538,"seen":3.9,"rssi":-5.7,"dst":2.354,"dir":265.2}, +{"hex":"3a4dc0","type":"adsb_icao","flight":"THT7 ","r":"F-OTOA","t":"B789","alt_baro":"ground","alt_geom":100,"gs":0.1,"mag_heading":216.56,"true_heading":228.22,"squawk":"1702","emergency":"none","category":"A5","lat":33.948681,"lon":-118.426620,"nic":8,"rc":186,"seen_pos":0.657,"version":2,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":9228640,"seen":0.4,"rssi":-2.4,"dst":2.380,"dir":282.9}, +{"hex":"~318240","type":"tisb_other","alt_baro":"ground","gs":13.2,"track":149.06,"lat":33.936512,"lon":-118.426495,"nic":0,"rc":186,"seen_pos":8.931,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":187176,"seen":8.9,"rssi":-5.6,"dst":2.323,"dir":265.1}, +{"hex":"~318a6f","type":"tisb_other","alt_baro":"ground","gs":1.9,"track":261.56,"lat":33.936535,"lon":-118.425937,"nic":0,"rc":186,"seen_pos":31.924,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":125188,"seen":31.9,"rssi":-2.8,"dst":2.295,"dir":265.0}, +{"hex":"~318986","type":"tisb_other","alt_baro":"ground","gs":1.9,"track":264.38,"lat":33.936570,"lon":-118.425579,"nic":0,"rc":186,"seen_pos":26.949,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":159403,"seen":26.9,"rssi":-8.4,"dst":2.277,"dir":265.0}, +{"hex":"a7cd53","type":"adsb_icao","flight":"N6010E ","r":"N6010E","t":"BE35","alt_baro":1925,"alt_geom":1825,"gs":90.6,"track":210.53,"baro_rate":-448,"geom_rate":-448,"squawk":"1200","emergency":"none","category":"A1","lat":34.284027,"lon":-118.424882,"nic":9,"rc":75,"seen_pos":0.232,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":81336,"seen":0.0,"rssi":-3.6,"dst":20.784,"dir":353.9}, +{"hex":"~318152","type":"tisb_trackfile","alt_baro":"ground","gs":13.2,"track":81.56,"lat":33.936722,"lon":-118.423803,"nic":0,"rc":186,"seen_pos":0.050,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":154351,"seen":0.1,"rssi":-7.8,"dst":2.188,"dir":265.1}, +{"hex":"~318538","type":"tisb_trackfile","alt_baro":"ground","gs":22.5,"track":264.38,"lat":33.937328,"lon":-118.418394,"nic":0,"rc":0,"seen_pos":1.113,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":167869,"seen":1.1,"rssi":-5.3,"dst":1.917,"dir":265.5}, +{"hex":"a9d5be","type":"adsb_icao","flight":"N73262 ","r":"N73262","t":"C172","alt_baro":1400,"alt_geom":1275,"gs":83.7,"track":40.16,"baro_rate":-64,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","lat":34.026260,"lon":-118.418212,"nic":9,"rc":75,"seen_pos":0.126,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":966807,"seen":0.0,"rssi":-12.4,"dst":5.525,"dir":339.9}, +{"hex":"~3180e3","type":"tisb_other","alt_baro":"ground","gs":14.8,"track":261.56,"lat":33.946858,"lon":-118.418169,"nic":0,"rc":186,"seen_pos":0.888,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":131027,"seen":0.9,"rssi":-4.1,"dst":1.946,"dir":282.5}, +{"hex":"a385a2","type":"adsb_icao","flight":"N326LP ","r":"N326LP","t":"C172","alt_baro":"ground","gs":4.8,"category":"A1","lat":34.263577,"lon":-118.417889,"nic":10,"rc":25,"seen_pos":16.431,"version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":3878181,"seen":16.4,"rssi":-17.9,"dst":19.528,"dir":354.5}, +{"hex":"~3182e5","type":"tisb_other","alt_baro":"ground","gs":14.8,"track":84.38,"lat":33.946869,"lon":-118.417783,"nic":0,"rc":186,"seen_pos":0.851,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":138332,"seen":0.9,"rssi":-5.4,"dst":1.927,"dir":282.6}, +{"hex":"~3188c5","type":"tisb_other","alt_baro":"ground","gs":15.5,"track":244.69,"lat":33.933416,"lon":-118.417654,"nic":0,"rc":186,"seen_pos":56.984,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":127387,"seen":57.0,"rssi":-5.1,"dst":1.914,"dir":258.4}, +{"hex":"~318f3f","type":"tisb_other","alt_baro":"ground","gs":13.2,"track":81.56,"lat":33.946893,"lon":-118.417611,"nic":0,"rc":186,"seen_pos":0.851,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":139114,"seen":0.9,"rssi":-5.6,"dst":1.919,"dir":282.7}, +{"hex":"a956a4","type":"tisb_icao","r":"N700XJ","alt_baro":"ground","gs":0.0,"category":"A0","lat":33.933403,"lon":-118.417581,"nic":8,"rc":186,"seen_pos":3.031,"nac_p":8,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":152839,"seen":3.0,"rssi":-15.5,"dst":1.910,"dir":258.3}, +{"hex":"~318603","type":"tisb_other","alt_baro":"ground","gs":5.2,"lat":33.939305,"lon":-118.416953,"nic":8,"rc":186,"seen_pos":43.881,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":169427,"seen":43.9,"rssi":-5.5,"dst":1.839,"dir":269.0}, +{"hex":"~31805d","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.937815,"lon":-118.416395,"nic":0,"rc":186,"seen_pos":56.982,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":133276,"seen":57.0,"rssi":-5.0,"dst":1.816,"dir":266.1}, +{"hex":"~318432","type":"tisb_trackfile","alt_baro":"ground","gs":0.0,"lat":33.937820,"lon":-118.416390,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":191903,"seen":0.0,"rssi":-5.7,"dst":1.815,"dir":266.1}, +{"hex":"~318b1a","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.937815,"lon":-118.416367,"nic":0,"rc":186,"seen_pos":54.038,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":186645,"seen":54.0,"rssi":-8.1,"dst":1.814,"dir":266.1}, +{"hex":"~3187dd","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.937815,"lon":-118.416367,"nic":0,"rc":186,"seen_pos":52.017,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":144569,"seen":52.0,"rssi":-3.7,"dst":1.814,"dir":266.1}, +{"hex":"~3188db","type":"tisb_other","alt_baro":"ground","gs":20.5,"track":264.38,"lat":33.937559,"lon":-118.415880,"nic":0,"rc":186,"seen_pos":25.042,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":166822,"seen":25.0,"rssi":-13.1,"dst":1.791,"dir":265.6}, +{"hex":"~318d5c","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.937990,"lon":-118.415723,"nic":0,"rc":25,"seen_pos":0.612,"nac_p":10,"nac_v":2,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":158376,"seen":0.6,"rssi":-10.7,"dst":1.781,"dir":266.4}, +{"hex":"a528e4","type":"adsr_icao","flight":"B13 ","r":"N431XB","alt_baro":"ground","gs":0.0,"category":"C2","lat":33.945973,"lon":-118.415551,"nic":0,"rc":0,"seen_pos":1.236,"nac_p":7,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":677628,"seen":1.2,"rssi":-16.4,"dst":1.807,"dir":281.7}, +{"hex":"~31890f","type":"tisb_other","alt_baro":"ground","gs":0.0,"track":267.19,"lat":33.938094,"lon":-118.415079,"nic":0,"rc":186,"seen_pos":0.612,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":147152,"seen":0.6,"rssi":-13.2,"dst":1.749,"dir":266.5}, +{"hex":"adb437","type":"adsb_icao","flight":"SKW4749 ","r":"N982SW","t":"CRJ2","alt_baro":24050,"alt_geom":25000,"gs":419.7,"ias":306,"tas":442,"mach":0.716,"wd":191,"ws":51,"oat":-22,"tat":4,"track":259.01,"roll":-0.53,"mag_heading":241.17,"true_heading":252.91,"baro_rate":-352,"geom_rate":-256,"squawk":"0624","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":24000,"lat":34.494417,"lon":-118.414764,"nic":8,"rc":186,"seen_pos":0.106,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":12100301,"seen":0.0,"rssi":-8.5,"dst":33.341,"dir":357.0}, +{"hex":"a7ad0d","type":"adsb_icao","flight":"JBU1464 ","r":"N594JB","t":"A320","alt_baro":"ground","gs":0.0,"true_heading":270.00,"squawk":"4553","emergency":"none","category":"A3","lat":33.945647,"lon":-118.414750,"nic":8,"rc":186,"seen_pos":2.159,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18083427,"seen":2.2,"rssi":-0.7,"dst":1.764,"dir":281.4}, +{"hex":"~318644","type":"tisb_trackfile","alt_baro":"ground","gs":17.5,"track":81.56,"lat":33.937672,"lon":-118.414554,"nic":0,"rc":0,"seen_pos":0.057,"nac_p":0,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":144604,"seen":0.0,"rssi":-5.6,"dst":1.725,"dir":265.7}, +{"hex":"~3188af","type":"tisb_other","alt_baro":"ground","gs":34.5,"track":205.31,"lat":33.937734,"lon":-118.413820,"nic":0,"rc":186,"seen_pos":47.718,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":132109,"seen":47.7,"rssi":-8.6,"dst":1.688,"dir":265.7}, +{"hex":"~318041","type":"tisb_trackfile","alt_baro":"ground","gs":15.5,"track":2.81,"lat":33.938416,"lon":-118.413517,"nic":0,"rc":186,"seen_pos":10.118,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":173745,"seen":9.8,"rssi":-5.5,"dst":1.670,"dir":267.0}, +{"hex":"aa3ae4","type":"adsb_icao","flight":"UAL1431 ","r":"N75853","t":"B753","alt_baro":"ground","gs":14.2,"true_heading":351.56,"squawk":"7666","emergency":"none","category":"A4","lat":33.944355,"lon":-118.413461,"nic":8,"rc":186,"seen_pos":1.718,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":4631877,"seen":1.7,"rssi":-1.9,"dst":1.687,"dir":279.2}, +{"hex":"~318fb2","type":"tisb_other","alt_baro":"ground","gs":13.2,"track":267.19,"lat":33.943529,"lon":-118.413348,"nic":0,"rc":186,"seen_pos":53.906,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":159007,"seen":53.9,"rssi":-7.3,"dst":1.674,"dir":277.6}, +{"hex":"a7db08","type":"adsb_icao","flight":"NKS1720 ","r":"N605NK","t":"A320","alt_baro":"ground","gs":18.5,"true_heading":354.38,"squawk":"4664","emergency":"none","category":"A3","lat":33.943039,"lon":-118.413279,"nic":8,"rc":186,"seen_pos":0.540,"version":2,"nac_p":10,"nac_v":4,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":20765595,"seen":0.4,"rssi":-0.6,"dst":1.667,"dir":276.6}, +{"hex":"abefba","type":"adsb_icao","flight":"SWA2220 ","r":"N8686A","t":"B738","alt_baro":"ground","alt_geom":2925,"gs":15.5,"true_heading":326.25,"squawk":"1671","emergency":"none","category":"A3","lat":33.938644,"lon":-118.412775,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["nac_p","sil","sil_type"],"messages":22731366,"seen":0.0,"rssi":-3.4,"dst":1.631,"dir":267.3}, +{"hex":"~318483","type":"tisb_other","alt_baro":"ground","gs":18.5,"track":264.38,"lat":33.937908,"lon":-118.412533,"nic":0,"rc":186,"seen_pos":27.946,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":127843,"seen":27.9,"rssi":-8.1,"dst":1.623,"dir":265.9}, +{"hex":"~3180c3","type":"tisb_other","alt_baro":"ground","gs":18.5,"track":92.81,"lat":33.943483,"lon":-118.412461,"nic":0,"rc":186,"seen_pos":42.695,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":226315,"seen":42.7,"rssi":-15.7,"dst":1.630,"dir":277.7}, +{"hex":"~318d48","type":"tisb_other","alt_baro":"ground","gs":26.5,"track":87.19,"lat":33.943506,"lon":-118.412361,"nic":0,"rc":186,"seen_pos":29.765,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":175792,"seen":29.8,"rssi":-12.3,"dst":1.625,"dir":277.8}, +{"hex":"~318ca6","type":"tisb_other","alt_baro":"ground","gs":3.8,"track":267.19,"lat":33.947603,"lon":-118.411546,"nic":0,"rc":186,"seen_pos":27.742,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":209847,"seen":27.7,"rssi":-7.9,"dst":1.637,"dir":286.5}, +{"hex":"~3182f8","type":"tisb_trackfile","alt_baro":"ground","gs":13.2,"track":171.56,"lat":33.947044,"lon":-118.411485,"nic":0,"rc":0,"seen_pos":15.972,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":138731,"seen":15.8,"rssi":-4.5,"dst":1.625,"dir":285.4}, +{"hex":"~318f6d","type":"tisb_other","alt_baro":"ground","gs":9.2,"lat":33.938013,"lon":-118.411288,"nic":0,"rc":186,"seen_pos":56.982,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":148450,"seen":57.0,"rssi":-5.3,"dst":1.561,"dir":265.9}, +{"hex":"~318436","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":84.38,"lat":33.937990,"lon":-118.411174,"nic":0,"rc":186,"seen_pos":14.005,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":137478,"seen":14.0,"rssi":-14.5,"dst":1.555,"dir":265.9}, +{"hex":"aa1a81","type":"adsb_icao","flight":"SKW3287 ","r":"N750EV","t":"CRJ7","alt_baro":"ground","gs":20.5,"true_heading":267.19,"squawk":"6727","emergency":"none","category":"A2","lat":33.938484,"lon":-118.411135,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":15073266,"seen":0.0,"rssi":-6.7,"dst":1.543,"dir":267.0}, +{"hex":"~318531","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.938059,"lon":-118.410945,"nic":0,"rc":186,"seen_pos":1.997,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":134826,"seen":1.0,"rssi":-5.7,"dst":1.544,"dir":266.0}, +{"hex":"~3184ac","type":"tisb_other","alt_baro":"ground","gs":11.2,"lat":33.938036,"lon":-118.410788,"nic":0,"rc":186,"seen_pos":50.831,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":152376,"seen":50.7,"rssi":-2.6,"dst":1.536,"dir":265.9}, +{"hex":"~318bcb","type":"tisb_trackfile","alt_baro":"ground","gs":16.5,"track":73.12,"lat":33.938164,"lon":-118.410476,"nic":0,"rc":186,"seen_pos":0.113,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":136396,"seen":0.0,"rssi":-4.0,"dst":1.520,"dir":266.2}, +{"hex":"a956cc","type":"adsb_icao","flight":"N700YZ ","r":"N700YZ","t":"SR20","alt_baro":1575,"alt_geom":1475,"gs":81.1,"track":239.64,"baro_rate":-512,"geom_rate":-384,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1014.4,"nav_altitude_mcp":2592,"nav_heading":220.08,"nav_modes":["althold"],"lat":33.408142,"lon":-118.410315,"nic":9,"rc":75,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3181033,"seen":0.1,"rssi":-5.2,"dst":31.960,"dir":182.7}, +{"hex":"a66a84","type":"adsb_icao","flight":"SKW6280 ","r":"N512SY","t":"E75L","alt_baro":"ground","gs":0.5,"true_heading":84.38,"squawk":"6653","emergency":"none","category":"A3","lat":33.937775,"lon":-118.409874,"nic":8,"rc":186,"seen_pos":0.612,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22280016,"seen":0.6,"rssi":-1.9,"dst":1.492,"dir":265.2}, +{"hex":"~3187f6","type":"tisb_other","alt_baro":"ground","gs":18.5,"track":261.56,"lat":33.947905,"lon":-118.409486,"nic":0,"rc":186,"seen_pos":54.857,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":141644,"seen":54.7,"rssi":-6.8,"dst":1.545,"dir":288.2}, +{"hex":"a6ec52","type":"adsb_icao","flight":"DAL1972 ","r":"N545US","t":"B752","alt_baro":"ground","gs":4.8,"squawk":"0030","emergency":"none","category":"A4","lat":33.946974,"lon":-118.409114,"nic":8,"rc":186,"seen_pos":0.333,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":14986212,"seen":0.3,"rssi":-1.4,"dst":1.510,"dir":286.4}, +{"hex":"~318728","type":"tisb_trackfile","alt_baro":"ground","gs":6.2,"lat":33.947330,"lon":-118.408613,"nic":0,"rc":186,"seen_pos":45.040,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":129666,"seen":44.6,"rssi":-8.1,"dst":1.493,"dir":287.5}, +{"hex":"~3186d8","type":"tisb_trackfile","alt_baro":"ground","gs":1.9,"track":261.56,"lat":33.938290,"lon":-118.408585,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":145333,"seen":0.0,"rssi":-3.9,"dst":1.425,"dir":266.2}, +{"hex":"~318850","type":"tisb_other","alt_baro":"ground","gs":5.2,"track":264.38,"lat":33.938443,"lon":-118.407383,"nic":0,"rc":186,"seen_pos":0.000,"nac_p":8,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":126072,"seen":0.0,"rssi":-5.4,"dst":1.365,"dir":266.4}, +{"hex":"a03fff","type":"adsb_icao","flight":"AAL184 ","r":"N115NN","t":"A321","alt_baro":"ground","gs":0.0,"squawk":"1311","emergency":"none","category":"A3","lat":33.940166,"lon":-118.407326,"nic":8,"rc":186,"seen_pos":47.279,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":33427166,"seen":3.8,"rssi":-5.7,"dst":1.360,"dir":270.8}, +{"hex":"a03765","type":"adsb_icao","flight":"AAL382 ","r":"N113AN","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":98.44,"squawk":"1342","emergency":"none","category":"A3","lat":33.940430,"lon":-118.407239,"nic":8,"rc":186,"seen_pos":29.233,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":35276269,"seen":4.9,"rssi":-3.6,"dst":1.356,"dir":271.5}, +{"hex":"a53052","type":"adsr_icao","flight":"B15 ","r":"N433XB","alt_baro":"ground","gs":9.8,"track":84.38,"category":"C2","lat":33.948103,"lon":-118.407168,"nic":8,"rc":186,"seen_pos":0.294,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":730838,"seen":0.3,"rssi":-13.2,"dst":1.440,"dir":290.1}, +{"hex":"a4d01f","type":"adsr_icao","flight":"O06 ","r":"N409XB","alt_baro":"ground","gs":0.0,"category":"C1","lat":33.935520,"lon":-118.407043,"nic":8,"rc":186,"seen_pos":0.183,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":2100755,"seen":0.1,"rssi":-7.1,"dst":1.370,"dir":259.1}, +{"hex":"a7f83b","type":"adsr_icao","flight":"E81 ","r":"N612XB","alt_baro":"ground","gs":0.0,"category":"C2","lat":33.935612,"lon":-118.406917,"nic":8,"rc":186,"seen_pos":0.205,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":119931,"seen":0.2,"rssi":-12.1,"dst":1.363,"dir":259.2}, +{"hex":"~318534","type":"tisb_trackfile","alt_baro":"ground","gs":9.2,"lat":33.938484,"lon":-118.406567,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":152636,"seen":0.0,"rssi":-4.0,"dst":1.324,"dir":266.4}, +{"hex":"a0628f","type":"adsb_icao","flight":"AAL481 ","r":"N124AA","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":261.56,"squawk":"2450","emergency":"none","category":"A3","lat":33.941493,"lon":-118.406467,"nic":8,"rc":186,"seen_pos":4.634,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":22631687,"seen":4.6,"rssi":-18.3,"dst":1.321,"dir":274.3}, +{"hex":"a25925","type":"adsb_icao","flight":"SKW158J ","r":"N250SY","t":"E75L","alt_baro":"ground","gs":0.0,"true_heading":264.38,"squawk":"6312","emergency":"none","category":"A3","lat":33.946014,"lon":-118.406455,"nic":8,"rc":186,"seen_pos":19.705,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":8274410,"seen":18.3,"rssi":-12.0,"dst":1.367,"dir":285.7}, +{"hex":"~318824","type":"tisb_other","alt_baro":"ground","gs":3.2,"lat":33.947556,"lon":-118.406453,"nic":0,"rc":186,"seen_pos":35.827,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":131309,"seen":35.8,"rssi":-6.0,"dst":1.395,"dir":289.4}, +{"hex":"~318b5f","type":"tisb_other","alt_baro":"ground","gs":5.2,"lat":33.947502,"lon":-118.406202,"nic":0,"rc":186,"seen_pos":14.764,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":226047,"seen":14.8,"rssi":-10.1,"dst":1.382,"dir":289.4}, +{"hex":"a8324d","type":"adsr_icao","flight":"M05 ","r":"N627XB","alt_baro":"ground","gs":5.8,"track":312.19,"category":"C1","lat":33.935520,"lon":-118.405922,"nic":8,"rc":186,"seen_pos":0.152,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":598458,"seen":0.2,"rssi":-18.1,"dst":1.316,"dir":258.6}, +{"hex":"aa7fa1","type":"adsb_icao","flight":"DAL304 ","r":"N776DE","t":"B738","alt_baro":"ground","gs":0.6,"true_heading":174.38,"squawk":"1510","emergency":"none","category":"A3","lat":33.946695,"lon":-118.405695,"nic":8,"rc":186,"seen_pos":0.584,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22705509,"seen":0.6,"rssi":-2.9,"dst":1.343,"dir":287.8}, +{"hex":"ac4ed1","type":"adsr_icao","flight":"B02 ","r":"N892XB","alt_baro":"ground","gs":22.5,"track":264.38,"category":"C2","lat":33.948289,"lon":-118.405638,"nic":8,"rc":186,"seen_pos":0.371,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":685699,"seen":0.4,"rssi":-16.0,"dst":1.372,"dir":291.7}, +{"hex":"a129dc","type":"adsb_icao","flight":"AAL1331 ","r":"N174US","t":"A321","alt_baro":"ground","gs":2.2,"true_heading":171.56,"squawk":"7322","emergency":"none","category":"A3","lat":33.940762,"lon":-118.405586,"nic":8,"rc":186,"seen_pos":4.127,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22054241,"seen":4.1,"rssi":-1.4,"dst":1.274,"dir":272.5}, +{"hex":"~31885c","type":"tisb_other","alt_baro":"ground","gs":20.5,"track":84.38,"lat":33.938618,"lon":-118.405252,"nic":0,"rc":186,"seen_pos":0.000,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":143194,"seen":0.0,"rssi":-8.1,"dst":1.259,"dir":266.6}, +{"hex":"~318244","type":"tisb_trackfile","alt_baro":"ground","gs":0.0,"lat":33.939045,"lon":-118.405263,"nic":0,"rc":186,"seen_pos":1.997,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":155809,"seen":0.9,"rssi":-15.4,"dst":1.258,"dir":267.8}, +{"hex":"~318e4e","type":"tisb_other","alt_baro":"ground","gs":14.8,"track":84.38,"lat":33.938618,"lon":-118.405252,"nic":0,"rc":186,"seen_pos":2.992,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":140866,"seen":3.0,"rssi":-15.9,"dst":1.259,"dir":266.6}, +{"hex":"~31882e","type":"tisb_trackfile","alt_baro":"ground","gs":5.2,"lat":33.938725,"lon":-118.405151,"nic":0,"rc":186,"seen_pos":31.796,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":139728,"seen":31.4,"rssi":-4.3,"dst":1.253,"dir":266.9}, +{"hex":"~318fab","type":"tisb_other","alt_baro":"ground","gs":7.2,"track":261.56,"lat":33.938676,"lon":-118.405108,"nic":0,"rc":186,"seen_pos":5.830,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":134104,"seen":5.8,"rssi":-4.0,"dst":1.251,"dir":266.8}, +{"hex":"~31854a","type":"tisb_other","alt_baro":"ground","gs":3.2,"track":261.56,"lat":33.938699,"lon":-118.405108,"nic":0,"rc":186,"seen_pos":16.953,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":149188,"seen":17.0,"rssi":-5.5,"dst":1.251,"dir":266.8}, +{"hex":"~3182d7","type":"tisb_other","alt_baro":"ground","gs":3.8,"track":14.06,"lat":33.948313,"lon":-118.404651,"nic":0,"rc":186,"seen_pos":4.823,"nac_p":8,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":167641,"seen":4.7,"rssi":-5.6,"dst":1.327,"dir":292.5}, +{"hex":"~3181f1","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.939188,"lon":-118.404264,"nic":0,"rc":25,"seen_pos":0.851,"nac_p":10,"nac_v":2,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":120488,"seen":0.9,"rssi":-5.6,"dst":1.208,"dir":268.1}, +{"hex":"ad7701","type":"adsb_icao","flight":"JBU1124 ","r":"N967JT","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":351.56,"squawk":"2000","emergency":"none","category":"A3","lat":33.939938,"lon":-118.404170,"nic":8,"rc":186,"seen_pos":4.492,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":34219161,"seen":0.0,"rssi":-1.8,"dst":1.202,"dir":270.2}, +{"hex":"a0d561","type":"adsb_icao","flight":"AAL2886 ","r":"N153AN","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":264.38,"squawk":"2000","emergency":"none","category":"A3","lat":33.941700,"lon":-118.404072,"nic":8,"rc":186,"seen_pos":7.136,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":23474003,"seen":0.6,"rssi":-4.2,"dst":1.203,"dir":275.3}, +{"hex":"adde95","type":"adsb_icao","flight":"JBU687 ","r":"N993JE","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":270.00,"squawk":"3433","emergency":"none","category":"A3","lat":33.941345,"lon":-118.404030,"nic":8,"rc":186,"seen_pos":51.461,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":35648884,"seen":1.6,"rssi":-3.9,"dst":1.199,"dir":274.3}, +{"hex":"ad4c27","type":"adsb_icao","flight":"NKS874 ","r":"N956NK","t":"A20N","alt_baro":"ground","gs":0.0,"true_heading":264.38,"squawk":"5177","emergency":"none","category":"A3","lat":33.940934,"lon":-118.403921,"nic":8,"rc":186,"seen_pos":21.932,"version":2,"nac_p":10,"nac_v":4,"sil":3,"sil_type":"perhour","sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7447024,"seen":21.3,"rssi":-9.5,"dst":1.192,"dir":273.1}, +{"hex":"~318692","type":"tisb_other","alt_baro":"ground","gs":11.2,"track":270.00,"lat":33.947859,"lon":-118.403878,"nic":0,"rc":186,"seen_pos":32.793,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":152427,"seen":32.5,"rssi":-5.5,"dst":1.281,"dir":292.0}, +{"hex":"a4f030","type":"adsr_icao","flight":"O04 ","r":"N417XB","alt_baro":"ground","gs":0.0,"track":22.50,"category":"C1","lat":33.938953,"lon":-118.403484,"nic":8,"rc":186,"seen_pos":0.102,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":555039,"seen":0.0,"rssi":-7.7,"dst":1.170,"dir":267.4}, +{"hex":"a8754d","type":"adsb_icao","flight":"NKS1023 ","r":"N644NK","t":"A320","alt_baro":"ground","gs":1.4,"true_heading":351.56,"squawk":"1042","emergency":"none","category":"A3","lat":33.942051,"lon":-118.403406,"nic":8,"rc":186,"seen_pos":1.378,"version":2,"nac_p":10,"nac_v":4,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":17924109,"seen":0.9,"rssi":-3.5,"dst":1.172,"dir":276.5}, +{"hex":"a062ec","type":"adsb_icao","flight":"DAL2947 ","r":"N124DU","t":"BCS1","alt_baro":"ground","gs":0.1,"true_heading":261.56,"squawk":"6703","emergency":"none","category":"A3","lat":33.946986,"lon":-118.403392,"nic":8,"rc":186,"seen_pos":8.907,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":26576235,"seen":8.0,"rssi":-4.4,"dst":1.240,"dir":290.2}, +{"hex":"~3180a0","type":"tisb_other","alt_baro":"ground","gs":5.8,"track":81.56,"lat":33.938897,"lon":-118.402719,"nic":0,"rc":186,"seen_pos":45.983,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":134836,"seen":46.0,"rssi":-5.4,"dst":1.132,"dir":267.1}, +{"hex":"~3182ec","type":"tisb_other","alt_baro":"ground","gs":5.8,"track":255.94,"lat":33.938932,"lon":-118.402619,"nic":0,"rc":186,"seen_pos":0.000,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":148653,"seen":0.0,"rssi":-5.6,"dst":1.126,"dir":267.2}, +{"hex":"a2afeb","type":"adsb_icao","flight":"SWA1253 ","r":"N272WN","t":"B737","alt_baro":"ground","gs":0.0,"true_heading":120.94,"squawk":"2050","emergency":"none","category":"A3","lat":33.946083,"lon":-118.401830,"nic":6,"rc":556,"seen_pos":3.956,"version":2,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":24665507,"seen":4.0,"rssi":-2.8,"dst":1.149,"dir":289.0}, +{"hex":"abfcb6","type":"adsb_icao","flight":"SWA1935 ","r":"N8712L","t":"B38M","alt_baro":"ground","alt_geom":2900,"gs":0.0,"true_heading":264.38,"squawk":"7660","emergency":"none","category":"A3","lat":33.948338,"lon":-118.401830,"nic":8,"rc":186,"seen_pos":4.045,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":12262250,"seen":0.5,"rssi":-1.2,"dst":1.199,"dir":295.1}, +{"hex":"~31821a","type":"tisb_other","alt_baro":"ground","gs":13.8,"track":255.94,"lat":33.939002,"lon":-118.401432,"nic":0,"rc":186,"seen_pos":56.983,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":132060,"seen":57.0,"rssi":-14.7,"dst":1.067,"dir":267.3}, +{"hex":"~3184b3","type":"tisb_trackfile","alt_baro":"ground","gs":13.2,"track":81.56,"lat":33.939102,"lon":-118.400415,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":0,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":138045,"seen":0.0,"rssi":-3.9,"dst":1.016,"dir":267.5}, +{"hex":"86e75e","type":"adsb_icao","flight":"JAL6721 ","r":"JA870J","t":"B789","alt_baro":"ground","gs":13.8,"mag_heading":70.31,"true_heading":81.96,"squawk":"5727","emergency":"none","category":"A5","lat":33.949244,"lon":-118.400288,"nic":8,"rc":186,"seen_pos":3.159,"version":2,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":11453223,"seen":3.2,"rssi":-3.1,"dst":1.156,"dir":299.2}, +{"hex":"~3188dc","type":"tisb_other","alt_baro":"ground","gs":12.2,"track":33.75,"lat":33.948522,"lon":-118.400044,"nic":0,"rc":186,"seen_pos":25.791,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":139295,"seen":25.8,"rssi":-5.6,"dst":1.125,"dir":297.6}, +{"hex":"4bb18b","type":"adsb_icao","flight":"THY12E ","r":"TC-LLK","t":"B789","alt_baro":"ground","gs":12.2,"mag_heading":253.12,"true_heading":264.77,"squawk":"5714","emergency":"none","category":"A5","lat":33.950407,"lon":-118.399987,"nic":8,"rc":186,"seen_pos":0.288,"version":2,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":25220972,"seen":0.3,"rssi":-2.9,"dst":1.179,"dir":302.5}, +{"hex":"~318268","type":"tisb_trackfile","alt_baro":"ground","gs":10.2,"lat":33.948566,"lon":-118.399981,"nic":0,"rc":0,"seen_pos":24.827,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":149001,"seen":23.7,"rssi":-8.2,"dst":1.123,"dir":297.8}, +{"hex":"~3180e7","type":"tisb_trackfile","alt_baro":"ground","gs":13.2,"track":81.56,"lat":33.939217,"lon":-118.399490,"nic":0,"rc":0,"seen_pos":0.050,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":171648,"seen":0.0,"rssi":-3.9,"dst":0.970,"dir":267.7}, +{"hex":"a7a8f8","type":"adsb_icao","flight":"N593EH ","r":"N593EH","t":"SR20","alt_baro":1450,"alt_geom":1350,"gs":95.5,"track":199.57,"baro_rate":-64,"geom_rate":-128,"squawk":"0232","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":1408,"nav_heading":30.94,"nav_modes":[],"lat":34.064804,"lon":-118.399434,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2516547,"seen":0.1,"rssi":-6.5,"dst":7.564,"dir":352.7}, +{"hex":"~31845e","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.939386,"lon":-118.399243,"nic":0,"rc":186,"seen_pos":6.025,"nac_p":8,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":209245,"seen":6.0,"rssi":-5.7,"dst":0.957,"dir":268.3}, +{"hex":"~31808e","type":"tisb_trackfile","alt_baro":"ground","gs":11.2,"track":264.38,"lat":33.939342,"lon":-118.399098,"nic":0,"rc":186,"seen_pos":0.113,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":137266,"seen":0.0,"rssi":-4.0,"dst":0.950,"dir":268.2}, +{"hex":"~318764","type":"tisb_other","alt_baro":"ground","gs":14.8,"track":81.56,"lat":33.939281,"lon":-118.399014,"nic":8,"rc":186,"seen_pos":19.051,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":121040,"seen":19.0,"rssi":-8.4,"dst":0.946,"dir":267.9}, +{"hex":"~3182d4","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":258.75,"lat":33.939340,"lon":-118.398843,"nic":8,"rc":186,"seen_pos":21.019,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":133469,"seen":21.0,"rssi":-8.2,"dst":0.938,"dir":268.1}, +{"hex":"~31899a","type":"tisb_trackfile","alt_baro":"ground","gs":15.5,"track":255.94,"lat":33.939342,"lon":-118.398579,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":142186,"seen":0.0,"rssi":-3.9,"dst":0.924,"dir":268.1}, +{"hex":"a646f9","type":"adsb_icao","flight":"XOJ503 ","r":"N503VJ","t":"GL5T","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":264.38,"squawk":"2000","emergency":"none","category":"A3","lat":33.932785,"lon":-118.398565,"nic":8,"rc":186,"seen_pos":1.718,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7607237,"seen":0.3,"rssi":-0.6,"dst":1.016,"dir":245.3}, +{"hex":"~318312","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":81.56,"lat":33.939340,"lon":-118.398471,"nic":0,"rc":186,"seen_pos":3.883,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":127984,"seen":3.9,"rssi":-15.0,"dst":0.919,"dir":268.1}, +{"hex":"a89086","type":"adsb_icao","flight":"AAL533 ","r":"N651AW","t":"A320","alt_baro":"ground","alt_geom":0,"gs":97.0,"track":262.74,"true_heading":264.38,"baro_rate":-128,"geom_rate":-64,"squawk":"2730","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":2016,"lat":33.938083,"lon":-118.397741,"nic":8,"rc":186,"seen_pos":0.333,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","geom_rate"],"messages":21492208,"seen":0.3,"rssi":-5.4,"dst":0.889,"dir":263.1}, +{"hex":"~31856a","type":"tisb_trackfile","alt_baro":"ground","gs":17.5,"track":261.56,"lat":33.939468,"lon":-118.397710,"nic":0,"rc":0,"seen_pos":31.989,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":143722,"seen":31.8,"rssi":-8.7,"dst":0.881,"dir":268.5}, +{"hex":"~318178","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":81.56,"lat":33.939444,"lon":-118.397169,"nic":0,"rc":186,"seen_pos":0.037,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":135093,"seen":0.0,"rssi":-4.7,"dst":0.854,"dir":268.4}, +{"hex":"~318e15","type":"tisb_other","alt_baro":"ground","gs":8.2,"lat":33.940178,"lon":-118.396668,"nic":0,"rc":186,"seen_pos":21.019,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":132012,"seen":21.0,"rssi":-8.0,"dst":0.829,"dir":271.3}, +{"hex":"~31869e","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":81.56,"lat":33.939584,"lon":-118.395839,"nic":0,"rc":186,"seen_pos":0.851,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":163684,"seen":0.9,"rssi":-4.1,"dst":0.788,"dir":268.8}, +{"hex":"~31810a","type":"tisb_other","alt_baro":"ground","gs":9.2,"lat":33.939689,"lon":-118.395596,"nic":0,"rc":186,"seen_pos":53.009,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":147113,"seen":52.9,"rssi":-5.3,"dst":0.775,"dir":269.3}, +{"hex":"~318b91","type":"tisb_other","alt_baro":"ground","gs":1.9,"track":264.38,"lat":33.939642,"lon":-118.395581,"nic":0,"rc":186,"seen_pos":0.057,"nac_p":8,"nac_v":0,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":138124,"seen":0.1,"rssi":-5.0,"dst":0.775,"dir":269.1}, +{"hex":"~3185ad","type":"tisb_other","alt_baro":"ground","gs":18.5,"track":81.56,"lat":33.939665,"lon":-118.395238,"nic":0,"rc":186,"seen_pos":6.913,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":128360,"seen":6.9,"rssi":-3.9,"dst":0.758,"dir":269.1}, +{"hex":"~318654","type":"tisb_other","alt_baro":"ground","gs":7.2,"lat":33.940003,"lon":-118.394423,"nic":0,"rc":186,"seen_pos":21.984,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":132007,"seen":22.0,"rssi":-7.6,"dst":0.717,"dir":270.7}, +{"hex":"~31869b","type":"tisb_other","alt_baro":"ground","gs":6.8,"track":261.56,"lat":33.939863,"lon":-118.394423,"nic":0,"rc":186,"seen_pos":7.940,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":150970,"seen":6.9,"rssi":-8.0,"dst":0.717,"dir":270.0}, +{"hex":"~31881b","type":"tisb_other","alt_baro":"ground","gs":13.2,"track":264.38,"lat":33.940003,"lon":-118.392491,"nic":0,"rc":186,"seen_pos":0.000,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":135687,"seen":0.0,"rssi":-8.1,"dst":0.621,"dir":270.8}, +{"hex":"~318400","type":"tisb_trackfile","alt_baro":"ground","gs":11.2,"track":84.38,"lat":33.939983,"lon":-118.391951,"nic":0,"rc":186,"seen_pos":0.050,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":144140,"seen":0.0,"rssi":-5.4,"dst":0.594,"dir":270.7}, +{"hex":"3c71a1","type":"adsb_icao","flight":"BCS341 ","r":"D-ALMA","t":"A332","alt_baro":"ground","gs":2.2,"true_heading":84.38,"squawk":"6726","emergency":"none","category":"A5","lat":33.935324,"lon":-118.390918,"nic":8,"rc":186,"seen_pos":4.386,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6713562,"seen":4.4,"rssi":-8.4,"dst":0.607,"dir":243.4}, +{"hex":"~318d7a","type":"tisb_trackfile","alt_baro":"ground","gs":16.5,"track":22.50,"lat":33.940762,"lon":-118.390367,"nic":0,"rc":186,"seen_pos":3.101,"nac_p":0,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":146640,"seen":2.4,"rssi":-7.7,"dst":0.518,"dir":276.0}, +{"hex":"~31886b","type":"tisb_other","alt_baro":"ground","gs":16.5,"track":25.31,"lat":33.940783,"lon":-118.390360,"nic":0,"rc":186,"seen_pos":15.961,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":148220,"seen":16.0,"rssi":-4.0,"dst":0.518,"dir":276.2}, +{"hex":"a519da","type":"adsb_icao","flight":"N428FF ","r":"N428FF","t":"C172","dbFlags":8,"alt_baro":3500,"alt_geom":3550,"gs":93.9,"track":141.05,"baro_rate":64,"geom_rate":64,"squawk":"1201","emergency":"none","category":"A1","lat":33.918777,"lon":-118.390353,"nic":10,"rc":25,"seen_pos":0.232,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2890171,"seen":0.0,"rssi":-6.5,"dst":1.366,"dir":202.1}, +{"hex":"a839bb","type":"adsr_icao","flight":"O01 ","r":"N629XB","alt_baro":"ground","gs":0.0,"category":"C1","lat":33.936512,"lon":-118.389788,"nic":8,"rc":186,"seen_pos":1.331,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1556565,"seen":1.3,"rssi":-16.4,"dst":0.526,"dir":247.6}, +{"hex":"~3183b0","type":"tisb_other","alt_baro":"ground","gs":22.5,"track":270.00,"lat":33.936314,"lon":-118.389316,"nic":0,"rc":186,"seen_pos":32.911,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","track","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":153491,"seen":32.6,"rssi":-3.5,"dst":0.509,"dir":245.3}, +{"hex":"a8b3d4","type":"adsb_icao","flight":"N66W ","r":"N66W","t":"U21","alt_baro":3475,"alt_geom":3525,"gs":127.0,"track":91.35,"baro_rate":-64,"geom_rate":-128,"squawk":"0257","emergency":"none","category":"A1","lat":33.852951,"lon":-118.387887,"nic":9,"rc":75,"seen_pos":0.096,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4913580,"seen":0.0,"rssi":-11.5,"dst":5.232,"dir":184.3}, +{"hex":"a4dd9d","type":"adsr_icao","flight":"O90 ","r":"N412XB","alt_baro":"ground","gs":0.0,"category":"C1","lat":33.937237,"lon":-118.383823,"nic":8,"rc":186,"seen_pos":1.236,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1886840,"seen":0.2,"rssi":-13.2,"dst":0.246,"dir":230.2}, +{"hex":"a6aa6e","type":"adsb_icao","flight":"ASA283 ","r":"N529AS","t":"B738","alt_baro":"ground","gs":0.1,"squawk":"1200","emergency":"none","category":"A3","lat":33.942365,"lon":-118.383365,"nic":8,"rc":186,"seen_pos":1.891,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18281468,"seen":1.9,"rssi":-5.8,"dst":0.224,"dir":312.2}, +{"hex":"a053cb","type":"adsb_icao","flight":"N120B ","r":"N120B","t":"BE55","alt_baro":1800,"alt_geom":1700,"gs":132.9,"track":250.20,"baro_rate":192,"geom_rate":256,"squawk":"0266","emergency":"none","category":"A1","lat":34.163105,"lon":-118.382721,"nic":9,"rc":75,"seen_pos":0.232,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1868961,"seen":0.0,"rssi":-2.3,"dst":13.405,"dir":359.4}, +{"hex":"a4b899","type":"adsb_icao","flight":"N403JL ","r":"N403JL","t":"DA62","alt_baro":4675,"alt_geom":4725,"gs":81.7,"track":104.89,"baro_rate":320,"geom_rate":384,"squawk":"0243","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4992,"lat":33.628647,"lon":-118.376340,"nic":9,"rc":75,"seen_pos":0.438,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2116148,"seen":0.0,"rssi":-6.2,"dst":18.686,"dir":179.4}, +{"hex":"a698d4","type":"adsb_icao","flight":"N524LR ","r":"N524LR","t":"H25C","alt_baro":28800,"alt_geom":30000,"gs":456.8,"track":82.58,"baro_rate":1152,"squawk":"6772","emergency":"none","category":"A2","nav_qnh":1013.6,"nav_altitude_mcp":28992,"lat":34.385971,"lon":-118.366363,"nic":8,"rc":186,"seen_pos":0.660,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2282242,"seen":0.0,"rssi":-8.1,"dst":26.794,"dir":1.4}, +{"hex":"a72c10","type":"adsb_icao","flight":"EJA561 ","r":"N561QS","t":"C68A","alt_baro":"ground","gs":0.0,"true_heading":258.75,"squawk":"6752","emergency":"none","category":"A2","lat":34.200314,"lon":-118.358866,"nic":9,"rc":75,"seen_pos":4.329,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":7750080,"seen":1.5,"rssi":-12.3,"dst":15.674,"dir":3.8}, +{"hex":"abdf4e","type":"adsb_icao","flight":"N864SL ","r":"N864SL","alt_baro":3675,"alt_geom":3650,"gs":71.6,"track":118.35,"baro_rate":256,"geom_rate":192,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":3616,"nav_modes":[],"lat":33.739380,"lon":-118.356554,"nic":9,"rc":75,"seen_pos":0.183,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":8706057,"seen":0.1,"rssi":-6.2,"dst":12.093,"dir":174.4}, +{"hex":"aaeade","type":"adsb_icao","flight":"N802SC ","r":"N802SC","t":"ULAC","alt_baro":4325,"alt_geom":4275,"gs":86.2,"track":93.99,"baro_rate":64,"geom_rate":128,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":4192,"nav_modes":[],"lat":33.716263,"lon":-118.353527,"nic":9,"rc":75,"seen_pos":0.347,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7956594,"seen":0.2,"rssi":-10.4,"dst":13.489,"dir":174.4}, +{"hex":"a8f529","type":"adsb_icao","flight":"N67657 ","r":"N67657","t":"C152","alt_baro":600,"alt_geom":450,"gs":52.0,"track":239.98,"baro_rate":64,"geom_rate":64,"squawk":"1200","emergency":"none","category":"A1","lat":33.808273,"lon":-118.352798,"nic":6,"rc":556,"seen_pos":4.953,"version":2,"nic_baro":0,"nac_p":0,"nac_v":1,"sil":3,"sil_type":"perhour","gva":0,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":5727980,"seen":0.0,"rssi":-3.8,"dst":8.016,"dir":170.2}, +{"hex":"a2abda","type":"adsb_icao","flight":"SKW3592 ","r":"N271SY","t":"E75L","alt_baro":5950,"alt_geom":6125,"gs":189.1,"track":81.48,"baro_rate":-960,"geom_rate":-960,"squawk":"6307","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":2208,"nav_modes":["autopilot","vnav","tcas"],"lat":34.027771,"lon":-118.352294,"nic":8,"rc":186,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":18294638,"seen":0.0,"rssi":-5.1,"dst":5.456,"dir":14.7}, +{"hex":"ab664e","type":"adsb_icao","flight":"N8333P ","r":"N8333P","t":"PA24","alt_baro":4025,"alt_geom":4025,"gs":167.6,"track":320.33,"baro_rate":0,"geom_rate":0,"squawk":"4611","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4000,"lat":33.901481,"lon":-118.347359,"nic":9,"rc":75,"seen_pos":0.482,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1991342,"seen":0.1,"rssi":-4.2,"dst":2.821,"dir":144.8}, +{"hex":"ab1fea","type":"adsb_icao","flight":"N816CT ","r":"N816CT","t":"SR20","alt_baro":1100,"alt_geom":1000,"gs":105.2,"track":86.19,"baro_rate":-64,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":1088,"nav_heading":324.14,"nav_modes":[],"lat":33.908844,"lon":-118.341027,"nic":9,"rc":75,"seen_pos":0.037,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3474860,"seen":0.0,"rssi":-4.6,"dst":2.691,"dir":133.8}, +{"hex":"acd369","type":"tisb_icao","flight":"N9252P ","r":"N9252P","t":"PA24","alt_baro":150,"alt_geom":25,"gs":31.4,"track":307.23,"baro_rate":0,"geom_rate":0,"squawk":"1507","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_heading":257.34,"lat":33.804565,"lon":-118.340411,"nic":0,"rc":0,"seen_pos":0.178,"version":2,"nic_baro":1,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","altitude","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":203537,"seen":0.0,"rssi":-2.8,"dst":8.359,"dir":166.3}, +{"hex":"a7e580","type":"adsb_icao","flight":"N608FM ","r":"N608FM","t":"C152","alt_baro":"ground","gs":13.8,"track":126.56,"category":"A1","lat":33.800940,"lon":-118.338890,"nic":9,"rc":75,"seen_pos":4.391,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1478844,"seen":4.4,"rssi":-20.7,"dst":8.589,"dir":166.2}, +{"hex":"abe6bc","type":"adsb_icao","flight":"N866SL ","r":"N866SL","alt_baro":"ground","gs":24.5,"mag_heading":295.31,"true_heading":306.92,"category":"A1","lat":33.800560,"lon":-118.336991,"nic":8,"rc":75,"seen_pos":2.947,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6764356,"seen":2.9,"rssi":-23.1,"dst":8.634,"dir":165.6}, +{"hex":"ab29df","type":"adsr_icao","flight":"N8183K ","r":"N8183K","t":"LGEZ","alt_baro":3475,"alt_geom":3600,"gs":140.8,"track":300.75,"baro_rate":0,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":33.461197,"lon":-118.336212,"nic":0,"rc":186,"seen_pos":0.711,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":8611,"seen":0.7,"rssi":-10.2,"dst":28.822,"dir":175.6}, +{"hex":"a4afa5","type":"adsb_icao","r":"N40047","alt_baro":"ground","gs":0.0,"true_heading":222.19,"category":"A7","lat":33.797704,"lon":-118.336086,"nic":8,"rc":75,"seen_pos":46.230,"version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":15706,"seen":46.2,"rssi":-24.5,"dst":8.811,"dir":165.6}, +{"hex":"a9b406","type":"adsr_icao","flight":"N724SP ","r":"N724SP","t":"C172","alt_baro":3200,"alt_geom":3225,"gs":100.0,"track":88.85,"baro_rate":-512,"geom_rate":-512,"squawk":"1201","emergency":"none","category":"A1","lat":33.863937,"lon":-118.335085,"nic":0,"rc":186,"seen_pos":0.050,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":893687,"seen":0.1,"rssi":-7.8,"dst":5.078,"dir":153.8}, +{"hex":"a7be3b","type":"adsr_icao","r":"N5985W","t":"P28A","alt_baro":"ground","gs":14.2,"track":50.62,"squawk":"1200","emergency":"none","lat":33.798477,"lon":-118.333950,"nic":0,"rc":0,"seen_pos":4.961,"sil_type":"perhour","mlat":[],"tisb":[],"messages":220887,"seen":4.7,"rssi":-20.9,"dst":8.794,"dir":164.8}, +{"hex":"a6a5c3","type":"adsb_icao","flight":"N5273U ","r":"N5273U","t":"C172","alt_baro":3100,"alt_geom":3050,"gs":87.1,"track":41.74,"baro_rate":-256,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A1","lat":33.645996,"lon":-118.322754,"nic":9,"rc":75,"seen_pos":0.183,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":460467,"seen":0.2,"rssi":-5.2,"dst":17.873,"dir":170.8}, +{"hex":"aa9bfd","type":"adsb_icao","flight":"N783DG ","r":"N783DG","t":"C172","alt_baro":1625,"alt_geom":1500,"gs":87.1,"track":92.63,"baro_rate":192,"geom_rate":1152,"squawk":"1200","emergency":"none","category":"A1","lat":33.812752,"lon":-118.321609,"nic":9,"rc":75,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":5997753,"seen":0.0,"rssi":-5.5,"dst":8.168,"dir":159.1}, +{"hex":"a114db","type":"adsb_icao","flight":"N169TW ","r":"N169TW","t":"ULAC","alt_baro":925,"alt_geom":700,"gs":83.0,"track":323.82,"baro_rate":-960,"geom_rate":-640,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":1088,"lat":33.787475,"lon":-118.319721,"nic":9,"rc":75,"seen_pos":0.220,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":6801590,"seen":0.1,"rssi":-3.4,"dst":9.630,"dir":161.8}, +{"hex":"a9e007","type":"adsr_icao","flight":"N7350S ","r":"N7350S","t":"C182","alt_baro":900,"alt_geom":775,"gs":84.1,"track":304.82,"baro_rate":-1024,"geom_rate":-1024,"squawk":"1200","emergency":"none","category":"A1","lat":33.790604,"lon":-118.319503,"nic":0,"rc":0,"seen_pos":0.074,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7631,"seen":0.0,"rssi":-8.7,"dst":9.455,"dir":161.4}, +{"hex":"~298285","type":"tisb_other","alt_baro":5175,"alt_geom":5950,"gs":70.4,"track":101.47,"geom_rate":384,"lat":33.736314,"lon":-118.318977,"nic":6,"rc":926,"seen_pos":0.660,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":25193,"seen":0.7,"rssi":-4.9,"dst":12.594,"dir":166.0}, +{"hex":"ace39f","type":"adsb_icao","flight":"N93DD ","r":"N93DD","t":"B407","dbFlags":8,"alt_baro":1200,"alt_geom":1225,"gs":75.6,"track":294.19,"baro_rate":-64,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A7","lat":34.084804,"lon":-118.317604,"nic":10,"rc":25,"seen_pos":0.119,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":9334815,"seen":0.0,"rssi":-6.4,"dst":9.241,"dir":19.6}, +{"hex":"ad7c38","type":"adsr_icao","flight":"CBT80 ","r":"N9680B","t":"C208","alt_baro":900,"alt_geom":875,"gs":166.9,"track":28.25,"geom_rate":0,"category":"A1","lat":33.574677,"lon":-118.306050,"nic":0,"rc":186,"seen_pos":13.809,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1807151,"seen":13.8,"rssi":-1.8,"dst":22.234,"dir":170.4}, +{"hex":"abd429","type":"adsb_icao","flight":"N861SL ","r":"N861SL","t":"ULAC","alt_baro":1200,"alt_geom":1025,"gs":75.8,"track":126.42,"baro_rate":-192,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":1088,"lat":33.796087,"lon":-118.304157,"nic":9,"rc":75,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7486415,"seen":0.1,"rssi":-7.8,"dst":9.424,"dir":156.3}, +{"hex":"a0a36d","type":"adsb_icao","flight":"N140HP ","r":"N140HP","t":"GA8","alt_baro":5525,"alt_geom":5700,"gs":93.2,"track":141.53,"baro_rate":64,"geom_rate":-64,"squawk":"0213","emergency":"none","category":"A1","lat":34.131868,"lon":-118.296547,"nic":9,"rc":75,"seen_pos":0.126,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":4517457,"seen":0.0,"rssi":-4.7,"dst":12.254,"dir":19.8}, +{"hex":"ae0977","type":"adsb_icao","flight":"CNV4705 ","r":"165834","t":"B737","dbFlags":1,"alt_baro":6275,"alt_geom":6425,"gs":269.0,"track":130.02,"geom_rate":3712,"squawk":"1067","emergency":"none","category":"A3","lat":33.076994,"lon":-118.276174,"nic":8,"rc":186,"seen_pos":0.230,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3970146,"seen":0.2,"rssi":-10.9,"dst":52.067,"dir":174.2}, +{"hex":"ad6fb5","type":"adsb_icao","flight":"N965LB ","r":"N965LB","t":"SLG4","alt_baro":1500,"alt_geom":1350,"gs":87.1,"track":266.71,"baro_rate":128,"geom_rate":320,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":1088,"nav_modes":[],"lat":33.761078,"lon":-118.268046,"nic":9,"rc":75,"seen_pos":0.057,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":9694289,"seen":0.1,"rssi":-6.5,"dst":12.099,"dir":152.5}, +{"hex":"a8a94f","type":"adsr_icao","flight":"N65710 ","r":"N65710","t":"C172","alt_baro":3100,"alt_geom":3225,"gs":66.7,"track":152.28,"baro_rate":-640,"geom_rate":-576,"squawk":"1200","emergency":"none","category":"A1","lat":33.711594,"lon":-118.267150,"nic":0,"rc":186,"seen_pos":0.288,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3791224,"seen":0.2,"rssi":-16.8,"dst":14.816,"dir":157.6}, +{"hex":"a20467","type":"adsb_icao","flight":"N229WC ","r":"N229WC","t":"C172","alt_baro":4525,"alt_geom":4575,"gs":96.3,"track":203.90,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4512,"lat":33.694748,"lon":-118.266813,"nic":9,"rc":75,"seen_pos":0.301,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":5571397,"seen":0.1,"rssi":-4.1,"dst":15.763,"dir":159.0}, +{"hex":"a1e5b3","type":"adsb_icao","flight":"N221LA ","r":"N221LA","t":"AS50","alt_baro":575,"alt_geom":450,"gs":46.7,"track":316.74,"baro_rate":-256,"geom_rate":-192,"squawk":"0216","emergency":"none","category":"A7","nav_qnh":1013.6,"nav_altitude_mcp":10016,"lat":33.969633,"lon":-118.256378,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2545178,"seen":0.0,"rssi":-7.3,"dst":6.413,"dir":73.8}, +{"hex":"~298edc","type":"tisb_trackfile","alt_baro":600,"alt_geom":1375,"gs":55.5,"track":336.67,"geom_rate":0,"lat":34.029739,"lon":-118.255266,"nic":0,"rc":926,"seen_pos":2.195,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":13002,"seen":1.8,"rssi":-5.4,"dst":8.228,"dir":49.0}, +{"hex":"aae1e1","type":"adsr_icao","flight":"N800AD ","r":"N800AD","t":"BE76","alt_baro":1100,"alt_geom":1050,"gs":82.2,"track":166.64,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.773276,"lon":-118.249454,"nic":0,"rc":186,"seen_pos":1.391,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":457769,"seen":1.0,"rssi":-4.5,"dst":11.934,"dir":146.9}, +{"hex":"ab834e","type":"adsr_icao","flight":"N8408E ","r":"N8408E","t":"P28A","alt_baro":3400,"alt_geom":3325,"gs":94.1,"track":44.57,"baro_rate":-512,"geom_rate":-512,"squawk":"1200","emergency":"none","category":"A1","lat":33.650564,"lon":-118.246078,"nic":0,"rc":0,"seen_pos":0.147,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3316741,"seen":0.0,"rssi":-3.5,"dst":18.610,"dir":158.9}, +{"hex":"a705ee","type":"adsb_icao","flight":"N5513L ","r":"N5513L","t":"C152","alt_baro":"ground","alt_geom":-25,"gs":15.5,"track":267.19,"baro_rate":-448,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.889652,"lon":-118.243818,"nic":9,"rc":75,"seen_pos":7.753,"version":2,"nic_baro":0,"nac_p":0,"nac_v":2,"sil":2,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","baro_rate","nac_p","sil","sil_type"],"messages":6713294,"seen":3.3,"rssi":-12.4,"dst":7.426,"dir":113.9}, +{"hex":"a3cc6d","type":"adsb_icao","flight":"N344CS ","r":"N344CS","t":"DHC6","alt_baro":5000,"alt_geom":5125,"gs":161.4,"track":122.61,"geom_rate":64,"squawk":"4656","emergency":"none","category":"A1","lat":32.981735,"lon":-118.235962,"nic":9,"rc":75,"seen_pos":0.301,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2279290,"seen":0.2,"rssi":-8.6,"dst":57.977,"dir":172.8}, +{"hex":"a4ba51","type":"adsb_icao","flight":"N4031R ","r":"N4031R","alt_baro":1125,"alt_geom":975,"gs":121.1,"track":48.01,"baro_rate":64,"geom_rate":64,"squawk":"1200","emergency":"none","category":"A7","lat":33.877134,"lon":-118.223534,"nic":9,"rc":75,"seen_pos":0.119,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":59075,"seen":0.1,"rssi":-4.7,"dst":8.660,"dir":115.7}, +{"hex":"71c008","type":"adsb_icao","flight":"KAL011 ","r":"HL8008","t":"B77W","alt_baro":2425,"alt_geom":2400,"gs":187.8,"track":235.63,"baro_rate":-128,"geom_rate":64,"squawk":"1117","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":2400,"nav_heading":251.02,"lat":33.974801,"lon":-118.220730,"nic":8,"rc":186,"seen_pos":0.063,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":9055284,"seen":0.0,"rssi":-8.0,"dst":8.206,"dir":75.1}, +{"hex":"a1c430","type":"adsr_icao","flight":"N2126X ","r":"N2126X","t":"PA44","alt_baro":1700,"alt_geom":1575,"gs":132.0,"track":338.68,"baro_rate":-960,"geom_rate":-1024,"squawk":"1200","emergency":"none","category":"A1","lat":33.633957,"lon":-118.201680,"nic":0,"rc":0,"seen_pos":0.301,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1104639,"seen":0.3,"rssi":-9.0,"dst":20.409,"dir":154.1}, +{"hex":"a294c1","type":"adsb_icao","flight":"N2656G ","r":"N2656G","t":"C172","dbFlags":8,"alt_baro":1000,"alt_geom":950,"gs":95.0,"track":91.21,"baro_rate":-320,"geom_rate":-320,"squawk":"1200","emergency":"none","category":"A1","lat":33.805527,"lon":-118.190470,"nic":10,"rc":25,"seen_pos":0.000,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3884465,"seen":0.0,"rssi":-10.1,"dst":12.412,"dir":130.5}, +{"hex":"aacd96","type":"adsb_icao","flight":"UAL1503 ","r":"N79541","t":"B738","alt_baro":14875,"alt_geom":15500,"gs":378.0,"track":42.21,"baro_rate":2560,"squawk":"1050","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":23008,"nav_heading":26.72,"lat":33.682779,"lon":-118.177185,"nic":8,"rc":186,"seen_pos":0.294,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21306145,"seen":0.0,"rssi":-6.5,"dst":18.456,"dir":146.7}, +{"hex":"ab063f","type":"adsb_icao","flight":"N8094Q ","r":"N8094Q","t":"R22","alt_baro":1100,"alt_geom":950,"gs":86.4,"track":246.10,"baro_rate":-384,"geom_rate":-320,"squawk":"1200","emergency":"none","category":"A7","lat":33.755539,"lon":-118.168609,"nic":9,"rc":75,"seen_pos":0.505,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1495522,"seen":0.3,"rssi":-4.4,"dst":15.284,"dir":136.3}, +{"hex":"abe2b1","type":"adsr_icao","flight":"N865PB ","r":"N865PB","t":"R44","alt_baro":100,"alt_geom":-50,"gs":1.2,"track":180.00,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","lat":33.814940,"lon":-118.159504,"nic":0,"rc":186,"seen_pos":0.189,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1734052,"seen":0.2,"rssi":-5.4,"dst":13.307,"dir":124.2}, +{"hex":"ade672","type":"adsr_icao","flight":"N995NR ","r":"N995NR","t":"R22","alt_baro":100,"alt_geom":-25,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","lat":33.815406,"lon":-118.159046,"nic":0,"rc":0,"seen_pos":1.997,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1988629,"seen":1.4,"rssi":-5.4,"dst":13.310,"dir":124.1}, +{"hex":"acade4","type":"adsb_icao","flight":"N916KP ","r":"N916KP","t":"FA50","alt_baro":"ground","gs":0.0,"true_heading":0.00,"squawk":"6364","emergency":"none","category":"A2","lat":33.816376,"lon":-118.157903,"nic":8,"rc":186,"seen_pos":38.868,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":517327,"seen":38.9,"rssi":-11.8,"dst":13.325,"dir":123.7}, +{"hex":"a8137e","type":"adsb_icao","flight":"N6197D ","r":"N6197D","t":"C510","alt_baro":50,"alt_geom":-75,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":0,"squawk":"5361","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":2016,"lat":33.812393,"lon":-118.156053,"nic":9,"rc":75,"seen_pos":47.050,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","geom_rate"],"messages":85277,"seen":45.6,"rssi":-2.5,"dst":13.536,"dir":124.4}, +{"hex":"aa3abe","type":"adsb_icao","flight":"N75840 ","r":"N75840","t":"C172","alt_baro":100,"alt_geom":-75,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.813446,"lon":-118.155212,"nic":9,"rc":75,"seen_pos":2.015,"version":2,"nic_baro":0,"nac_p":0,"nac_v":1,"sil":0,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate","nac_p","sil","sil_type"],"messages":4522922,"seen":1.4,"rssi":-14.1,"dst":13.535,"dir":124.0}, +{"hex":"a50f40","type":"adsb_icao","flight":"SWA1084 ","r":"N425LV","t":"B737","alt_baro":32175,"alt_geom":33575,"gs":399.2,"ias":256,"tas":422,"mach":0.716,"wd":194,"ws":36,"oat":-44,"tat":-21,"track":141.41,"track_rate":0.00,"roll":0.18,"mag_heading":133.77,"true_heading":145.32,"baro_rate":-2240,"geom_rate":-2208,"squawk":"7334","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_fms":6016,"lat":33.835237,"lon":-118.151321,"nic":8,"rc":186,"seen_pos":0.434,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":25509102,"seen":0.0,"rssi":-9.3,"dst":13.015,"dir":118.8}, +{"hex":"a3e846","type":"adsb_icao","flight":"N3508J ","r":"N3508J","t":"C172","dbFlags":8,"alt_baro":0,"alt_geom":-50,"gs":46.0,"track":268.75,"baro_rate":0,"geom_rate":0,"squawk":"0207","emergency":"none","category":"A1","lat":33.813904,"lon":-118.150784,"nic":10,"rc":25,"seen_pos":3.307,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3841583,"seen":0.1,"rssi":-7.9,"dst":13.703,"dir":123.4}, +{"hex":"aa72f5","type":"adsb_icao","flight":"SWA851 ","r":"N7721E","t":"B737","alt_baro":"ground","gs":0.0,"true_heading":135.00,"squawk":"6732","emergency":"none","category":"A3","lat":33.814777,"lon":-118.149576,"nic":8,"rc":186,"seen_pos":3.173,"version":2,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":20970641,"seen":3.2,"rssi":-13.9,"dst":13.724,"dir":123.1}, +{"hex":"aa4e52","type":"adsb_icao","flight":"SWA3015 ","r":"N763SW","t":"B737","alt_baro":"ground","gs":0.0,"true_heading":90.00,"squawk":"7635","emergency":"none","category":"A3","lat":33.819805,"lon":-118.146043,"nic":8,"rc":186,"seen_pos":2.458,"version":2,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24586569,"seen":0.2,"rssi":-3.9,"dst":13.711,"dir":121.7}, +{"hex":"a74c35","type":"adsb_icao","flight":"N57BM ","r":"N57BM","t":"C172","alt_baro":1900,"alt_geom":1850,"gs":87.1,"track":92.63,"baro_rate":-64,"geom_rate":-64,"squawk":"0215","emergency":"none","category":"A1","lat":33.691498,"lon":-118.142544,"nic":9,"rc":75,"seen_pos":0.166,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2599181,"seen":0.0,"rssi":-9.0,"dst":19.044,"dir":141.5}, +{"hex":"ab3681","type":"adsb_icao","flight":"N821VV ","r":"N821VV","t":"BE9L","alt_baro":12700,"alt_geom":13250,"gs":217.0,"ias":184,"mach":0.352,"track":149.53,"mag_heading":140.10,"true_heading":151.79,"baro_rate":-832,"squawk":"4755","emergency":"none","category":"A1","lat":34.479660,"lon":-118.141251,"nic":9,"rc":75,"seen_pos":0.080,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1419660,"seen":0.0,"rssi":-13.2,"dst":34.511,"dir":20.0}, +{"hex":"aa3b12","type":"adsb_icao","flight":"N7587D ","r":"N7587D","t":"BE60","alt_baro":300,"alt_geom":100,"gs":108.2,"track":313.88,"baro_rate":-704,"geom_rate":-448,"squawk":"4614","emergency":"none","category":"A1","lat":33.804428,"lon":-118.135202,"nic":9,"rc":75,"seen_pos":0.102,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":14510,"seen":0.1,"rssi":-6.8,"dst":14.665,"dir":123.6}, +{"hex":"aaea78","type":"adsb_icao","flight":"NASA802 ","r":"N802NA","t":"GLF3","alt_baro":4500,"alt_geom":4575,"gs":230.1,"track":65.89,"geom_rate":-896,"squawk":"4764","emergency":"none","category":"A2","nav_qnh":1014.4,"nav_altitude_mcp":4512,"lat":34.671827,"lon":-118.133583,"nic":10,"rc":25,"seen_pos":0.231,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":347532,"seen":0.2,"rssi":-5.3,"dst":45.616,"dir":15.5}, +{"hex":"a3418e","type":"adsb_icao","flight":"N309JE ","r":"N309JE","t":"CL30","alt_baro":8025,"alt_geom":8325,"gs":294.7,"track":283.94,"baro_rate":-64,"geom_rate":-64,"squawk":"7455","emergency":"none","category":"A2","nav_qnh":1012.0,"nav_altitude_mcp":8000,"nav_heading":271.41,"lat":34.172555,"lon":-118.108921,"nic":8,"rc":186,"seen_pos":0.315,"version":2,"nic_baro":1,"nac_p":10,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4826451,"seen":0.0,"rssi":-7.8,"dst":19.418,"dir":43.9}, +{"hex":"a6f164","type":"adsr_icao","flight":"N5466D ","r":"N5466D","t":"C172","alt_baro":3800,"alt_geom":3775,"gs":35.9,"track":112.99,"baro_rate":-448,"geom_rate":-448,"squawk":"0260","emergency":"none","category":"A1","lat":33.668720,"lon":-118.105145,"nic":0,"rc":0,"seen_pos":1.493,"nic_baro":0,"nac_p":6,"nac_v":1,"sil":3,"sil_type":"perhour","gva":0,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":990323,"seen":1.2,"rssi":-4.6,"dst":21.286,"dir":139.8}, +{"hex":"~298225","type":"tisb_trackfile","alt_baro":8000,"alt_geom":8775,"gs":289.6,"track":283.99,"geom_rate":0,"lat":34.171783,"lon":-118.104597,"nic":0,"rc":0,"seen_pos":2.185,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":3123,"seen":2.2,"rssi":0.0,"dst":19.535,"dir":44.5}, +{"hex":"ab6a1b","type":"adsb_icao","flight":"N8344A ","r":"N8344A","t":"PA44","dbFlags":8,"alt_baro":1300,"alt_geom":1175,"gs":95.5,"track":316.27,"baro_rate":-576,"geom_rate":-640,"squawk":"0246","emergency":"none","category":"A1","lat":33.768402,"lon":-118.091817,"nic":10,"rc":25,"seen_pos":0.000,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1892873,"seen":0.0,"rssi":-8.6,"dst":17.687,"dir":125.5}, +{"hex":"a047db","type":"adsb_icao","flight":"SKW5583 ","r":"N117SY","t":"E75L","alt_baro":34000,"alt_geom":35350,"gs":436.9,"ias":263,"tas":444,"mach":0.760,"wd":207,"ws":70,"oat":-48,"tat":-22,"track":296.51,"track_rate":0.25,"roll":5.98,"mag_heading":275.10,"true_heading":286.79,"baro_rate":64,"geom_rate":0,"squawk":"0715","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":34016,"nav_altitude_fms":34000,"nav_modes":["autopilot","vnav","tcas"],"lat":34.643291,"lon":-118.087406,"nic":8,"rc":186,"seen_pos":0.308,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1529971,"seen":0.0,"rssi":-7.2,"dst":44.660,"dir":18.9}, +{"hex":"a054ad","type":"adsb_icao","flight":"N120LA ","r":"N120LA","t":"B412","alt_baro":5800,"alt_geom":5925,"gs":81.2,"track":99.93,"geom_rate":192,"squawk":"1206","emergency":"none","category":"A7","lat":34.220444,"lon":-118.066649,"nic":10,"rc":25,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1153523,"seen":0.0,"rssi":-7.9,"dst":22.950,"dir":42.7}, +{"hex":"a1801c","type":"adsb_icao","flight":"SKW3333 ","r":"N196SY","t":"E75L","alt_baro":25275,"alt_geom":26400,"gs":370.7,"ias":260,"tas":390,"mach":0.640,"oat":-29,"tat":-9,"track":133.25,"track_rate":0.00,"roll":-0.18,"mag_heading":124.98,"true_heading":136.50,"baro_rate":-1408,"geom_rate":-1440,"squawk":"1753","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":15008,"nav_altitude_fms":15008,"nav_modes":["autopilot","vnav","tcas"],"lat":33.646683,"lon":-118.065472,"nic":8,"rc":186,"seen_pos":0.183,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22354234,"seen":0.0,"rssi":-7.5,"dst":23.583,"dir":138.2}, +{"hex":"ad6553","type":"adsb_icao","flight":"FTH962 ","r":"N962TX","t":"C750","alt_baro":5325,"alt_geom":5450,"gs":280.1,"track":263.03,"baro_rate":-1280,"geom_rate":-1472,"squawk":"4601","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":1888,"lat":33.972473,"lon":-118.056393,"nic":8,"rc":186,"seen_pos":0.232,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":8371592,"seen":0.0,"rssi":-10.2,"dst":16.236,"dir":83.0}, +{"hex":"4aca64","type":"adsb_icao","flight":"SAS932 ","r":"SE-RSD","t":"A359","alt_baro":16450,"alt_geom":17200,"gs":438.3,"track":48.05,"baro_rate":1408,"squawk":"1347","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":23008,"nav_heading":38.67,"lat":33.823471,"lon":-118.055327,"nic":8,"rc":186,"seen_pos":0.301,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":4998318,"seen":0.0,"rssi":-9.7,"dst":17.629,"dir":113.3}, +{"hex":"a107b7","type":"adsb_icao","flight":"N1658F ","r":"N1658F","t":"C172","alt_baro":1275,"alt_geom":1200,"gs":92.7,"track":23.52,"baro_rate":-640,"geom_rate":-1088,"squawk":"1200","emergency":"none","category":"A1","lat":34.098257,"lon":-118.046150,"nic":9,"rc":75,"seen_pos":0.126,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1894297,"seen":0.1,"rssi":-8.6,"dst":19.145,"dir":60.1}, +{"hex":"a1a087","type":"mlat","flight":"N2037T ","r":"N2037T","t":"GLID","alt_baro":275,"gs":47.0,"track":155.00,"baro_rate":-495,"squawk":"1202","emergency":"none","category":"B1","lat":33.799854,"lon":-118.038924,"nic":0,"rc":0,"seen_pos":0.067,"version":0,"alert":0,"spi":0,"mlat":["gs","track","baro_rate","lat","lon","nic","rc"],"tisb":[],"messages":307345,"seen":0.1,"rssi":-13.9,"dst":18.969,"dir":116.2}, +{"hex":"~298779","type":"tisb_trackfile","alt_baro":300,"alt_geom":2675,"gs":45.2,"track":174.92,"geom_rate":-512,"lat":33.799850,"lon":-118.037334,"nic":0,"rc":0,"seen_pos":0.000,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":16699,"seen":0.0,"rssi":-8.2,"dst":19.014,"dir":116.0}, +{"hex":"a9dba1","type":"adsb_icao","flight":"N734TS ","r":"N734TS","t":"C172","alt_baro":3650,"alt_geom":3575,"gs":103.9,"track":134.61,"baro_rate":-64,"geom_rate":0,"squawk":"0265","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":3488,"nav_heading":303.05,"lat":33.562866,"lon":-118.035316,"nic":9,"rc":75,"seen_pos":0.505,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3002936,"seen":0.3,"rssi":-4.1,"dst":28.433,"dir":142.7}, +{"hex":"0d0b4b","type":"adsb_icao","flight":"AMX642 ","r":"XA-MAT","t":"B38M","alt_baro":7250,"alt_geom":7525,"gs":270.2,"track":325.25,"baro_rate":-576,"geom_rate":-576,"squawk":"7331","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":7008,"nav_heading":312.19,"lat":33.755356,"lon":-118.031784,"nic":8,"rc":186,"seen_pos":0.197,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":18648304,"seen":0.0,"rssi":-9.0,"dst":20.597,"dir":122.4}, +{"hex":"ac77bd","type":"adsb_icao","flight":"N902MR ","r":"N902MR","t":"DA40","alt_baro":"ground","gs":0.0,"squawk":"1200","emergency":"none","category":"A1","lat":34.090646,"lon":-118.031344,"nic":9,"rc":75,"seen_pos":0.798,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":4318635,"seen":0.8,"rssi":-6.7,"dst":19.573,"dir":62.4}, +{"hex":"~298bdb","type":"tisb_other","alt_baro":3125,"alt_geom":3900,"gs":96.3,"track":147.30,"geom_rate":0,"lat":33.794178,"lon":-118.011761,"nic":0,"rc":926,"seen_pos":1.418,"nac_p":6,"nac_v":7,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":35145,"seen":1.2,"rssi":-16.8,"dst":20.336,"dir":115.4}, +{"hex":"ac310a","type":"adsb_icao","flight":"N885GM ","r":"N885GM","t":"GLF5","dbFlags":8,"alt_baro":12500,"alt_geom":13100,"gs":367.2,"ias":307,"tas":374,"mach":0.580,"wd":168,"ws":22,"oat":1,"tat":19,"track":262.49,"track_rate":0.00,"roll":0.35,"mag_heading":247.50,"true_heading":259.19,"baro_rate":-448,"geom_rate":-1024,"squawk":"1102","emergency":"none","category":"A3","nav_qnh":1014.4,"nav_altitude_mcp":8000,"nav_altitude_fms":10000,"nav_modes":["autopilot","vnav","tcas"],"lat":34.637844,"lon":-118.010731,"nic":8,"rc":186,"seen_pos":0.063,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2282111,"seen":0.0,"rssi":-5.3,"dst":45.737,"dir":23.5}, +{"hex":"a47646","type":"adsb_icao","flight":"N387LA ","r":"N387LA","t":"DA40","alt_baro":2900,"alt_geom":2875,"gs":96.3,"track":80.44,"baro_rate":-128,"geom_rate":128,"squawk":"0202","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":2912,"lat":34.047422,"lon":-117.995453,"nic":9,"rc":75,"seen_pos":0.119,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1108489,"seen":0.0,"rssi":-9.8,"dst":20.204,"dir":71.3}, +{"hex":"a9dde7","type":"adsb_icao","flight":"N735CY ","r":"N735CY","t":"C182","alt_baro":200,"alt_geom":100,"gs":69.9,"track":260.94,"geom_rate":896,"squawk":"1200","emergency":"none","category":"A2","lat":33.871582,"lon":-117.982402,"nic":9,"rc":75,"seen_pos":0.102,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6544,"seen":0.0,"rssi":-17.7,"dst":20.234,"dir":101.6}, +{"hex":"a29405","type":"adsb_icao","flight":"N26504 ","r":"N26504","t":"C172","alt_baro":4000,"alt_geom":4125,"gs":93.9,"track":104.18,"baro_rate":64,"geom_rate":128,"squawk":"0275","emergency":"none","category":"A1","lat":34.091263,"lon":-117.969790,"nic":8,"rc":186,"seen_pos":0.371,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3492864,"seen":0.0,"rssi":-4.0,"dst":22.349,"dir":65.9}, +{"hex":"a3331b","type":"adsb_icao","flight":"N305NK ","r":"N305NK","t":"R22","alt_baro":1000,"alt_geom":850,"gs":61.4,"track":102.23,"baro_rate":448,"geom_rate":320,"squawk":"1200","emergency":"none","category":"A7","lat":34.036606,"lon":-117.960429,"nic":9,"rc":75,"seen_pos":0.577,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":751288,"seen":0.2,"rssi":-4.7,"dst":21.682,"dir":74.3}, +{"hex":"a23434","type":"adsb_icao","flight":"N241FA ","r":"N241FA","t":"B412","alt_baro":1100,"alt_geom":1075,"gs":109.4,"track":274.72,"baro_rate":-64,"geom_rate":128,"squawk":"4202","emergency":"none","category":"A7","lat":33.870987,"lon":-117.937111,"nic":9,"rc":75,"seen_pos":0.438,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":37378,"seen":0.3,"rssi":-10.3,"dst":22.455,"dir":100.5}, +{"hex":"a1f894","type":"adsb_icao","flight":"N226PD ","r":"N226PD","t":"AS50","alt_baro":1200,"alt_geom":1150,"gs":56.1,"track":176.93,"baro_rate":576,"geom_rate":384,"squawk":"4301","emergency":"none","category":"A7","lat":33.809913,"lon":-117.932568,"nic":9,"rc":75,"seen_pos":0.166,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":964230,"seen":0.1,"rssi":-6.6,"dst":23.630,"dir":109.2}, +{"hex":"ad8e69","type":"adsr_icao","flight":"N9727J ","r":"N9727J","t":"P28A","alt_baro":3500,"alt_geom":3500,"gs":106.2,"track":303.09,"baro_rate":64,"geom_rate":64,"squawk":"0210","emergency":"none","category":"A1","lat":34.047562,"lon":-117.932568,"nic":0,"rc":0,"seen_pos":1.069,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1057840,"seen":0.9,"rssi":-7.1,"dst":23.194,"dir":73.7}, +{"hex":"ab248a","type":"adsb_icao","flight":"NASA817 ","r":"N817NA","t":"DC87","alt_baro":6925,"alt_geom":7175,"gs":224.9,"track":72.93,"baro_rate":0,"geom_rate":-64,"squawk":"4651","emergency":"none","category":"A5","nav_altitude_mcp":7008,"lat":33.820679,"lon":-117.914298,"nic":8,"rc":186,"seen_pos":0.166,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":3,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":554292,"seen":0.0,"rssi":-6.0,"dst":24.292,"dir":107.0}, +{"hex":"abe6f4","type":"adsb_icao","flight":"N866US ","r":"N866US","t":"DA40","alt_baro":1925,"alt_geom":1850,"gs":100.0,"track":348.47,"baro_rate":704,"geom_rate":704,"squawk":"4710","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4992,"lat":33.726258,"lon":-117.896290,"nic":9,"rc":75,"seen_pos":0.438,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2333202,"seen":0.1,"rssi":-6.3,"dst":27.322,"dir":117.9}, +{"hex":"7802fe","type":"adsb_icao","flight":"CSS7001 ","r":"B-2423","t":"B744","alt_baro":7700,"alt_geom":7950,"gs":257.2,"track":343.04,"baro_rate":-1600,"geom_rate":-1408,"squawk":"1116","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":7008,"nav_heading":296.02,"lat":33.701019,"lon":-117.893558,"nic":8,"rc":186,"seen_pos":0.458,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7703583,"seen":0.0,"rssi":-5.6,"dst":28.186,"dir":120.4}, +{"hex":"a2cd86","type":"adsb_icao","flight":"N28VJ ","r":"N28VJ","t":"SF50","alt_baro":"ground","gs":0.0,"mag_heading":120.94,"true_heading":132.41,"squawk":"4753","emergency":"none","category":"A1","lat":33.675342,"lon":-117.872143,"nic":9,"rc":75,"seen_pos":3.952,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3656044,"seen":1.0,"rssi":-3.0,"dst":29.903,"dir":121.9}, +{"hex":"a0e211","type":"adsb_icao","flight":"N156SH ","r":"N156SH","t":"R22","alt_baro":75,"alt_geom":-50,"gs":0.7,"track":0.00,"baro_rate":0,"geom_rate":0,"squawk":"4300","emergency":"none","category":"A1","lat":33.675330,"lon":-117.871857,"nic":8,"rc":186,"seen_pos":1.047,"version":2,"nic_baro":1,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3855395,"seen":0.1,"rssi":-2.9,"dst":29.916,"dir":121.9}, +{"hex":"a20338","type":"adsb_icao","flight":"N229J ","r":"N229J","t":"SR20","alt_baro":"ground","gs":2.8,"true_heading":286.88,"category":"A1","lat":33.674271,"lon":-117.871771,"nic":9,"rc":75,"seen_pos":52.607,"version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1199902,"seen":52.6,"rssi":-3.9,"dst":29.953,"dir":122.0}, +{"hex":"a23ff2","type":"adsb_icao","r":"N244MD","t":"E50P","alt_baro":"ground","gs":0.0,"mag_heading":196.88,"true_heading":208.36,"squawk":"6731","emergency":"none","category":"A1","lat":33.675749,"lon":-117.871299,"nic":8,"rc":186,"seen_pos":2.204,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1798074,"seen":0.7,"rssi":-2.7,"dst":29.926,"dir":121.9}, +{"hex":"a70356","type":"adsb_icao","flight":"N551CB ","r":"N551CB","t":"GLF4","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":177.19,"squawk":"2502","emergency":"none","category":"A5","lat":33.675575,"lon":-117.871027,"nic":8,"rc":186,"seen_pos":7.604,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2335602,"seen":0.1,"rssi":-2.8,"dst":29.943,"dir":121.9}, +{"hex":"a251fc","type":"tisb_icao","flight":"N249FS ","r":"N249FS","t":"C172","alt_baro":"ground","gs":11.2,"mag_heading":30.94,"true_heading":42.42,"category":"A1","lat":33.671036,"lon":-117.868993,"nic":6,"rc":556,"seen_pos":0.197,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":["callsign","gs","lat","lon","nic","rc"],"messages":652815,"seen":0.0,"rssi":-7.4,"dst":30.175,"dir":122.2}, +{"hex":"a89a43","type":"adsb_icao","flight":"N6530M ","r":"N6530M","t":"C182","alt_baro":2650,"alt_geom":2575,"gs":111.0,"track":262.23,"baro_rate":-896,"geom_rate":-1024,"squawk":"5707","emergency":"none","category":"A1","lat":33.893738,"lon":-117.868223,"nic":9,"rc":75,"seen_pos":0.419,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":357324,"seen":0.0,"rssi":-9.3,"dst":25.650,"dir":96.1}, +{"hex":"a6c94f","type":"adsr_icao","flight":"N53614 ","r":"N53614","t":"C172","alt_baro":"ground","gs":10.8,"track":222.19,"category":"A1","lat":33.673336,"lon":-117.867060,"nic":8,"rc":186,"seen_pos":0.068,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1320824,"seen":0.1,"rssi":-7.2,"dst":30.182,"dir":121.9}, +{"hex":"~3583c9","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.673050,"lon":-117.866849,"nic":10,"rc":25,"seen_pos":16.996,"nac_p":10,"nac_v":2,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":76,"seen":14.8,"rssi":-7.0,"dst":30.200,"dir":121.9}, +{"hex":"~35835f","type":"tisb_other","alt_baro":"ground","gs":0.0,"lat":33.673049,"lon":-117.866836,"nic":8,"rc":186,"seen_pos":4.871,"nac_p":8,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":["gs","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":42,"seen":4.9,"rssi":-7.1,"dst":30.201,"dir":121.9}, +{"hex":"a0a046","type":"adsr_icao","flight":"N1399U ","r":"N1399U","t":"C172","alt_baro":"ground","gs":0.0,"track":92.81,"category":"A1","lat":33.681267,"lon":-117.866373,"nic":8,"rc":186,"seen_pos":0.229,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":1748146,"seen":0.2,"rssi":-7.3,"dst":29.961,"dir":121.1}, +{"hex":"a54615","type":"adsb_icao","flight":"N439RS ","r":"N439RS","t":"L39","alt_baro":5075,"alt_geom":5250,"gs":212.8,"track":184.85,"geom_rate":0,"squawk":"0443","emergency":"none","category":"A6","lat":34.671295,"lon":-117.865420,"nic":9,"rc":75,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":512998,"seen":0.2,"rssi":-11.1,"dst":50.794,"dir":30.0}, +{"hex":"a1fcf9","type":"adsb_icao","flight":"N227WC ","r":"N227WC","t":"C172","dbFlags":8,"alt_baro":175,"alt_geom":0,"gs":68.0,"track":208.07,"baro_rate":0,"geom_rate":-384,"squawk":"0240","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":2816,"lat":33.682251,"lon":-117.864691,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3790661,"seen":0.0,"rssi":-6.3,"dst":30.002,"dir":120.9}, +{"hex":"a9d6e0","type":"adsb_icao","flight":"N733HA ","r":"N733HA","t":"C172","alt_baro":100,"alt_geom":-50,"gs":46.5,"track":208.22,"baro_rate":-512,"geom_rate":-384,"squawk":"0231","emergency":"none","category":"A1","lat":33.682205,"lon":-117.862842,"nic":9,"rc":75,"seen_pos":0.205,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2387658,"seen":0.2,"rssi":-9.4,"dst":30.083,"dir":120.8}, +{"hex":"a6ab73","type":"adsr_icao","flight":"N529MC ","r":"N529MC","t":"C172","alt_baro":1000,"alt_geom":725,"gs":90.4,"track":60.88,"geom_rate":256,"category":"A1","lat":33.661132,"lon":-117.861671,"nic":0,"rc":0,"seen_pos":1.047,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1740293,"seen":1.0,"rssi":-7.2,"dst":30.804,"dir":122.8}, +{"hex":"acbeb0","type":"adsb_icao","flight":"ASH5819 ","r":"N920FJ","t":"CRJ9","alt_baro":29475,"alt_geom":30800,"gs":437.5,"ias":281,"tas":440,"mach":0.732,"wd":204,"ws":61,"oat":-35,"tat":-10,"track":110.05,"roll":0.18,"mag_heading":106.35,"true_heading":117.99,"baro_rate":704,"geom_rate":1216,"squawk":"7240","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":35008,"nav_heading":105.47,"lat":34.571414,"lon":-117.859726,"nic":8,"rc":186,"seen_pos":0.230,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2204078,"seen":0.1,"rssi":-18.3,"dst":45.876,"dir":34.1}, +{"hex":"a0676e","type":"adsr_icao","flight":"N125MX ","r":"N125MX","t":"ULAC","alt_baro":500,"alt_geom":475,"gs":55.2,"track":222.06,"geom_rate":-128,"squawk":"1200","category":"A1","lat":33.696396,"lon":-117.851014,"nic":0,"rc":186,"seen_pos":1.047,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":904507,"seen":0.9,"rssi":-6.5,"dst":30.166,"dir":118.8}, +{"hex":"~358237","type":"tisb_trackfile","alt_baro":500,"alt_geom":475,"gs":51.9,"track":219.52,"baro_rate":-64,"geom_rate":0,"lat":33.697495,"lon":-117.850118,"nic":0,"rc":371,"seen_pos":8.103,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","baro_rate","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":475,"seen":5.9,"rssi":-3.7,"dst":30.173,"dir":118.7}, +{"hex":"ac8ac8","type":"tisb_icao","flight":"N907SL ","r":"N907SL","t":"ULAC","alt_baro":900,"alt_geom":875,"gs":75.6,"track":37.48,"baro_rate":1152,"geom_rate":64,"squawk":"1200","emergency":"none","category":"A1","lat":33.683304,"lon":-117.848940,"nic":0,"rc":371,"seen_pos":1.113,"gpsOkBefore":1655847572.6,"version":2,"nic_baro":0,"nac_p":0,"nac_v":0,"sil":3,"sil_type":"perhour","gva":0,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["alt_geom","gs","track","baro_rate","geom_rate","lat","lon","nic","rc","nac_v"],"messages":2227897,"seen":0.2,"rssi":-3.1,"dst":30.646,"dir":120.0}, +{"hex":"a9bb70","type":"adsb_icao","flight":"SKW3160 ","r":"N726SK","t":"CRJ7","alt_baro":36000,"alt_geom":37425,"gs":425.7,"ias":255,"tas":446,"mach":0.768,"wd":219,"ws":44,"oat":-51,"tat":-25,"track":283.45,"roll":0.18,"mag_heading":266.66,"true_heading":278.25,"baro_rate":-32,"geom_rate":-64,"squawk":"1613","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":36000,"lat":34.385971,"lon":-117.837282,"nic":8,"rc":186,"seen_pos":0.032,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":17040907,"seen":0.0,"rssi":-6.2,"dst":38.007,"dir":45.0}, +{"hex":"aaa5ff","type":"adsb_icao","flight":"SWA2964 ","r":"N7854B","t":"B737","alt_baro":1275,"alt_geom":1200,"gs":132.4,"track":206.95,"baro_rate":-768,"geom_rate":-896,"squawk":"4676","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":0,"nav_heading":187.73,"lat":33.737152,"lon":-117.829456,"nic":8,"rc":186,"seen_pos":0.364,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":24947553,"seen":0.2,"rssi":-4.6,"dst":30.034,"dir":113.8}, +{"hex":"a1857c","type":"adsr_icao","flight":"N1977C ","r":"N1977C","t":"C170","dbFlags":8,"alt_baro":2100,"alt_geom":2025,"gs":112.6,"track":307.79,"baro_rate":-640,"geom_rate":-704,"squawk":"4636","emergency":"none","category":"A1","lat":33.611435,"lon":-117.803650,"nic":0,"rc":0,"seen_pos":0.050,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":367378,"seen":0.1,"rssi":-9.7,"dst":34.875,"dir":124.3}, +{"hex":"acc85e","type":"adsb_icao","flight":"N9223E ","r":"N9223E","t":"C172","dbFlags":8,"alt_baro":2500,"alt_geom":2475,"gs":93.1,"track":358.15,"baro_rate":-256,"geom_rate":-256,"squawk":"4776","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":2496,"lat":34.022415,"lon":-117.787955,"nic":9,"rc":75,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":6215914,"seen":0.0,"rssi":-7.4,"dst":29.891,"dir":80.3}, +{"hex":"a41f54","type":"adsb_icao","flight":"N365ES ","r":"N365ES","t":"C172","alt_baro":1025,"alt_geom":900,"gs":37.1,"track":273.09,"baro_rate":-64,"geom_rate":-384,"squawk":"1200","emergency":"none","category":"A1","lat":34.091080,"lon":-117.776576,"nic":9,"rc":75,"seen_pos":35.172,"version":2,"nic_baro":1,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","gs","track","baro_rate","nac_p","nac_v","sil","sil_type"],"messages":4118785,"seen":20.6,"rssi":0.0,"dst":31.375,"dir":73.0}, +{"hex":"ab172f","type":"tisb_icao","flight":"N8132R ","r":"N8132R","t":"P28A","alt_baro":1000,"alt_geom":900,"gs":0.7,"track":0.00,"baro_rate":0,"category":"A1","lat":34.090164,"lon":-117.774783,"nic":0,"rc":0,"seen_pos":0.178,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":["callsign","altitude","alt_geom","gs","track","baro_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":1788082,"seen":0.0,"rssi":-4.9,"dst":31.444,"dir":73.2}, +{"hex":"adb906","type":"adsr_icao","flight":"N98326 ","r":"N98326","t":"C172","alt_baro":1500,"alt_geom":1400,"gs":62.3,"track":288.73,"baro_rate":-320,"squawk":"1200","emergency":"none","category":"A1","lat":34.089752,"lon":-117.760601,"nic":0,"rc":0,"seen_pos":10.059,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":600338,"seen":10.1,"rssi":-25.9,"dst":32.114,"dir":73.6}, +{"hex":"a1bc2e","type":"adsb_icao","flight":"N2102P ","r":"N2102P","t":"C172","alt_baro":1800,"alt_geom":1650,"gs":79.4,"track":5.78,"baro_rate":-192,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","lat":34.081917,"lon":-117.747345,"nic":9,"rc":75,"seen_pos":0.408,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":1,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4845078,"seen":0.2,"rssi":-8.9,"dst":32.623,"dir":74.7}, +{"hex":"~3581c3","type":"tisb_trackfile","alt_baro":4600,"gs":125.4,"track":283.37,"geom_rate":0,"lat":33.602646,"lon":-117.738573,"nic":0,"rc":0,"seen_pos":3.323,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":5358,"seen":3.0,"rssi":-3.9,"dst":37.879,"dir":122.1}, +{"hex":"a7fde4","type":"adsb_icao","flight":"SKW3681 ","r":"N614CZ","t":"E75L","alt_baro":10200,"alt_geom":10675,"gs":293.3,"track":262.75,"baro_rate":-1088,"squawk":"2763","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":2208,"nav_modes":["autopilot","vnav","tcas"],"lat":34.019760,"lon":-117.722373,"nic":8,"rc":186,"seen_pos":0.297,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18870512,"seen":0.0,"rssi":-6.6,"dst":33.093,"dir":81.5}, +{"hex":"ad3cde","type":"adsb_icao","flight":"N952JA ","r":"N952JA","t":"C172","alt_baro":2900,"alt_geom":2775,"gs":103.1,"track":272.22,"baro_rate":0,"geom_rate":0,"squawk":"0223","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":3008,"lat":33.584460,"lon":-117.719250,"nic":9,"rc":75,"seen_pos":0.540,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2852892,"seen":0.1,"rssi":-3.2,"dst":39.283,"dir":122.7}, +{"hex":"a3fdc0","type":"adsb_icao","flight":"N3562L ","r":"N3562L","t":"P28A","alt_baro":7800,"alt_geom":8050,"gs":113.5,"track":104.28,"baro_rate":-320,"geom_rate":-768,"squawk":"4643","emergency":"none","category":"A1","lat":34.198345,"lon":-117.715416,"nic":9,"rc":75,"seen_pos":0.463,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":123097,"seen":0.1,"rssi":-5.7,"dst":36.517,"dir":64.7}, +{"hex":"a0665f","type":"adsb_icao","flight":"AIP1938 ","r":"N125BA","t":"B190","alt_baro":4250,"alt_geom":4325,"gs":181.7,"track":284.34,"baro_rate":1216,"geom_rate":1408,"squawk":"4673","emergency":"none","category":"A1","lat":34.050914,"lon":-117.686520,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1078128,"seen":0.2,"rssi":-5.7,"dst":35.160,"dir":78.9}, +{"hex":"a10417","type":"adsb_icao","flight":"N16484 ","r":"N16484","t":"P28A","alt_baro":1425,"alt_geom":1325,"gs":57.4,"track":247.46,"baro_rate":-320,"geom_rate":0,"squawk":"0261","emergency":"none","category":"A1","lat":34.112688,"lon":-117.684002,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2450135,"seen":0.4,"rssi":-8.9,"dst":36.156,"dir":73.1}, +{"hex":"abb8ea","type":"adsb_icao","flight":"SWA2718 ","r":"N8542Z","t":"B738","alt_baro":38000,"alt_geom":39500,"gs":438.6,"ias":248,"tas":450,"mach":0.784,"track":285.34,"track_rate":0.00,"roll":-0.53,"mag_heading":265.43,"true_heading":276.97,"baro_rate":0,"geom_rate":0,"squawk":"2262","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":38016,"nav_altitude_fms":38000,"nav_heading":269.30,"lat":34.345184,"lon":-117.682800,"nic":8,"rc":186,"seen_pos":0.220,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":27217875,"seen":0.0,"rssi":-7.5,"dst":42.340,"dir":54.7}, +{"hex":"ad37ed","type":"adsr_icao","flight":"N95063 ","r":"N95063","t":"P28A","alt_baro":2100,"alt_geom":2125,"gs":101.5,"track":63.69,"baro_rate":-384,"geom_rate":-384,"squawk":"1200","emergency":"none","category":"A1","lat":34.102844,"lon":-117.676915,"nic":0,"rc":0,"seen_pos":7.037,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":373619,"seen":7.0,"rssi":-22.5,"dst":36.332,"dir":74.2}, +{"hex":"aa6c93","type":"adsb_icao","flight":"N77083 ","r":"N77083","t":"C140","alt_baro":3600,"alt_geom":3475,"gs":75.7,"track":172.41,"baro_rate":256,"geom_rate":128,"squawk":"0274","emergency":"none","category":"A1","lat":33.485444,"lon":-117.667106,"nic":9,"rc":75,"seen_pos":0.068,"version":2,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1187249,"seen":0.1,"rssi":-6.1,"dst":44.857,"dir":127.3}, +{"hex":"a00c72","type":"adsb_icao","flight":"N102DE ","r":"N102DE","t":"P28A","alt_baro":2400,"alt_geom":2275,"gs":95.4,"track":119.52,"baro_rate":-768,"geom_rate":-320,"squawk":"1200","emergency":"none","category":"A1","lat":33.894312,"lon":-117.663860,"nic":9,"rc":75,"seen_pos":0.419,"version":2,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":5244901,"seen":0.1,"rssi":-8.8,"dst":35.787,"dir":94.2}, +{"hex":"a94b4d","type":"adsb_icao","flight":"UAL1897 ","r":"N69835","t":"B739","alt_baro":23475,"alt_geom":24550,"gs":449.0,"ias":295,"tas":424,"mach":0.684,"wd":208,"ws":28,"oat":-20,"tat":4,"track":54.61,"track_rate":-0.09,"roll":-2.46,"mag_heading":45.00,"true_heading":56.56,"baro_rate":1856,"geom_rate":1856,"squawk":"6771","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":27008,"nav_altitude_fms":35008,"nav_heading":44.30,"lat":34.369308,"lon":-117.659090,"nic":8,"rc":186,"seen_pos":0.220,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":23808557,"seen":0.1,"rssi":-10.0,"dst":44.135,"dir":54.1}, +{"hex":"a4190f","type":"adsr_icao","flight":"N363SP ","r":"N363SP","t":"C172","alt_baro":2300,"alt_geom":2250,"gs":87.2,"track":36.61,"baro_rate":-896,"squawk":"0267","emergency":"none","category":"A1","lat":33.419357,"lon":-117.653577,"nic":0,"rc":0,"seen_pos":0.057,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2368926,"seen":0.1,"rssi":-9.7,"dst":47.895,"dir":130.5}, +{"hex":"a4b8e4","type":"adsb_icao","flight":"N403ML ","r":"N403ML","t":"DHC6","alt_baro":4975,"alt_geom":5125,"gs":142.0,"track":122.35,"geom_rate":-128,"squawk":"4623","emergency":"none","category":"A1","lat":32.671326,"lon":-117.653467,"nic":9,"rc":75,"seen_pos":0.401,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2181941,"seen":0.2,"rssi":-12.5,"dst":84.439,"dir":154.2}, +{"hex":"a97932","type":"tisb_icao","flight":"N7096L ","r":"N7096L","t":"R22","alt_baro":"ground","gs":0.7,"track":0.00,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","lat":33.790283,"lon":-117.641546,"nic":0,"rc":0,"seen_pos":2.434,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["altitude","gs","track","geom_rate","lat","lon","nic","rc"],"messages":165104,"seen":2.2,"rssi":-3.9,"dst":37.896,"dir":103.5}, +{"hex":"a9e627","type":"adsb_icao","flight":"N737MH ","r":"N737MH","t":"C172","alt_baro":1600,"alt_geom":1375,"gs":100.4,"track":105.00,"baro_rate":-448,"geom_rate":-576,"squawk":"1200","emergency":"none","category":"A1","lat":33.961626,"lon":-117.640972,"nic":8,"rc":186,"seen_pos":0.230,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4787619,"seen":0.0,"rssi":-5.1,"dst":36.832,"dir":87.8}, +{"hex":"a2113a","type":"adsb_icao","flight":"N232PG ","r":"N232PG","t":"CLON","alt_baro":650,"alt_geom":525,"gs":2.1,"track":270.00,"baro_rate":-64,"geom_rate":-128,"category":"A7","lat":33.979477,"lon":-117.636613,"nic":8,"rc":186,"seen_pos":59.131,"version":2,"nic_baro":1,"nac_p":8,"nac_v":2,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":86069,"seen":12.8,"rssi":-21.1,"dst":37.098,"dir":86.1}, +{"hex":"a2ae1e","type":"adsb_icao","flight":"N272CB ","r":"N272CB","t":"P28A","dbFlags":8,"alt_baro":2475,"alt_geom":2425,"gs":79.1,"track":272.17,"baro_rate":448,"geom_rate":448,"squawk":"4716","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":3008,"lat":33.894358,"lon":-117.633705,"nic":9,"rc":75,"seen_pos":0.230,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":4029840,"seen":0.0,"rssi":-4.8,"dst":37.285,"dir":94.0}, +{"hex":"a68a12","type":"adsb_icao","flight":"N520MS ","r":"N520MS","t":"PA44","alt_baro":725,"alt_geom":600,"gs":82.1,"track":267.90,"baro_rate":960,"geom_rate":960,"squawk":"1200","emergency":"none","category":"A2","lat":33.973572,"lon":-117.633530,"nic":9,"rc":75,"seen_pos":1.472,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1350376,"seen":0.4,"rssi":-2.3,"dst":37.232,"dir":86.7}, +{"hex":"a181a3","type":"adsr_icao","flight":"N1966D ","r":"N1966D","t":"BE35","alt_baro":2100,"alt_geom":2125,"gs":109.5,"track":50.93,"baro_rate":-512,"geom_rate":-640,"squawk":"1200","emergency":"none","category":"A1","lat":33.880096,"lon":-117.619517,"nic":0,"rc":0,"seen_pos":0.057,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":16491,"seen":0.0,"rssi":-19.9,"dst":38.065,"dir":95.2}, +{"hex":"a206e7","type":"adsb_icao","flight":"N23HS ","r":"N23HS","t":"AS50","alt_baro":1225,"alt_geom":1125,"gs":114.7,"track":104.64,"baro_rate":-64,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","nav_qnh":1012.0,"lat":33.983047,"lon":-117.614977,"nic":9,"rc":75,"seen_pos":0.371,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2189427,"seen":0.0,"rssi":-2.1,"dst":38.187,"dir":85.9}, +{"hex":"a7dabe","type":"adsb_icao","flight":"N605KL ","r":"N605KL","t":"CL60","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":199.69,"squawk":"5720","emergency":"none","category":"A2","lat":34.051496,"lon":-117.612362,"nic":8,"rc":186,"seen_pos":10.047,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":106898,"seen":3.0,"rssi":-10.8,"dst":38.797,"dir":79.8}, +{"hex":"a2608a","type":"adsb_icao","flight":"N252SP ","r":"N252SP","t":"C172","alt_baro":7500,"alt_geom":7750,"gs":102.5,"track":95.60,"baro_rate":128,"geom_rate":256,"squawk":"0253","emergency":"none","category":"A1","lat":34.117676,"lon":-117.611894,"nic":9,"rc":75,"seen_pos":0.463,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":798332,"seen":0.4,"rssi":-3.6,"dst":39.685,"dir":74.2}, +{"hex":"a11cc1","type":"adsb_icao","flight":"GTI3802 ","r":"N1709A","t":"B763","alt_baro":"ground","gs":0.0,"squawk":"2000","emergency":"none","category":"A5","lat":34.060604,"lon":-117.606723,"nic":8,"rc":186,"seen_pos":9.772,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":15442481,"seen":4.1,"rssi":-14.6,"dst":39.169,"dir":79.1}, +{"hex":"a7cdf6","type":"adsb_icao","flight":"N60143 ","r":"N60143","t":"C172","alt_baro":1100,"alt_geom":975,"gs":89.0,"track":359.36,"baro_rate":-384,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A1","lat":33.968582,"lon":-117.604327,"nic":9,"rc":75,"seen_pos":0.419,"version":2,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2999482,"seen":0.0,"rssi":-4.0,"dst":38.671,"dir":87.2}, +{"hex":"a71b43","type":"adsb_icao","flight":"AAL2635 ","r":"N557UW","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":0.00,"squawk":"6723","emergency":"none","category":"A3","lat":34.059963,"lon":-117.585969,"nic":8,"rc":186,"seen_pos":0.412,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24023928,"seen":0.4,"rssi":-15.6,"dst":40.178,"dir":79.4}, +{"hex":"a52a29","type":"adsr_icao","flight":"N4317G ","r":"N4317G","t":"P28A","alt_baro":1100,"alt_geom":950,"gs":76.0,"track":270.00,"baro_rate":-576,"squawk":"0263","emergency":"none","category":"A1","lat":34.056885,"lon":-117.578935,"nic":0,"rc":0,"seen_pos":10.059,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":671393,"seen":10.1,"rssi":-25.2,"dst":40.490,"dir":79.8}, +{"hex":"ab503a","type":"adsb_icao","flight":"SCX427 ","r":"N828SY","t":"B738","alt_baro":11850,"alt_geom":12425,"gs":289.4,"track":252.50,"baro_rate":-1920,"squawk":"1665","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":96,"nav_heading":236.25,"lat":34.054917,"lon":-117.570477,"nic":8,"rc":186,"seen_pos":0.102,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":17920624,"seen":0.0,"rssi":-7.0,"dst":40.885,"dir":80.0}, +{"hex":"~298534","type":"tisb_trackfile","alt_baro":3850,"gs":115.9,"track":25.02,"geom_rate":-320,"lat":33.761444,"lon":-117.553599,"nic":0,"rc":0,"seen_pos":1.307,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":35236,"seen":0.9,"rssi":-11.7,"dst":42.578,"dir":104.3}, +{"hex":"ae0462","type":"adsb_icao","flight":"PSWRD20 ","r":"162147","t":"C2","dbFlags":1,"alt_baro":9925,"alt_geom":10350,"gs":259.1,"track":327.29,"baro_rate":384,"squawk":"1007","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":9984,"nav_modes":["tcas"],"lat":32.796524,"lon":-117.536957,"nic":9,"rc":75,"seen_pos":0.301,"version":2,"nic_baro":1,"nac_p":10,"nac_v":4,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1534048,"seen":0.0,"rssi":-6.4,"dst":80.619,"dir":148.1}, +{"hex":"a99d24","type":"adsr_icao","flight":"N7187T ","r":"N7187T","t":"C172","alt_baro":3000,"alt_geom":3050,"gs":94.1,"track":267.56,"baro_rate":-64,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.854324,"lon":-117.536110,"nic":0,"rc":0,"seen_pos":0.032,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1088751,"seen":0.0,"rssi":-7.3,"dst":42.370,"dir":96.7}, +{"hex":"~2986fc","type":"tisb_trackfile","alt_baro":300,"alt_geom":1075,"gs":61.6,"track":221.71,"geom_rate":0,"lat":33.326660,"lon":-117.500647,"nic":0,"rc":926,"seen_pos":1.879,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":20391,"seen":1.7,"rssi":-2.8,"dst":57.340,"dir":129.7}, +{"hex":"a6bbc5","type":"adsb_icao","flight":"N533CA ","r":"N533CA","t":"P28A","alt_baro":3450,"alt_geom":3500,"gs":91.6,"track":201.80,"baro_rate":448,"geom_rate":320,"squawk":"0224","emergency":"none","category":"A1","lat":34.131775,"lon":-117.491970,"nic":9,"rc":75,"seen_pos":0.197,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2359642,"seen":0.2,"rssi":-5.0,"dst":45.663,"dir":75.1}, +{"hex":"~298bdf","type":"tisb_other","alt_baro":900,"alt_geom":1675,"gs":128.9,"track":350.17,"geom_rate":0,"lat":32.864576,"lon":-117.481571,"nic":6,"rc":926,"seen_pos":1.398,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":45839,"seen":1.1,"rssi":-5.6,"dst":78.715,"dir":144.9}, +{"hex":"a9d4da","type":"adsb_icao","flight":"N7320J ","r":"N7320J","t":"C172","alt_baro":"ground","gs":11.2,"track":104.06,"squawk":"0273","emergency":"none","category":"A1","lat":33.951279,"lon":-117.444268,"nic":9,"rc":75,"seen_pos":1.962,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6522429,"seen":0.6,"rssi":-2.1,"dst":46.613,"dir":88.9}, +{"hex":"a213d9","type":"adsb_icao","flight":"N233CB ","r":"N233CB","t":"P28A","alt_baro":"ground","alt_geom":700,"gs":14.8,"track":284.53,"true_heading":250.31,"baro_rate":128,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":1792,"nav_heading":61.88,"nav_modes":[],"lat":33.951576,"lon":-117.441143,"nic":9,"rc":75,"seen_pos":0.595,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":4095548,"seen":0.6,"rssi":-2.2,"dst":46.769,"dir":88.9}, +{"hex":"a1bd0a","type":"adsb_icao","flight":"N2108Z ","r":"N2108Z","t":"C172","alt_baro":4200,"alt_geom":4125,"gs":104.0,"track":313.83,"baro_rate":512,"geom_rate":448,"squawk":"0226","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4512,"nav_heading":305.16,"lat":33.200730,"lon":-117.439195,"nic":8,"rc":186,"seen_pos":0.315,"version":2,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7570627,"seen":0.0,"rssi":-9.2,"dst":64.688,"dir":133.1}, +{"hex":"a30bf8","type":"adsb_icao","flight":"N296CB ","r":"N296CB","t":"P28A","alt_baro":"ground","gs":0.0,"true_heading":284.06,"squawk":"0235","emergency":"none","category":"A1","lat":33.949965,"lon":-117.434764,"nic":9,"rc":75,"seen_pos":11.429,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3472641,"seen":0.1,"rssi":-15.1,"dst":47.086,"dir":89.0}, +{"hex":"a66e3b","type":"adsb_icao","flight":"SKW6292 ","r":"N513SY","t":"E75L","alt_baro":15250,"alt_geom":15950,"gs":325.6,"track":253.40,"baro_rate":-1728,"squawk":"3771","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":2208,"nav_modes":["autopilot","vnav","tcas"],"lat":34.098450,"lon":-117.396483,"nic":8,"rc":186,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":20924383,"seen":0.1,"rssi":-4.4,"dst":49.863,"dir":78.7}, +{"hex":"a7fa2d","type":"adsb_icao","flight":"SKW4450 ","r":"N613CZ","t":"E75L","alt_baro":7625,"alt_geom":7925,"gs":267.6,"track":127.26,"baro_rate":-1728,"geom_rate":-1664,"squawk":"4622","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":7008,"nav_modes":["autopilot","vnav","tcas"],"lat":32.994504,"lon":-117.392672,"nic":8,"rc":186,"seen_pos":0.152,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":20215888,"seen":0.0,"rssi":-8.5,"dst":75.281,"dir":138.7}, +{"hex":"~348821","type":"tisb_other","alt_baro":225,"alt_geom":2600,"gs":114.0,"track":142.13,"geom_rate":0,"lat":32.604908,"lon":-117.389925,"nic":6,"rc":926,"seen_pos":0.844,"nac_p":6,"nac_v":7,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":16745,"seen":0.3,"rssi":-6.3,"dst":94.310,"dir":147.9}, +{"hex":"a15d71","type":"adsr_icao","flight":"N1873C ","r":"N1873C","t":"C170","alt_baro":1000,"alt_geom":1050,"gs":94.9,"track":69.66,"baro_rate":0,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":33.224984,"lon":-117.367840,"nic":0,"rc":0,"seen_pos":0.037,"nic_baro":0,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":11681,"seen":0.0,"rssi":-6.8,"dst":66.374,"dir":130.0}, +{"hex":"aa39f8","type":"adsr_icao","flight":"N758YS ","r":"N758YS","t":"C152","alt_baro":600,"alt_geom":525,"gs":82.9,"track":261.67,"baro_rate":896,"squawk":"1200","emergency":"none","category":"A1","lat":33.214371,"lon":-117.364636,"nic":0,"rc":0,"seen_pos":0.027,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1976996,"seen":0.0,"rssi":-22.3,"dst":66.912,"dir":130.3}, +{"hex":"a2467d","type":"adsb_icao","flight":"N246CB ","r":"N246CB","t":"P28A","alt_baro":4550,"alt_geom":4625,"gs":110.2,"track":15.80,"baro_rate":-64,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1011.2,"nav_altitude_mcp":4512,"lat":33.833049,"lon":-117.361851,"nic":9,"rc":75,"seen_pos":0.057,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3797600,"seen":0.0,"rssi":-5.1,"dst":51.152,"dir":96.9}, +{"hex":"a326d1","type":"adsb_icao","flight":"ASA582 ","r":"N302AS","t":"B739","alt_baro":4550,"alt_geom":4625,"gs":291.2,"track":307.18,"baro_rate":3456,"geom_rate":2688,"squawk":"7773","emergency":"none","category":"A3","lat":32.807224,"lon":-117.330845,"nic":8,"rc":186,"seen_pos":0.280,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":18435673,"seen":0.2,"rssi":-7.5,"dst":85.976,"dir":142.0}, +{"hex":"a4d42d","type":"adsb_icao","flight":"AAL510 ","r":"N410AN","t":"A21N","alt_baro":31975,"alt_geom":33425,"gs":443.5,"track":272.84,"baro_rate":0,"squawk":"0723","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":32000,"lat":33.910263,"lon":-117.328715,"nic":8,"rc":186,"seen_pos":0.158,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21772786,"seen":0.0,"rssi":-16.0,"dst":52.406,"dir":91.6}, +{"hex":"~298d9d","type":"tisb_trackfile","alt_baro":925,"alt_geom":1700,"gs":124.5,"track":351.22,"geom_rate":0,"lat":33.410110,"lon":-117.320142,"nic":0,"rc":926,"seen_pos":2.616,"nac_p":0,"nac_v":0,"sil":0,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":17999,"seen":2.6,"rssi":-1.1,"dst":61.775,"dir":120.7}, +{"hex":"ae1839","type":"adsb_icao","flight":"FFAB123 ","r":"166522","t":"H60","dbFlags":1,"alt_baro":100,"alt_geom":-50,"gs":1.6,"track":45.00,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A7","lat":32.590058,"lon":-117.314198,"nic":8,"rc":186,"seen_pos":0.955,"version":2,"nic_baro":1,"nac_p":11,"nac_v":4,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1495610,"seen":0.0,"rssi":-4.2,"dst":97.113,"dir":146.3}, +{"hex":"a2f965","type":"adsb_icao","flight":"N291CB ","r":"N291CB","t":"P28A","alt_baro":5450,"alt_geom":5550,"gs":101.6,"track":79.80,"baro_rate":0,"geom_rate":0,"squawk":"4773","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":5504,"lat":33.849747,"lon":-117.282976,"nic":9,"rc":75,"seen_pos":0.147,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":3628296,"seen":0.0,"rssi":-5.8,"dst":54.941,"dir":95.3}, +{"hex":"a46070","type":"adsb_icao","flight":"EJA381 ","r":"N381QS","t":"C680","alt_baro":"ground","gs":0.0,"mag_heading":244.69,"true_heading":255.93,"squawk":"5755","emergency":"none","category":"A2","lat":33.127213,"lon":-117.279557,"nic":8,"rc":186,"seen_pos":3.522,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":5907741,"seen":2.6,"rssi":-14.7,"dst":73.579,"dir":131.2}, +{"hex":"a2415b","type":"adsr_icao","flight":"N2441E ","r":"N2441E","t":"C172","alt_baro":"ground","alt_geom":225,"gs":35.5,"track":258.75,"baro_rate":-448,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":33.128609,"lon":-117.277651,"nic":8,"rc":186,"seen_pos":16.292,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1129597,"seen":16.3,"rssi":-12.0,"dst":73.595,"dir":131.1}, +{"hex":"ad3fbd","type":"adsb_icao","flight":"N9529W ","r":"N9529W","t":"C172","dbFlags":8,"alt_baro":"ground","gs":13.2,"track":81.56,"squawk":"1200","emergency":"none","category":"A1","lat":33.127981,"lon":-117.276797,"nic":10,"rc":25,"seen_pos":0.371,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":4944943,"seen":0.4,"rssi":-8.9,"dst":73.652,"dir":131.1}, +{"hex":"ac8f95","type":"adsr_icao","flight":"N9082U ","r":"N9082U","t":"P28A","alt_baro":4500,"alt_geom":4600,"gs":111.0,"track":0.00,"baro_rate":-384,"geom_rate":-448,"squawk":"1200","emergency":"none","category":"A1","lat":32.991348,"lon":-117.275153,"nic":0,"rc":186,"seen_pos":0.469,"nic_baro":0,"nac_p":9,"nac_v":0,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2177277,"seen":0.1,"rssi":-10.5,"dst":79.408,"dir":135.5}, +{"hex":"a9d836","type":"adsb_icao","r":"N733WT","t":"C172","dbFlags":8,"alt_baro":"ground","category":"A2","lat":33.128117,"lon":-117.273436,"nic":6,"rc":556,"seen_pos":39.314,"version":2,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3731941,"seen":39.3,"rssi":-28.3,"dst":73.773,"dir":131.0}, +{"hex":"a7f4ff","type":"adsr_icao","flight":"N6111Q ","r":"N6111Q","t":"C152","alt_baro":"ground","gs":0.0,"emergency":"none","category":"A1","lat":33.128586,"lon":-117.273148,"nic":0,"rc":0,"seen_pos":14.385,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1079270,"seen":14.4,"rssi":-24.5,"dst":73.765,"dir":131.0}, +{"hex":"ac65a5","type":"adsb_icao","flight":"N89815 ","r":"N89815","t":"C152","alt_baro":"ground","gs":0.0,"squawk":"1200","emergency":"none","category":"A1","lat":33.128749,"lon":-117.272270,"nic":9,"rc":75,"seen_pos":2.429,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":3372636,"seen":0.2,"rssi":-24.3,"dst":73.792,"dir":131.0}, +{"hex":"ac4e53","type":"adsb_icao","flight":"N892SA ","r":"N892SA","t":"R44","alt_baro":500,"alt_geom":375,"gs":105.0,"track":19.47,"baro_rate":-64,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","lat":32.866392,"lon":-117.257024,"nic":9,"rc":75,"seen_pos":0.096,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1679143,"seen":0.1,"rssi":-5.8,"dst":85.570,"dir":138.6}, +{"hex":"a4adb3","type":"adsb_icao","flight":"N400LZ ","r":"N400LZ","t":"BE40","alt_baro":"ground","gs":31.5,"true_heading":329.06,"squawk":"4722","emergency":"none","category":"A2","lat":33.876904,"lon":-117.256646,"nic":9,"rc":75,"seen_pos":1.792,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1496159,"seen":1.8,"rssi":-13.9,"dst":56.105,"dir":93.5}, +{"hex":"a6ea20","type":"adsb_icao","flight":"N5447L ","r":"N5447L","t":"C152","alt_baro":700,"alt_geom":625,"gs":61.0,"track":259.61,"baro_rate":-320,"geom_rate":-256,"squawk":"0217","emergency":"none","category":"A1","lat":33.132717,"lon":-117.252035,"nic":9,"rc":75,"seen_pos":0.183,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1552763,"seen":0.0,"rssi":-13.8,"dst":74.399,"dir":130.3}, +{"hex":"a9ed95","type":"adsb_icao","flight":"N739MH ","r":"N739MH","t":"C172","dbFlags":8,"alt_baro":1525,"alt_geom":1425,"gs":80.4,"track":84.29,"baro_rate":192,"geom_rate":128,"squawk":"0244","emergency":"none","category":"A1","lat":33.151016,"lon":-117.239447,"nic":9,"rc":75,"seen_pos":0.458,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4030410,"seen":0.1,"rssi":-6.7,"dst":74.167,"dir":129.4}, +{"hex":"a3372e","type":"adsb_icao","flight":"N306SB ","r":"N306SB","t":"UH1","alt_baro":1300,"alt_geom":1175,"gs":28.6,"track":306.47,"baro_rate":128,"geom_rate":-128,"category":"A7","lat":34.085874,"lon":-117.238026,"nic":0,"rc":0,"seen_pos":21.224,"version":0,"nac_p":8,"nac_v":2,"sil":2,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":["callsign","baro_rate"],"messages":331388,"seen":8.8,"rssi":-1.2,"dst":57.508,"dir":80.9}, +{"hex":"a1219f","type":"adsb_icao","flight":"N172LK ","r":"N172LK","t":"C172","alt_baro":2200,"alt_geom":2175,"gs":95.7,"track":206.03,"baro_rate":-512,"geom_rate":-512,"squawk":"1200","emergency":"none","category":"A1","lat":33.210297,"lon":-117.236426,"nic":9,"rc":75,"seen_pos":0.205,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4620965,"seen":0.0,"rssi":-6.8,"dst":72.051,"dir":127.1}, +{"hex":"a44250","type":"adsr_icao","flight":"N3737U ","r":"N3737U","t":"BE76","alt_baro":1700,"alt_geom":1650,"gs":114.9,"track":27.46,"baro_rate":192,"geom_rate":64,"squawk":"1200","emergency":"none","category":"A1","lat":33.335918,"lon":-117.234098,"nic":0,"rc":0,"seen_pos":0.273,"nic_baro":0,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":389127,"seen":0.0,"rssi":-6.8,"dst":67.794,"dir":122.0}, +{"hex":"a067d6","type":"adsb_icao","flight":"N125SA ","r":"N125SA","t":"DHC6","alt_baro":14050,"alt_geom":14675,"gs":63.3,"track":185.44,"geom_rate":1024,"squawk":"4251","emergency":"none","category":"A1","lat":33.779984,"lon":-117.215433,"nic":9,"rc":75,"seen_pos":0.463,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3194935,"seen":0.3,"rssi":-8.5,"dst":58.852,"dir":99.1}, +{"hex":"~2985ff","type":"tisb_other","alt_baro":1825,"alt_geom":4200,"gs":79.3,"track":29.48,"geom_rate":0,"lat":33.283401,"lon":-117.213519,"nic":0,"rc":926,"seen_pos":2.525,"nac_p":6,"nac_v":7,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":11298,"seen":2.4,"rssi":-6.7,"dst":70.396,"dir":123.7}, +{"hex":"a9b97e","type":"adsr_icao","flight":"N7257T ","r":"N7257T","t":"C172","alt_baro":"ground","alt_geom":3575,"gs":41.5,"track":163.12,"baro_rate":192,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.026894,"lon":-117.213519,"nic":0,"rc":0,"seen_pos":0.469,"nic_baro":0,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["altitude","geom_rate","nac_p","nac_v","sil","sil_type"],"messages":2766218,"seen":0.1,"rssi":-3.7,"dst":80.106,"dir":132.9}, +{"hex":"ae0d7c","type":"adsb_icao","flight":"TROY209 ","r":"77-22718","t":"H60","dbFlags":1,"alt_baro":"ground","gs":0.0,"mag_heading":92.81,"true_heading":103.96,"squawk":"4403","emergency":"none","category":"A7","lat":32.692348,"lon":-117.207106,"nic":9,"rc":75,"seen_pos":3.867,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":134667,"seen":3.9,"rssi":-29.8,"dst":95.254,"dir":141.5}, +{"hex":"ae6b99","type":"adsb_icao","flight":"RUDY33 ","r":"169440","t":"V22","dbFlags":1,"alt_baro":"ground","gs":0.0,"true_heading":210.94,"emergency":"none","category":"A7","lat":32.695438,"lon":-117.202451,"nic":10,"rc":25,"seen_pos":4.413,"version":2,"nac_p":10,"nac_v":4,"sil":3,"sil_type":"perhour","sda":2,"alert":1,"spi":0,"mlat":[],"tisb":[],"messages":1909683,"seen":4.4,"rssi":-21.4,"dst":95.252,"dir":141.3}, +{"hex":"a46a7e","type":"adsb_icao","flight":"DAL1162 ","r":"N384DN","t":"A321","alt_baro":"ground","gs":0.0,"true_heading":106.88,"squawk":"6745","emergency":"none","category":"A3","lat":32.735138,"lon":-117.200355,"nic":8,"rc":186,"seen_pos":0.027,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24693783,"seen":0.0,"rssi":-12.4,"dst":93.452,"dir":140.4}, +{"hex":"a61797","type":"adsb_icao","flight":"ASA222 ","r":"N492AS","t":"B739","alt_baro":"ground","gs":1.9,"true_heading":191.25,"squawk":"1056","emergency":"none","category":"A3","lat":32.732228,"lon":-117.200060,"nic":8,"rc":186,"seen_pos":1.129,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":23404703,"seen":1.1,"rssi":-9.9,"dst":93.598,"dir":140.4}, +{"hex":"a1c2f1","type":"adsb_icao","flight":"SWA1106 ","r":"N212WN","t":"B737","alt_baro":"ground","gs":0.0,"true_heading":177.19,"squawk":"1366","emergency":"none","category":"A3","lat":32.733822,"lon":-117.198564,"nic":8,"rc":186,"seen_pos":3.754,"version":2,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":25558243,"seen":2.2,"rssi":-13.2,"dst":93.571,"dir":140.4}, +{"hex":"abdc56","type":"adsb_icao","flight":"SWA1949 ","r":"N8630B","t":"B738","alt_baro":"ground","gs":0.0,"true_heading":253.12,"squawk":"7612","emergency":"none","category":"A3","lat":32.733730,"lon":-117.197987,"nic":8,"rc":186,"seen_pos":14.833,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3078573,"seen":0.5,"rssi":-10.4,"dst":93.593,"dir":140.4}, +{"hex":"aa7df3","type":"adsb_icao","flight":"SWA61 ","r":"N7750A","t":"B737","alt_baro":"ground","gs":0.0,"true_heading":300.94,"squawk":"7332","emergency":"none","category":"A3","lat":32.733078,"lon":-117.197809,"nic":8,"rc":186,"seen_pos":1.190,"version":2,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":18571288,"seen":0.5,"rssi":-17.3,"dst":93.629,"dir":140.4}, +{"hex":"a321df","type":"adsr_icao","flight":"N3001T ","r":"N3001T","t":"P28A","alt_baro":4100,"alt_geom":4150,"gs":73.0,"track":203.40,"baro_rate":0,"squawk":"1200","emergency":"none","category":"A1","lat":33.518738,"lon":-117.197699,"nic":0,"rc":0,"seen_pos":0.238,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":3232206,"seen":0.2,"rssi":-20.0,"dst":64.225,"dir":112.9}, +{"hex":"a70a86","type":"adsr_icao","flight":"N55291 ","r":"N55291","t":"C172","alt_baro":5600,"alt_geom":5725,"gs":76.2,"track":141.93,"baro_rate":256,"squawk":"0230","emergency":"none","category":"A1","lat":33.580902,"lon":-117.197664,"nic":0,"rc":0,"seen_pos":0.494,"version":0,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":6756117,"seen":0.2,"rssi":-17.6,"dst":62.831,"dir":109.7}, +{"hex":"ac07b8","type":"adsb_icao","flight":"SWA2668 ","r":"N8741L","t":"B38M","alt_baro":"ground","alt_geom":2800,"gs":0.0,"track":0.00,"true_heading":126.56,"squawk":"5736","emergency":"none","category":"A3","lat":32.734207,"lon":-117.196893,"nic":8,"rc":186,"seen_pos":13.745,"version":2,"nac_p":0,"nac_v":0,"sil":2,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["track","nac_p","nac_v","sil","sil_type"],"messages":14889167,"seen":2.3,"rssi":-13.2,"dst":93.606,"dir":140.3}, +{"hex":"ac0c8b","type":"adsb_icao","flight":"SWA755 ","r":"N8759Q","t":"B38M","alt_baro":"ground","gs":0.0,"true_heading":171.56,"squawk":"2415","emergency":"none","category":"A3","lat":32.733276,"lon":-117.196487,"nic":8,"rc":186,"seen_pos":2.987,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7367150,"seen":0.4,"rssi":-8.1,"dst":93.662,"dir":140.3}, +{"hex":"abefdd","type":"adsb_icao","flight":"SWA1389 ","r":"N8687A","t":"B738","alt_baro":"ground","alt_geom":2800,"gs":0.0,"track":0.00,"true_heading":132.19,"squawk":"4647","emergency":"none","category":"A3","lat":32.733962,"lon":-117.195941,"nic":8,"rc":186,"seen_pos":3.515,"version":2,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["track"],"messages":12962161,"seen":0.7,"rssi":-9.1,"dst":93.647,"dir":140.3}, +{"hex":"abc455","type":"adsb_icao","flight":"SWA2128 ","r":"N8574Z","t":"B738","alt_baro":"ground","gs":0.0,"true_heading":275.62,"squawk":"1060","emergency":"none","category":"A3","lat":32.732880,"lon":-117.195576,"nic":8,"rc":186,"seen_pos":4.555,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":24707221,"seen":0.8,"rssi":-4.6,"dst":93.710,"dir":140.3}, +{"hex":"a9f063","type":"adsb_icao","flight":"N74C ","r":"N74C","t":"C172","alt_baro":4450,"alt_geom":4475,"gs":88.6,"track":216.74,"baro_rate":128,"geom_rate":192,"squawk":"0255","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":3488,"nav_heading":189.84,"lat":33.345415,"lon":-117.191779,"nic":9,"rc":75,"seen_pos":0.364,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2455136,"seen":0.2,"rssi":-6.3,"dst":69.292,"dir":120.7}, +{"hex":"~3489a4","type":"tisb_other","alt_baro":3975,"alt_geom":6350,"gs":119.4,"track":8.67,"geom_rate":640,"lat":32.685862,"lon":-117.186398,"nic":6,"rc":926,"seen_pos":0.660,"nac_p":6,"nac_v":0,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":1111,"seen":0.5,"rssi":-8.9,"dst":96.205,"dir":141.2}, +{"hex":"a9e573","type":"adsr_icao","flight":"N737EC ","r":"N737EC","t":"C172","alt_baro":2900,"alt_geom":2950,"gs":17.7,"track":196.39,"baro_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":34.580429,"lon":-117.184996,"nic":0,"rc":0,"seen_pos":0.712,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":644050,"seen":0.7,"rssi":-16.0,"dst":70.681,"dir":56.7}, +{"hex":"adcfe6","type":"adsb_icao","flight":"N9897F ","r":"N9897F","t":"C172","alt_baro":6450,"alt_geom":6600,"gs":100.8,"track":259.14,"baro_rate":-64,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":6496,"nav_heading":89.30,"lat":33.310089,"lon":-117.183087,"nic":9,"rc":75,"seen_pos":0.063,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":6116020,"seen":0.0,"rssi":-7.7,"dst":70.785,"dir":122.0}, +{"hex":"a8454e","type":"adsb_icao","flight":"N632BL ","r":"N632BL","t":"E550","dbFlags":8,"alt_baro":"ground","gs":0.0,"true_heading":16.88,"squawk":"2032","emergency":"none","category":"A2","lat":32.733578,"lon":-117.178929,"nic":8,"rc":186,"seen_pos":0.027,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":2227850,"seen":0.0,"rssi":-9.5,"dst":94.209,"dir":139.9}, +{"hex":"a191b9","type":"adsr_icao","flight":"ZEBRA2 ","r":"N20XB","alt_baro":"ground","gs":5.8,"track":286.88,"category":"C1","lat":32.730122,"lon":-117.178887,"nic":0,"rc":186,"seen_pos":0.189,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":525296,"seen":0.2,"rssi":-17.9,"dst":94.371,"dir":140.0}, +{"hex":"a7e666","type":"adsb_icao","flight":"EJA608 ","r":"N608QS","t":"C68A","alt_baro":"ground","gs":0.0,"true_heading":16.88,"squawk":"7307","emergency":"none","category":"A2","lat":32.733467,"lon":-117.178432,"nic":9,"rc":75,"seen_pos":3.946,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":10046644,"seen":0.9,"rssi":-13.3,"dst":94.230,"dir":139.9}, +{"hex":"a41f72","type":"adsb_icao","flight":"LXJ365 ","r":"N365FX","t":"E55P","alt_baro":"ground","gs":0.0,"mag_heading":5.62,"true_heading":16.77,"squawk":"4745","emergency":"none","category":"A2","lat":32.733181,"lon":-117.177498,"nic":8,"rc":186,"seen_pos":1.937,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":8310726,"seen":0.0,"rssi":-10.5,"dst":94.273,"dir":139.9}, +{"hex":"c067ae","type":"adsb_icao","flight":"ACA1092 ","r":"C-GNGV","t":"BCS3","alt_baro":"ground","gs":6.2,"true_heading":326.25,"squawk":"1331","emergency":"none","category":"A3","lat":32.730286,"lon":-117.176042,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21238288,"seen":0.0,"rssi":-4.6,"dst":94.456,"dir":139.9}, +{"hex":"aac209","type":"adsb_icao","flight":"N79212 ","r":"N79212","t":"C172","alt_baro":4275,"alt_geom":4350,"gs":68.3,"track":174.96,"baro_rate":-64,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","lat":33.293930,"lon":-117.169794,"nic":9,"rc":75,"seen_pos":0.205,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":2779520,"seen":0.1,"rssi":-6.0,"dst":71.872,"dir":122.3}, +{"hex":"a81005","type":"adsb_icao","flight":"UAL632 ","r":"N61886","t":"B739","alt_baro":16175,"alt_geom":16925,"gs":344.4,"track":261.99,"baro_rate":-1920,"squawk":"7637","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":1888,"nav_heading":244.69,"lat":34.010506,"lon":-117.167416,"nic":8,"rc":186,"seen_pos":0.032,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":22653938,"seen":0.0,"rssi":-9.2,"dst":60.525,"dir":85.6}, +{"hex":"ab7036","type":"adsb_icao","flight":"N836SB ","r":"N836SB","t":"AS50","alt_baro":2275,"alt_geom":2225,"gs":90.9,"track":245.97,"baro_rate":-448,"geom_rate":-256,"squawk":"1206","emergency":"none","category":"A7","nav_qnh":1012.0,"nav_altitude_mcp":0,"lat":34.123672,"lon":-117.166891,"nic":9,"rc":75,"seen_pos":1.485,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["callsign","geom_rate"],"messages":1354794,"seen":1.5,"rssi":-6.3,"dst":61.363,"dir":79.3}, +{"hex":"a80ba0","type":"adsr_icao","flight":"N61737 ","r":"N61737","t":"C172","alt_baro":3800,"alt_geom":3825,"gs":53.2,"track":196.39,"baro_rate":576,"squawk":"1200","emergency":"none","category":"A1","lat":33.507889,"lon":-117.144141,"nic":0,"rc":0,"seen_pos":0.389,"nac_v":0,"sil_type":"perhour","alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2176293,"seen":0.4,"rssi":-23.8,"dst":66.945,"dir":112.4}, +{"hex":"a6ecf2","type":"adsb_icao","flight":"N54502 ","r":"N54502","t":"C172","alt_baro":"ground","gs":2.8,"track":272.81,"category":"A1","lat":32.811356,"lon":-117.138697,"nic":9,"rc":75,"seen_pos":31.796,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":4835059,"seen":31.8,"rssi":-25.4,"dst":92.003,"dir":137.1}, +{"hex":"acae9f","type":"adsb_icao","flight":"N916TA ","r":"N916TA","t":"C172","dbFlags":8,"alt_baro":"ground","gs":5.8,"squawk":"1200","emergency":"none","category":"A1","lat":32.810394,"lon":-117.138181,"nic":8,"rc":186,"seen_pos":0.615,"version":2,"nac_p":9,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"mlat":[],"tisb":[],"messages":5015063,"seen":0.6,"rssi":-25.7,"dst":92.063,"dir":137.1}, +{"hex":"a9ea6e","type":"adsb_icao","flight":"N738TB ","r":"N738TB","t":"C172","alt_baro":"ground","gs":0.1,"emergency":"none","category":"A1","lat":32.813078,"lon":-117.135600,"nic":9,"rc":75,"seen_pos":1.331,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":1,"spi":0,"mlat":[],"tisb":[],"messages":3835741,"seen":0.1,"rssi":-20.2,"dst":92.031,"dir":137.0}, +{"hex":"aa67e1","type":"adsb_icao","flight":"00000000","r":"N77NG","t":"B350","dbFlags":8,"alt_baro":425,"alt_geom":325,"gs":104.7,"track":294.85,"baro_rate":-512,"geom_rate":-384,"squawk":"4757","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":2496,"nav_heading":191.25,"lat":32.814148,"lon":-117.134528,"nic":8,"rc":186,"seen_pos":0.280,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":5118789,"seen":0.3,"rssi":-6.7,"dst":92.020,"dir":136.9}, +{"hex":"a1bc54","type":"adsb_icao","flight":"N2103S ","r":"N2103S","t":"C210","alt_baro":"ground","gs":0.2,"mag_heading":47.81,"true_heading":58.96,"squawk":"1200","emergency":"none","category":"A1","lat":32.811630,"lon":-117.131863,"nic":9,"rc":75,"seen_pos":1.164,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":1,"spi":1,"mlat":[],"tisb":[],"messages":2020002,"seen":0.3,"rssi":-19.4,"dst":92.222,"dir":136.9}, +{"hex":"a4ca8c","type":"adsb_icao","flight":"N408CA ","r":"N408CA","t":"P28A","alt_baro":"ground","gs":0.0,"true_heading":22.50,"squawk":"1200","emergency":"none","category":"A1","lat":32.811937,"lon":-117.131536,"nic":9,"rc":75,"seen_pos":4.256,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":9819420,"seen":3.3,"rssi":-13.5,"dst":92.220,"dir":136.9}, +{"hex":"abaf9c","type":"adsb_icao","flight":"ARCAT068","r":"N852JP","t":"BE20","alt_baro":"ground","gs":0.0,"true_heading":345.94,"squawk":"0264","emergency":"none","category":"A1","lat":32.812066,"lon":-117.131284,"nic":9,"rc":75,"seen_pos":4.550,"version":2,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":2070300,"seen":2.5,"rssi":-18.4,"dst":92.223,"dir":136.9}, +{"hex":"a95a83","type":"adsb_icao","flight":"N701YZ ","r":"N701YZ","t":"SR20","alt_baro":3000,"alt_geom":3000,"gs":116.3,"track":207.67,"baro_rate":0,"geom_rate":0,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":3008,"nav_heading":191.95,"nav_modes":["autopilot","althold"],"lat":32.950790,"lon":-117.116290,"nic":9,"rc":75,"seen_pos":0.347,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1845780,"seen":0.1,"rssi":-6.5,"dst":86.803,"dir":132.8}, +{"hex":"a78140","type":"adsb_icao","flight":"N583CA ","r":"N583CA","t":"P28A","alt_baro":1425,"alt_geom":1325,"gs":92.1,"track":115.73,"baro_rate":64,"geom_rate":-64,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":1408,"lat":32.789291,"lon":-117.114368,"nic":9,"rc":75,"seen_pos":0.358,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":5912497,"seen":0.0,"rssi":-4.7,"dst":93.809,"dir":137.1}, +{"hex":"a18781","type":"adsb_icao","flight":"N198SP ","r":"N198SP","t":"C172","dbFlags":8,"alt_baro":1100,"alt_geom":1050,"gs":76.9,"track":206.23,"baro_rate":-320,"geom_rate":-192,"squawk":"1200","emergency":"none","category":"A1","lat":32.808334,"lon":-117.103821,"nic":10,"rc":25,"seen_pos":0.205,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":4821058,"seen":0.2,"rssi":-8.1,"dst":93.327,"dir":136.4}, +{"hex":"a56dc7","type":"adsb_icao","flight":"N449TT ","r":"N449TT","t":"PA46","alt_baro":10525,"alt_geom":11050,"gs":177.6,"track":274.52,"baro_rate":0,"squawk":"0236","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":1504,"lat":33.649567,"lon":-117.103608,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":484719,"seen":0.0,"rssi":-6.7,"dst":66.060,"dir":104.9}, +{"hex":"a9f74c","type":"adsb_icao","flight":"N741LS ","r":"N741LS","t":"R44","alt_baro":4100,"alt_geom":4175,"gs":101.2,"track":78.02,"baro_rate":704,"geom_rate":576,"squawk":"1200","emergency":"none","category":"A1","lat":33.966654,"lon":-117.082443,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1164024,"seen":0.0,"rssi":-14.7,"dst":64.631,"dir":88.2}, +{"hex":"a5724f","type":"adsb_icao","flight":"N450CA ","r":"N450CA","t":"P28A","alt_baro":5025,"alt_geom":5125,"gs":88.1,"track":129.47,"baro_rate":0,"geom_rate":-64,"squawk":"4660","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":4992,"lat":33.056930,"lon":-117.078272,"nic":9,"rc":75,"seen_pos":0.230,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":6300525,"seen":0.0,"rssi":-4.7,"dst":84.012,"dir":128.8}, +{"hex":"a3fccc","type":"adsb_icao","flight":"N356TM ","r":"N356TM","alt_baro":6500,"alt_geom":6625,"gs":137.0,"track":37.29,"baro_rate":128,"geom_rate":-128,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":7104,"nav_heading":19.69,"nav_modes":["autopilot","althold"],"lat":33.538653,"lon":-117.074573,"nic":9,"rc":75,"seen_pos":0.205,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":104463,"seen":0.1,"rssi":-10.5,"dst":69.488,"dir":109.9}, +{"hex":"ac7e63","type":"adsb_icao","flight":"N904DR ","r":"N904DR","t":"C172","alt_baro":3375,"alt_geom":3350,"gs":73.4,"track":152.39,"baro_rate":-256,"geom_rate":-256,"squawk":"0212","emergency":"none","category":"A1","lat":33.024536,"lon":-117.073883,"nic":9,"rc":75,"seen_pos":0.280,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3934807,"seen":0.2,"rssi":-9.6,"dst":85.431,"dir":129.7}, +{"hex":"ac742e","type":"adsb_icao","flight":"N901PF ","r":"N901PF","t":"SR22","alt_baro":4500,"alt_geom":4575,"gs":142.8,"track":135.57,"baro_rate":0,"geom_rate":0,"squawk":"0205","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":4512,"lat":32.918106,"lon":-117.063281,"nic":9,"rc":75,"seen_pos":0.280,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1093100,"seen":0.1,"rssi":-9.2,"dst":90.092,"dir":132.6}, +{"hex":"a51d91","type":"adsb_icao","flight":"N429FF ","r":"N429FF","t":"C172","dbFlags":8,"alt_baro":5400,"alt_geom":5625,"gs":102.0,"track":24.30,"baro_rate":-64,"geom_rate":640,"squawk":"1200","emergency":"none","category":"A1","lat":33.336383,"lon":-117.056131,"nic":8,"rc":186,"seen_pos":0.333,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":3573069,"seen":0.1,"rssi":-9.9,"dst":75.447,"dir":118.3}, +{"hex":"a76651","type":"adsb_icao","flight":"N576SP ","r":"N576SP","t":"C172","alt_baro":6400,"alt_geom":6625,"gs":117.2,"track":3.42,"baro_rate":64,"geom_rate":64,"squawk":"4626","emergency":"none","category":"A1","lat":33.476738,"lon":-117.054730,"nic":9,"rc":75,"seen_pos":0.152,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":1862392,"seen":0.1,"rssi":-6.1,"dst":71.796,"dir":112.4}, +{"hex":"a46c1a","type":"adsb_icao","flight":"N384W ","r":"N384W","t":"SR22","alt_baro":2550,"alt_geom":2550,"gs":121.2,"track":326.44,"baro_rate":640,"geom_rate":1024,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1012.8,"nav_altitude_mcp":11488,"lat":33.369827,"lon":-117.030377,"nic":9,"rc":75,"seen_pos":0.494,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":1177672,"seen":0.4,"rssi":-13.9,"dst":75.638,"dir":116.5}, +{"hex":"acae7c","type":"adsb_icao","flight":"N916RR ","r":"N916RR","t":"C172","alt_baro":3950,"alt_geom":4025,"gs":87.6,"track":286.57,"baro_rate":704,"geom_rate":832,"squawk":"0245","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":2400,"nav_heading":97.03,"nav_modes":[],"lat":33.077866,"lon":-117.026312,"nic":9,"rc":75,"seen_pos":0.509,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":2480601,"seen":0.1,"rssi":-7.9,"dst":85.271,"dir":127.0}, +{"hex":"a5cc72","type":"adsb_icao","flight":"N473CA ","r":"N473CA","t":"C172","alt_baro":3475,"alt_geom":3475,"gs":100.2,"track":257.91,"baro_rate":64,"geom_rate":64,"squawk":"4636","emergency":"none","category":"A1","lat":32.789154,"lon":-117.006262,"nic":9,"rc":75,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":7202821,"seen":0.0,"rssi":-6.9,"dst":97.568,"dir":134.7}, +{"hex":"a91c89","type":"adsb_icao","flight":"N6865A ","r":"N6865A","t":"PA44","dbFlags":8,"alt_baro":5300,"alt_geom":5425,"gs":98.3,"track":257.66,"baro_rate":-384,"geom_rate":-448,"squawk":"1200","emergency":"none","category":"A2","lat":33.556000,"lon":-116.976312,"nic":10,"rc":25,"seen_pos":0.197,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["baro_rate"],"messages":762252,"seen":0.0,"rssi":-7.1,"dst":73.770,"dir":107.8}, +{"hex":"add0c9","type":"adsb_icao","flight":"N99FB ","r":"N99FB","t":"PA24","alt_baro":4650,"alt_geom":4750,"gs":156.9,"track":341.80,"baro_rate":768,"squawk":"1200","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":10496,"lat":33.091324,"lon":-116.936005,"nic":9,"rc":75,"seen_pos":0.509,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":532751,"seen":0.2,"rssi":-6.7,"dst":88.434,"dir":124.8}, +{"hex":"ae685b","type":"mlat","flight":"@@@@@@@@","dbFlags":1,"alt_baro":475,"calc_track":8,"squawk":"7101","lat":34.461326,"lon":-116.912426,"nic":0,"rc":0,"seen_pos":42.554,"alert":0,"spi":0,"mlat":["lat","lon","nic","rc"],"tisb":[],"messages":1729075,"seen":1.1,"rssi":-22.9,"dst":79.319,"dir":66.3}, +{"hex":"a9c6a0","type":"adsb_icao","flight":"SWA2145 ","r":"N729SW","t":"B737","alt_baro":27000,"alt_geom":28175,"gs":445.6,"ias":281,"tas":426,"mach":0.704,"wd":209,"ws":27,"oat":-32,"tat":-8,"track":71.28,"track_rate":0.03,"roll":0.00,"mag_heading":62.23,"true_heading":73.70,"baro_rate":-64,"geom_rate":-64,"squawk":"4637","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":24000,"nav_altitude_fms":27008,"nav_heading":61.17,"lat":34.872070,"lon":-116.899015,"nic":8,"rc":186,"seen_pos":0.231,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":20863977,"seen":0.1,"rssi":-12.3,"dst":92.277,"dir":52.2}, +{"hex":"a0c9ec","type":"adsb_icao","flight":"N15XJ ","r":"N15XJ","t":"PA46","alt_baro":9675,"alt_geom":10125,"gs":180.0,"track":268.73,"baro_rate":-448,"squawk":"4677","emergency":"none","category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":6016,"nav_heading":258.05,"nav_modes":["autopilot","lnav"],"lat":33.943518,"lon":-116.889668,"nic":9,"rc":75,"seen_pos":0.231,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":77124,"seen":0.2,"rssi":-18.0,"dst":74.235,"dir":89.4}, +{"hex":"a71302","type":"adsb_icao","flight":"N555LK ","r":"N555LK","t":"GLF4","dbFlags":8,"alt_baro":16425,"alt_geom":17275,"gs":399.3,"track":321.61,"geom_rate":-4928,"squawk":"5311","emergency":"none","category":"A2","nav_altitude_mcp":12000,"lat":33.448792,"lon":-116.875854,"nic":8,"rc":186,"seen_pos":0.353,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7804057,"seen":0.1,"rssi":-6.6,"dst":80.717,"dir":111.0}, +{"hex":"a4ac01","type":"adsb_icao","flight":"N40TR ","r":"N40TR","t":"BE36","alt_baro":9000,"alt_geom":9275,"gs":163.2,"track":272.46,"baro_rate":128,"geom_rate":-128,"squawk":"0252","emergency":"none","category":"A2","nav_qnh":1011.2,"nav_heading":293.91,"lat":33.932950,"lon":-116.874104,"nic":9,"rc":75,"seen_pos":0.449,"version":2,"nic_baro":0,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":["geom_rate"],"messages":40417,"seen":0.3,"rssi":-17.6,"dst":75.016,"dir":89.9}, +{"hex":"a58938","type":"adsb_icao","flight":"N456JK ","r":"N456JK","t":"GLID","alt_baro":13450,"alt_geom":14150,"gs":99.1,"track":329.04,"geom_rate":64,"squawk":"1202","emergency":"none","category":"B1","lat":34.795578,"lon":-116.779623,"nic":8,"rc":186,"seen_pos":0.158,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1448707,"seen":0.2,"rssi":-26.0,"dst":94.502,"dir":56.6}, +{"hex":"a44917","type":"adsb_icao","flight":"UAL2406 ","r":"N37522","t":"B39M","alt_baro":26075,"alt_geom":27325,"gs":386.9,"track":244.43,"baro_rate":-2176,"squawk":"6254","emergency":"none","category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":12000,"nav_heading":229.22,"lat":34.313004,"lon":-116.729736,"nic":8,"rc":186,"seen_pos":0.438,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":27013607,"seen":0.1,"rssi":-14.9,"dst":85.027,"dir":74.3}, +{"hex":"a9e4d5","type":"adsb_icao","flight":"N7368R ","r":"N7368R","t":"BE33","alt_baro":7575,"alt_geom":7800,"gs":131.0,"track":89.56,"geom_rate":256,"squawk":"1200","emergency":"none","category":"A1","lat":33.165257,"lon":-116.724299,"nic":9,"rc":75,"seen_pos":0.037,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":283943,"seen":0.0,"rssi":-5.1,"dst":95.008,"dir":118.8}, +{"hex":"aa228c","type":"adsb_icao","flight":"N752MB ","r":"N752MB","t":"SR22","alt_baro":8650,"alt_geom":9050,"gs":156.3,"track":46.30,"baro_rate":896,"squawk":"4741","emergency":"none","category":"A1","nav_qnh":1013.6,"nav_altitude_mcp":11488,"lat":33.391068,"lon":-116.712048,"nic":9,"rc":75,"seen_pos":0.509,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1965999,"seen":0.0,"rssi":-12.5,"dst":89.627,"dir":111.1}, +{"hex":"a7d7c6","type":"adsb_icao","flight":"N604TB ","r":"N604TB","t":"CL60","dbFlags":8,"alt_baro":34025,"alt_geom":35575,"gs":447.0,"track":84.61,"geom_rate":960,"squawk":"2072","emergency":"none","category":"A2","nav_qnh":1012.8,"nav_altitude_mcp":35008,"nav_heading":78.05,"lat":34.782296,"lon":-116.657581,"nic":8,"rc":186,"seen_pos":0.231,"version":2,"nic_baro":1,"nac_p":10,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":217085,"seen":0.0,"rssi":-19.5,"dst":99.229,"dir":58.9}, +{"hex":"~298c96","type":"tisb_other","alt_baro":9575,"alt_geom":10350,"gs":257.4,"track":52.42,"geom_rate":0,"lat":33.555644,"lon":-116.555214,"nic":6,"rc":926,"seen_pos":1.768,"nac_p":6,"nac_v":7,"sil":2,"sil_type":"unknown","alert":0,"spi":0,"mlat":[],"tisb":["altitude","alt_geom","gs","track","geom_rate","lat","lon","nic","rc","nac_p","nac_v","sil","sil_type"],"messages":7158,"seen":1.5,"rssi":-3.7,"dst":93.976,"dir":103.7}, +{"hex":"ae2bc4","type":"adsb_icao","flight":"NTRDR11 ","dbFlags":1,"alt_baro":9525,"alt_geom":9975,"gs":263.2,"track":51.17,"baro_rate":0,"squawk":"4624","emergency":"none","category":"A7","lat":33.556948,"lon":-116.553612,"nic":10,"rc":25,"seen_pos":0.333,"version":2,"nic_baro":1,"nac_p":10,"nac_v":4,"sil":0,"sil_type":"perhour","gva":2,"sda":0,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":7373,"seen":0.1,"rssi":-8.5,"dst":94.033,"dir":103.6}, +{"hex":"a9a750","type":"adsb_icao","flight":"AAL137 ","r":"N721AN","t":"B77W","alt_baro":27125,"alt_geom":28400,"gs":392.7,"track":243.37,"baro_rate":-2048,"squawk":"1305","emergency":"none","category":"A5","nav_qnh":1012.8,"nav_altitude_mcp":12000,"nav_heading":227.81,"lat":34.385531,"lon":-116.553440,"nic":8,"rc":186,"seen_pos":0.000,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":14897895,"seen":0.0,"rssi":-23.0,"dst":94.663,"dir":73.1}, +{"hex":"a7a2b1","type":"adsb_icao","flight":"N591SC ","r":"N591SC","t":"SR22","alt_baro":575,"alt_geom":375,"gs":81.6,"track":143.97,"baro_rate":-256,"category":"A1","nav_qnh":1012.0,"nav_altitude_mcp":9600,"lat":33.834492,"lon":-116.511955,"nic":9,"rc":75,"seen_pos":33.437,"version":2,"nic_baro":1,"nac_p":10,"nac_v":2,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":1408571,"seen":32.1,"rssi":-14.4,"dst":93.323,"dir":93.4}, +{"hex":"a4b065","type":"adsb_icao","flight":"AAL1294 ","r":"N401AN","t":"A21N","alt_baro":27450,"alt_geom":28800,"gs":395.3,"track":262.59,"baro_rate":-960,"squawk":"0754","emergency":"none","category":"A3","nav_qnh":1012.8,"nav_altitude_mcp":12000,"lat":34.094766,"lon":-116.387558,"nic":8,"rc":186,"seen_pos":0.197,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":3,"alert":0,"spi":0,"mlat":[],"tisb":[],"messages":21593665,"seen":0.1,"rssi":-8.6,"dst":99.592,"dir":84.1} +] +,"msg": "No error" +,"now": 1655847666942 +,"total": 462 +,"ctime": 1655847666942 +,"ptime": 1 +} \ No newline at end of file diff --git a/Include/DataRefs.h b/Include/DataRefs.h index 98ca851..4d42e7d 100644 --- a/Include/DataRefs.h +++ b/Include/DataRefs.h @@ -977,6 +977,9 @@ class DataRefs void SetWeather (float hPa, float lat, float lon, const std::string& stationId, const std::string& METAR); /// Compute geometric altitude [ft] from pressure altitude and current weather in a very simplistic manner good enough for the first 3,000ft + static double WeatherAltCorr_ft (double pressureAlt_ft, double hPa) + { return pressureAlt_ft + ((hPa - HPA_STANDARD) * FT_per_HPA); } + /// Compute geometric altitude [ft] from pressure altitude and current weather in a very simplistic manner good enough for the first 3,000ft double WeatherAltCorr_ft (double pressureAlt_ft) { return pressureAlt_ft + altPressCorr_ft; } /// Compute geometric altitude [m] from pressure altitude and current weather in a very simplistic manner good enough for the first 3,000ft double WeatherAltCorr_m (double pressureAlt_m) { return pressureAlt_m + altPressCorr_ft * M_per_FT; } diff --git a/Include/LTADSBEx.h b/Include/LTADSBEx.h index c5b8910..e9c0ca9 100644 --- a/Include/LTADSBEx.h +++ b/Include/LTADSBEx.h @@ -40,7 +40,7 @@ #define ADSBEX_CHECK_POPUP "Check ADS-B Exchange's coverage" #define ADSBEX_NAME "ADS-B Exchange Online" -#define ADSBEX_URL "https://adsbexchange.com/api/aircraft/json/lat/%f/lon/%f/dist/%d/" +#define ADSBEX_URL "https://adsbexchange.com/api/aircraft/v2/lat/%f/lon/%f/dist/%d/" #define ADSBEX_API_AUTH "api-auth:" // additional HTTP header #define ADSBEX_RAPIDAPI_25_URL "https://adsbx-flight-sim-traffic.p.rapidapi.com/api/aircraft/json/lat/%f/lon/%f/dist/25/" @@ -50,40 +50,32 @@ #define ADSBEX_RAPIDAPI_RREMAIN "X-RateLimit-Requests-Remaining:" #define ADSBEX_TOTAL "total" -#define ADSBEX_TIME "ctime" +#define ADSBEX_NOW "now" #define ADSBEX_AIRCRAFT_ARR "ac" -#define ADSBEX_TRANSP_ICAO "icao" // Key data -#define ADSBEX_TRT "trt" -#define ADSBEX_RADAR_CODE "sqk" // Dynamic data -#define ADSBEX_CALL "call" +#define ADSBEX_TRANSP_ICAO "hex" // Key data +#define ADSBEX_RADAR_CODE "squawk" // Dynamic data +#define ADSBEX_FLIGHT "flight" #define ADSBEX_LAT "lat" #define ADSBEX_LON "lon" -#define ADSBEX_ELEVATION "galt" // geometric altitude -#define ADSBEX_ALT "alt" // barometric altitude -#define ADSBEX_HEADING "trak" -#define ADSBEX_GND "gnd" -#define ADSBEX_POS_TIME "postime" -#define ADSBEX_SPD "spd" -#define ADSBEX_VSI "vsi" -#define ADSBEX_REG "reg" -#define ADSBEX_COUNTRY "cou" -#define ADSBEX_AC_TYPE_ICAO "type" -#define ADSBEX_MIL "mil" -#define ADSBEX_OP_ICAO "opicao" -#define ADSBEX_ORIGIN "from" -#define ADSBEX_DESTINATION "to" - -#define ADSBEX_TYPE_GND "-GND" - -// still used in historic data code, unsure if supported: -#define ADSBEX_RCVR "Rcvr" -#define ADSBEX_SIG "Sig" -#define ADSBEX_COS "Cos" // array of short trails +#define ADSBEX_ALT_GEOM "alt_geom" // geometric altitude +#define ADSBEX_ALT_BARO "alt_baro" // barometric altitude +#define ADSBEX_NAV_QNH "nav_qnh" // QNH of barometric altitude +#define ADSBEX_HEADING "true_heading" +#define ADSBEX_TRACK "track" +#define ADSBEX_SEE_POS "seen_pos" +#define ADSBEX_SPD "gs" +#define ADSBEX_VSI_GEOM "geom_rate" +#define ADSBEX_VSI_BARO "baro_rate" +#define ADSBEX_REG "r" +#define ADSBEX_AC_TYPE_ICAO "t" +#define ADSBEX_AC_CATEGORY "category" +#define ADSBEX_FLAGS "dbFlags" // Testing an API key #define ADSBEX_VERIFY_KEY_URL "https://adsbexchange.com/api/aircraft/icao/000000" #define ADSBEX_ERR "msg" -#define ADSBEX_NO_API_KEY "You need a key." +#define ADSBEX_SUCCESS "No error" +#define ADSBEX_NO_API_KEY "You need an authorized API key." #define ADSBEX_VERIFY_RAPIDAPI "https://adsbx-flight-sim-traffic.p.rapidapi.com/api/aircraft/json/lat/0.0/lon/0.0/dist/25/" #define ADSBEX_RAPID_ERR "message" diff --git a/Include/LTFlightData.h b/Include/LTFlightData.h index f2a5672..dea21d5 100644 --- a/Include/LTFlightData.h +++ b/Include/LTFlightData.h @@ -28,16 +28,6 @@ // from LTChannel.h class LTChannel; -// transponder types (as defined by ADSB exchange) -enum transpTy { - trt_Unknown=0, - trt_Mode_S=1, - trt_ADS_B_unknown=2, - trt_ADS_B_0=3, - trt_ADS_B_1=4, - trt_ADS_B_2=5 -}; - // //MARK: Flight Data // Represents an Aircraft's flight data, as read from the source(s) @@ -105,7 +95,6 @@ class LTFlightData int engMount = -1; // type of engine mount int year = 0; // year built 2008 bool mil = false; // military? false - transpTy trt = trt_Unknown; // transponder type ADS_B_unknown=2 // more aircraft info const Doc8643* pDoc8643 = NULL; @@ -153,7 +142,7 @@ class LTFlightData // KEY (protected, can be set only once, no mutex-control) public: // in ascending order of priority - enum FDKeyType { KEY_UNKNOWN=0, KEY_OGN, KEY_RT, KEY_FLARM, KEY_ICAO, KEY_FSC }; + enum FDKeyType { KEY_UNKNOWN=0, KEY_OGN, KEY_RT, KEY_FLARM, KEY_ICAO, KEY_FSC, KEY_ADSBEX }; struct FDKeyTy { FDKeyType eKeyType = KEY_UNKNOWN; std::string key; // the primary key in use diff --git a/Src/LTADSBEx.cpp b/Src/LTADSBEx.cpp index 3925fa6..d51b5cd 100644 --- a/Src/LTADSBEx.cpp +++ b/Src/LTADSBEx.cpp @@ -89,7 +89,8 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) // test for ERRor response const std::string errTxt = jog_s(pObj, sERR); - if (!errTxt.empty()) { + if (!errTxt.empty() && + errTxt != ADSBEX_SUCCESS) { if (begins_with(errTxt, sNOK)) { SHOW_MSG(logERR, ERR_ADSBEX_KEY_FAILED); SetValid(false); @@ -105,13 +106,14 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) const positionTy viewPos = dataRefs.GetViewPos(); // for determining an offset as compared to network time we need to know network time - double adsbxTime = jog_n(pObj, ADSBEX_TIME) / 1000.0; + // Also used later to calcualte the position's timestamp + const double adsbxTime = jog_n(pObj, ADSBEX_NOW) / 1000.0; if (adsbxTime > JAN_FIRST_2019) // if reasonable add this to our time offset calculation dataRefs.ChTsOffsetAdd(adsbxTime); - // Cut-off time: We ignore tracking data, which is "in the past" compared to simTime - const double tsCutOff = dataRefs.GetSimTime(); + // Cut-off time: We ignore tracking data, which is older than our buffering time + const double tsCutOff = (double) dataRefs.GetFdBufPeriod(); // let's cycle the aircraft // fetch the aircraft array @@ -131,54 +133,114 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) } } - // the key: transponder Icao code - LTFlightData::FDKeyTy fdKey (LTFlightData::KEY_ICAO, - jog_s(pJAc, ADSBEX_TRANSP_ICAO)); - - // not matching a/c filter? -> skip it - if (!acFilter.empty() && (fdKey != acFilter)) - { - continue; - } - - // ADS-B returns Java tics, that is milliseconds, we use seconds - const double posTime = jog_sn(pJAc, ADSBEX_POS_TIME) / 1000.0; - // skip stale data - if (posTime <= tsCutOff) + std::string hexKey = jog_s(pJAc, ADSBEX_TRANSP_ICAO); + if (hexKey.empty()) continue; - // ADSBEx, especially the RAPID API version, returns - // aircraft regardless of distance. To avoid planes - // created and immediately removed due to distanced settings - // we continue only if pos is within wanted range - positionTy pos (jog_sn_nan(pJAc, ADSBEX_LAT), - jog_sn_nan(pJAc, ADSBEX_LON), - NAN, - posTime); - const double dist = pos.dist(viewPos); - if (dist > dataRefs.GetFdStdDistance_m() ) - continue; - - // Are we to skip static objects? - if (dataRefs.GetHideStaticTwr()) { - if (!strcmp(jog_s(pJAc, ADSBEX_GND), "1") && // on the ground - !*jog_s(pJAc, ADSBEX_AC_TYPE_ICAO) && // no type - !*jog_s(pJAc, ADSBEX_HEADING) && // no `trak` heading, not even "0" - !*jog_s(pJAc, ADSBEX_CALL) && // no call sign - !*jog_s(pJAc, ADSBEX_REG) && // no tail number - !strcmp(jog_s(pJAc, ADSBEX_SPD), "0")) // speed exactly "0" - // skip + try { + // the key: transponder Icao code or some other code + LTFlightData::FDKeyType keyType = LTFlightData::KEY_ICAO; + if (hexKey.front() == '~') { // key is a non-icao code? + hexKey.erase(0, 1); // remove the ~ + keyType = LTFlightData::KEY_ADSBEX; + } + LTFlightData::FDKeyTy fdKey (keyType, hexKey); + + // not matching a/c filter? -> skip it + if (!acFilter.empty() && (fdKey != acFilter)) + { continue; - } + } + + // ADS-B returns Java tics, that is milliseconds, we use seconds + const double ageOfPos = jog_sn(pJAc, ADSBEX_SEE_POS); + // skip stale data + if (ageOfPos >= tsCutOff) + continue; + + // Try getting best possible position information + // Some fields can come back NAN if not defined + positionTy pos (jog_n_nan(pJAc, ADSBEX_LAT), + jog_n_nan(pJAc, ADSBEX_LON), + jog_n_nan(pJAc, ADSBEX_ALT_GEOM) * M_per_FT, + adsbxTime - ageOfPos, + jog_n_nan(pJAc, ADSBEX_HEADING)); + + // If lat/lon isn't defined then the tracking data is stale: discard + if (std::isnan(pos.lat()) || std::isnan(pos.lon())) + continue; + + // ADSBEx, especially the RAPID API version, returns + // aircraft regardless of distance. To avoid planes + // created and immediately removed due to distanced settings + // we continue only if pos is within wanted range + const double dist = pos.dist(viewPos); + if (dist > dataRefs.GetFdStdDistance_m() ) + continue; + + // The alt_baro field is string "ground" if on ground or can hold a baro altitude number + const JSON_Value* pAltBaro = json_object_get_value(pJAc, ADSBEX_ALT_BARO); + if (pAltBaro) { + switch (json_value_get_type(pAltBaro)) + { + case JSONNumber: + pos.f.onGrnd = GND_OFF; // we are definitely off ground + // But we only need to _process_ baro alt if we don't yet have an altitude + if (std::isnan(pos.alt_m())) + { + // try converting baro alt from given QNH, otherwise we use our own weather + const double baro_alt = json_number(pAltBaro); + const double qnh = jog_n_nan(pJAc, ADSBEX_NAV_QNH); + if (std::isnan(qnh)) + pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt)); + else + pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt, qnh)); + } + break; + + case JSONString: + // There is just one string we are aware of: "ground" + if (!strcmp(json_string(pAltBaro), "ground")) { + pos.f.onGrnd = GND_ON; + pos.alt_m() = NAN; + } + break; + } + } + // _Some_ altitude info needs to be available now, otherwise skip data + if (!pos.IsOnGnd() && std::isnan(pos.alt_m())) + continue; + + // Are we to skip static objects? + const std::string reg = jog_s(pJAc, ADSBEX_REG); + std::string acTy = jog_s(pJAc, ADSBEX_AC_TYPE_ICAO); + const std::string cat = jog_s(pJAc, ADSBEX_AC_CATEGORY); + + // Skip static objects + if (dataRefs.GetHideStaticTwr()) { + if (reg == "TWR" || + acTy == "TWR" || + cat == "C3") + // skip + continue; + } + + // Identify ground vehicles + if (cat == "C1" || cat == "C2" || + reg == "GND" || + acTy == "GND") + acTy = dataRefs.GetDefaultCarIcaoType(); + else if (pos.IsOnGnd() && + acTy.empty() && reg.empty() && cat.empty()) + acTy = dataRefs.GetDefaultCarIcaoType(); - try { // from here on access to fdMap guarded by a mutex // until FD object is inserted and updated std::unique_lock mapFdLock (mapFdMutex); // Check for duplicates with OGN/FLARM, potentially replaces the key type LTFlightData::CheckDupKey(fdKey, LTFlightData::KEY_FLARM); - + // get the fd object from the map, key is the transpIcao // this fetches an existing or, if not existing, creates a new one LTFlightData& fd = fdMap[fdKey]; @@ -195,58 +257,29 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) // -- fill static data -- LTFlightData::FDStaticData stat; - stat.reg = jog_s(pJAc, ADSBEX_REG); - stat.country = jog_s(pJAc, ADSBEX_COUNTRY); - stat.acTypeIcao = jog_s(pJAc, ADSBEX_AC_TYPE_ICAO); - stat.mil = jog_sb(pJAc, ADSBEX_MIL); - stat.trt = transpTy(jog_sl(pJAc,ADSBEX_TRT)); - stat.opIcao = jog_s(pJAc, ADSBEX_OP_ICAO); - stat.call = jog_s(pJAc, ADSBEX_CALL); - stat.originAp = jog_s(pJAc, ADSBEX_ORIGIN); - stat.destAp = jog_s(pJAc, ADSBEX_DESTINATION); + stat.reg = reg; + stat.acTypeIcao = acTy; + stat.mil = (jog_l(pJAc, ADSBEX_FLAGS) & 0x01) == 0x01; + stat.call = jog_s(pJAc, ADSBEX_FLIGHT); + trim(stat.call); + stat.catDescr = GetADSBEmitterCat(cat); stat.slug = ADSBEX_SLUG_BASE; stat.slug += fdKey.key; - // ADSBEx sends airport info like "LHR London Heathrow United Kingdom" - // That's way to long... - cut_off(stat.originAp, " "); - cut_off(stat.destAp, " "); - // -- dynamic data -- LTFlightData::FDDynamicData dyn; // non-positional dynamic data dyn.radar.code = jog_sl(pJAc, ADSBEX_RADAR_CODE); - dyn.gnd = jog_sb(pJAc, ADSBEX_GND); - dyn.heading = jog_sn_nan(pJAc, ADSBEX_HEADING); - dyn.spd = jog_sn(pJAc, ADSBEX_SPD); - dyn.vsi = jog_sn(pJAc, ADSBEX_VSI); - dyn.ts = posTime; + dyn.gnd = pos.IsOnGnd(); + dyn.heading = pos.heading(); + dyn.spd = jog_n_nan(pJAc, ADSBEX_SPD); + dyn.vsi = jog_n_nan(pJAc, ADSBEX_ALT_GEOM); + if (std::isnan(dyn.vsi)) + dyn.vsi = jog_n_nan(pJAc, ADSBEX_ALT_BARO); + dyn.ts = pos.ts(); dyn.pChannel = this; - // altitude, if airborne; fetch barometric altitude here - const double alt_ft = dyn.gnd ? NAN : jog_sn_nan(pJAc, ADSBEX_ALT); - - // position: altitude, heading, ground status - pos.SetAltFt(dataRefs.WeatherAltCorr_ft(alt_ft)); - pos.heading() = dyn.heading; - pos.f.onGrnd = dyn.gnd ? GND_ON : GND_OFF; - - // -- Ground vehicle identification -- - // Sometimes we get "-GND", replace it with "ZZZC" - if (stat.acTypeIcao == ADSBEX_TYPE_GND) - stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); - - // But often, ADSBEx doesn't send a clear indicator - if (stat.acTypeIcao.empty() && // don't know a/c type yet - stat.reg.empty() && // don't have tail number - dyn.gnd && // on the ground - dyn.spd < 50.0) // reasonable speed - { - // we assume ground vehicle - stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); - } - // update the a/c's master data fd.UpdateData(std::move(stat), dist); @@ -256,9 +289,11 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) } else LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),pos.dbgTxt().c_str()); - + } catch(const std::system_error& e) { LOG_MSG(logERR, ERR_LOCK_ERROR, "mapFd", e.what()); + } catch(...) { + LOG_MSG(logERR, "Exception while processing data for '%s'", hexKey.c_str()); } } @@ -487,9 +522,10 @@ bool ADSBExchangeConnection::DoTestADSBExAPIKey (const std::string newKey) // definitely received an error response SHOW_MSG(logERR, ERR_ADSBEX_KEY_FAILED); } - // check what we received in the buffer - else if (readBuf.find(ADSBEX_TOTAL) != std::string::npos && - readBuf.find(ADSBEX_TIME) != std::string::npos) + // check what we received in the buffer: an "ac" array, or both 'total' and 'now'? + else if (readBuf.find("\"" ADSBEX_AIRCRAFT_ARR "\"") != std::string::npos || + (readBuf.find(ADSBEX_TOTAL) != std::string::npos && + readBuf.find(ADSBEX_NOW) != std::string::npos)) { // looks like a valid response containing a/c info bResult = true; diff --git a/Src/LTFlightData.cpp b/Src/LTFlightData.cpp index e75f16f..f2f6156 100644 --- a/Src/LTFlightData.cpp +++ b/Src/LTFlightData.cpp @@ -46,6 +46,7 @@ std::atomic_flag flagNoNewPosToAdd = ATOMIC_FLAG_INIT; // LTFlightData::FDDynamicData::FDDynamicData () : gnd(false), // positional +heading(NAN), spd(0.0), vsi(0.0), // movement ts(0), pChannel(nullptr) @@ -106,7 +107,6 @@ bool LTFlightData::FDStaticData::merge (const FDStaticData& other, if (!other.catDescr.empty()) catDescr = other.catDescr; if (other.year) year = other.year; if (other.mil) mil = other.mil; // this only overwrite if 'true'... - if (other.trt) trt = other.trt; // flight if (!other.call.empty()) call = other.call; @@ -231,15 +231,17 @@ std::string LTFlightData::FDKeyTy::SetKey (FDKeyType _eType, unsigned long _num) case KEY_ICAO: case KEY_FLARM: case KEY_FSC: + case KEY_ADSBEX: snprintf(buf, sizeof(buf), "%06lX", _num); break; case KEY_OGN: case KEY_RT: snprintf(buf, sizeof(buf), "%08lX", _num); break; - default: + case KEY_UNKNOWN: // must not happen LOG_ASSERT(eKeyType!=KEY_UNKNOWN); + break; } LOG_ASSERT(buf[0]); return key = buf; @@ -267,6 +269,7 @@ const char* LTFlightData::FDKeyTy::GetKeyTypeText () const case KEY_FLARM: return "FLARM"; case KEY_ICAO: return "ICAO"; case KEY_FSC: return "FSCharter"; + case KEY_ADSBEX: return "ADSBEx"; } return "unknown"; } diff --git a/Src/LTOpenSky.cpp b/Src/LTOpenSky.cpp index 050cf58..ac1dacb 100644 --- a/Src/LTOpenSky.cpp +++ b/Src/LTOpenSky.cpp @@ -168,7 +168,6 @@ bool OpenSkyConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) // fill static data LTFlightData::FDStaticData stat; stat.country = jag_s(pJAc, OPSKY_COUNTRY); - stat.trt = trt_ADS_B_unknown; stat.call = jag_s(pJAc, OPSKY_CALL); while (!stat.call.empty() && stat.call.back() == ' ') // trim trailing spaces stat.call.pop_back(); diff --git a/docs/readme.html b/docs/readme.html index 0c25796..b024077 100755 --- a/docs/readme.html +++ b/docs/readme.html @@ -177,9 +177,10 @@

    v3.0.0 X-Plane 12 Support

    aircraft are seen in the data than can be displayed.
  • - ADS-B Exchange: NEW #224: - Read provided departure/arrival airport info, which comes as - 3-letter IATA codes. + ADS-B Exchange: Switch to version 2 data format.
    + Provides more data for potentially better altitude and + type of vehicle information. Will become mandatory as the v1 + format will be phased out by ADS-B Exchange at some point in time.
  • RealTraffic: NEW #229 From 7a3105cc155078f0f0c92461a89dcbf54a871a1e Mon Sep 17 00:00:00 2001 From: TwinFan Date: Wed, 6 Jul 2022 00:17:50 +0200 Subject: [PATCH 5/7] Fixes to RT static object ident and RT/OpenSky vehicle ident --- Resources/SendTraffic.py | 2 +- Src/LTOpenSky.cpp | 3 +++ Src/LTRealTraffic.cpp | 8 +++++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Resources/SendTraffic.py b/Resources/SendTraffic.py index ba16ed8..c9413f2 100755 --- a/Resources/SendTraffic.py +++ b/Resources/SendTraffic.py @@ -130,7 +130,7 @@ def sendTrafficData(ln: str, doSend: int) -> int: def sendWeatherData(ln: str) -> int: sock.sendto(ln.encode('ascii'), (args.host, args.weatherPort)) if args.verbose: - print (ln) + print ("Weather: {}".format(ln)) return 1 """ === Open listening port for user's position === """ diff --git a/Src/LTOpenSky.cpp b/Src/LTOpenSky.cpp index ac1dacb..84d1ea7 100644 --- a/Src/LTOpenSky.cpp +++ b/Src/LTOpenSky.cpp @@ -476,6 +476,9 @@ bool OpenSkyAcMasterdata::ProcessFetchedData (mapLTFlightDataTy& /*fdMap*/) statDat.mdl = statDat.catDescr.c_str() + OPSKY_MD_TEXT_VEHICLE_LEN; } } + // Replace type GRND with our default car type, too + else if (statDat.acTypeIcao == "GRND") + statDat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); } // *** Route Information *** diff --git a/Src/LTRealTraffic.cpp b/Src/LTRealTraffic.cpp index 8a623c9..e5fe681 100644 --- a/Src/LTRealTraffic.cpp +++ b/Src/LTRealTraffic.cpp @@ -742,8 +742,8 @@ bool RealTrafficConnection::ProcessRTTFC (LTFlightData::FDKeyTy& fdKey, // *** Potentially skip static objects *** const std::string& sCat = tfc[RT_RTTFC_CATEGORY]; if (dataRefs.GetHideStaticTwr() && // shall ignore static objects? - (// Aircraft's category is C1 or C2? - (sCat.length() == 2 && sCat[0] == 'C' && (sCat[1] == '1' || sCat[1] == '2')) || + (// Aircraft's category is C3, C4, or C5? + (sCat.length() == 2 && sCat[0] == 'C' && (sCat[1] == '3' || sCat[1] == '4' || sCat[1] == '5')) || // - OR - tail and type are 'TWR' (as in previous msg types) (tfc[RT_RTTFC_AC_TAILNO] == "TWR" && tfc[RT_RTTFC_AC_TYPE] == "TWR") @@ -842,7 +842,9 @@ bool RealTrafficConnection::ProcessRTTFC (LTFlightData::FDKeyTy& fdKey, pos.f.onGrnd = dyn.gnd ? GND_ON : GND_OFF; // Vehicle? - if (sCat.length() == 2 && sCat[0] == 'C' && (sCat[1] == '1' || sCat[1] == '2')) + if (stat.acTypeIcao == "GRND") // some vehicles come with type 'GRND'... + stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); + else if (sCat.length() == 2 && sCat[0] == 'C' && (sCat[1] == '1' || sCat[1] == '2')) stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); else if (sCat.empty() && dyn.gnd && stat.acTypeIcao.empty() && stat.reg.empty()) stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); From 24a73e37a7641b2b1522f10ff7a0e3a8a6f0be7c Mon Sep 17 00:00:00 2001 From: TwinFan Date: Fri, 8 Jul 2022 00:06:20 +0200 Subject: [PATCH 6/7] OpenSky credentials, remaining requests, closes #237 --- Include/Constants.h | 3 ++ Include/DataRefs.h | 13 ++++- Include/LTADSBEx.h | 1 + Include/LTOpenSky.h | 8 +++ Include/SettingsUI.h | 5 ++ Src/DataRefs.cpp | 13 ++++- Src/LTADSBEx.cpp | 18 +++++++ Src/LTOpenSky.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++ Src/SettingsUI.cpp | 76 +++++++++++++++++++++++++++++ docs/readme.html | 9 ++++ 10 files changed, 256 insertions(+), 4 deletions(-) diff --git a/Include/Constants.h b/Include/Constants.h index 50ed5c7..f6ec8e4 100644 --- a/Include/Constants.h +++ b/Include/Constants.h @@ -203,6 +203,8 @@ constexpr const char* REMOTE_SIGNATURE = "TwinFan.plugin.XPMP2.Remote"; #define CFG_DEFAULT_CAR_TYPE "DEFAULT_CAR_TYPE" #define CFG_DEFAULT_AC_TYP_INFO "Default a/c type is '%s'" #define CFG_DEFAULT_CAR_TYP_INFO "Default car type is '%s'" +#define CFG_OPENSKY_USER "OpenSky_User" +#define CFG_OPENSKY_PWD "OpenSky_Pwd" #define CFG_ADSBEX_API_KEY "ADSBEX_API_KEY" #define CFG_FSC_USER "FSC_User" #define CFG_FSC_PWD "FSC_Pwd" @@ -289,6 +291,7 @@ constexpr long HTTP_BAD_REQUEST = 400; constexpr long HTTP_UNAUTHORIZED = 401; constexpr long HTTP_FORBIDDEN = 403; constexpr long HTTP_NOT_FOUND = 404; +constexpr long HTTP_TOO_MANY_REQU = 429; ///< too many requests, e.g. OpenSky after request limit ran out constexpr long HTTP_BAD_GATEWAY = 502; // typical cloudflare responses: Bad Gateway constexpr long HTTP_NOT_AVAIL = 503; // Service not available constexpr long HTTP_GATEWAY_TIMEOUT=504; // Gateway Timeout diff --git a/Include/DataRefs.h b/Include/DataRefs.h index 4d42e7d..d41ea2e 100644 --- a/Include/DataRefs.h +++ b/Include/DataRefs.h @@ -680,9 +680,11 @@ class DataRefs std::string sDefaultAcIcaoType = CSL_DEFAULT_ICAO_TYPE; std::string sDefaultCarIcaoType = CSL_CAR_ICAO_TYPE; + std::string sOpenSkyUser; ///< OpenSky Network user + std::string sOpenSkyPwd; ///< OpenSky Network password std::string sADSBExAPIKey; ///< ADS-B Exchange API key std::string sFSCUser; ///< FSCharter login user - std::string sFSCPwd; ///< FSCharter login password, base64-encoded + std::string sFSCPwd; ///< FSCharter login password // live values bool bReInitAll = false; // shall all a/c be re-initiaized (e.g. time jumped)? @@ -710,7 +712,9 @@ class DataRefs public: /// once per Flarm a/c type: matching it to one or more ICAO types std::array, 14> aFlarmToIcaoAcTy; - + + long OpenSkyRRemain = LONG_MAX; ///< OpenSky: Remaining number of requests per day + std::string OpenSkyRetryAt; ///< OpenSky: If limit is reached, when to retry? (local time as string) long ADSBExRLimit = 0; // ADSBEx: Limit on RapidAPI long ADSBExRRemain = 0; // ADSBEx: Remaining Requests on RapidAPI @@ -886,6 +890,11 @@ class DataRefs inline bool IsChannelEnabled (dataRefsLT ch) const { return bChannel[ch - DR_CHANNEL_FIRST]; } int CntChannelEnabled () const; + void GetOpenSkyCredentials (std::string& user, std::string& pwd) + { user = sOpenSkyUser; pwd = sOpenSkyPwd; } + void SetOpenSkyUser (const std::string& user) { sOpenSkyUser = user; OpenSkyRRemain = LONG_MAX; } + void SetOpenSkyPwd (const std::string& pwd) { sOpenSkyPwd = pwd; OpenSkyRRemain = LONG_MAX; } + std::string GetADSBExAPIKey () const { return sADSBExAPIKey; } void SetADSBExAPIKey (std::string apiKey) { sADSBExAPIKey = apiKey; } diff --git a/Include/LTADSBEx.h b/Include/LTADSBEx.h index e9c0ca9..6a73a48 100644 --- a/Include/LTADSBEx.h +++ b/Include/LTADSBEx.h @@ -110,6 +110,7 @@ class ADSBExchangeConnection : public LTOnlineChannel, LTFlightDataChannel virtual bool IsLiveFeed() const { return true; } virtual LTChannelType GetChType() const { return CHT_TRACKING_DATA; } virtual bool FetchAllData(const positionTy& pos) { return LTOnlineChannel::FetchAllData(pos); } + virtual std::string GetStatusText () const; ///< return a human-readable staus // // shall data of this channel be subject to LTFlightData::DataSmoothing? // virtual bool DoDataSmoothing (double& gndRange, double& airbRange) const // { gndRange = ADSBEX_SMOOTH_GROUND; airbRange = ADSBEX_SMOOTH_AIRBORNE; return true; } diff --git a/Include/LTOpenSky.h b/Include/LTOpenSky.h index 5cdebd3..61366e0 100644 --- a/Include/LTOpenSky.h +++ b/Include/LTOpenSky.h @@ -37,6 +37,8 @@ #define OPSKY_SLUG_FMT "https://opensky-network.org/network/explorer?icao24=%06lx" #define OPSKY_TIME "time" #define OPSKY_AIRCRAFT_ARR "states" +#define OPSKY_RREMAIN "X-Rate-Limit-Remaining:" +#define OPSKY_RETRY "X-Rate-Limit-Retry-After-Seconds:" constexpr int OPSKY_TRANSP_ICAO = 0; // icao24 constexpr int OPSKY_CALL = 1; // callsign constexpr int OPSKY_COUNTRY = 2; // origin_county @@ -65,9 +67,15 @@ class OpenSkyConnection : public LTOnlineChannel, LTFlightDataChannel virtual bool IsLiveFeed() const { return true; } virtual LTChannelType GetChType() const { return CHT_TRACKING_DATA; } virtual bool FetchAllData(const positionTy& pos) { return LTOnlineChannel::FetchAllData(pos); } + virtual std::string GetStatusText () const; ///< return a human-readable staus // // shall data of this channel be subject to LTFlightData::DataSmoothing? // virtual bool DoDataSmoothing (double& gndRange, double& airbRange) const // { gndRange = OPSKY_SMOOTH_GROUND; airbRange = OPSKY_SMOOTH_AIRBORNE; return true; } +protected: + virtual bool InitCurl (); + // read header and parse for request remaining + static size_t ReceiveHeader(char *buffer, size_t size, size_t nitems, void *userdata); + }; //MARK: OpenSky Master Data Constats diff --git a/Include/SettingsUI.h b/Include/SettingsUI.h index f1b0c83..eb68aee 100644 --- a/Include/SettingsUI.h +++ b/Include/SettingsUI.h @@ -32,6 +32,11 @@ class LTSettingsUI : public LTImgWindow /// Search filter char sFilter[50] = {0}; + // Channel: OpenSky + std::string sOpenSkyUser; ///< OpenSky Network user + std::string sOpenSkyPwd; ///< OpenSky Network password + bool bOpenSkyPwdClearText = false; ///< Is OpenSky pwd displayed clear text? + // Channel: ADS-B Exchange enum { ADSBX_KEY_NO_ACTION = 0, ///< no key test currently happening diff --git a/Src/DataRefs.cpp b/Src/DataRefs.cpp index 2f921b3..5f4d806 100644 --- a/Src/DataRefs.cpp +++ b/Src/DataRefs.cpp @@ -1892,8 +1892,13 @@ bool DataRefs::LoadConfigFile() SetDefaultAcIcaoType(sVal); else if (sDataRef == CFG_DEFAULT_CAR_TYPE) SetDefaultCarIcaoType(sVal); + else if (sDataRef == CFG_OPENSKY_USER) + SetOpenSkyUser(sVal); + else if (sDataRef == CFG_OPENSKY_PWD) + SetOpenSkyPwd(Cleartext(sVal)); else if (sDataRef == CFG_ADSBEX_API_KEY) - SetADSBExAPIKey(sVal); + // With v3 we start obfuscating the API key + SetADSBExAPIKey(conv == CFG_V3 ? sVal : Cleartext(sVal)); else if (sDataRef == CFG_FSC_USER) SetFSCharterUser(sVal); else if (sDataRef == CFG_FSC_PWD) @@ -2031,8 +2036,12 @@ bool DataRefs::SaveConfigFile() // *** Strings *** fOut << CFG_DEFAULT_AC_TYPE << ' ' << GetDefaultAcIcaoType() << '\n'; fOut << CFG_DEFAULT_CAR_TYPE << ' ' << GetDefaultCarIcaoType() << '\n'; + if (!sOpenSkyUser.empty()) + fOut << CFG_OPENSKY_USER << ' ' << sOpenSkyUser << '\n'; + if (!sOpenSkyPwd.empty()) + fOut << CFG_OPENSKY_PWD << ' ' << Obfuscate(sOpenSkyPwd) << '\n'; if (!GetADSBExAPIKey().empty()) - fOut << CFG_ADSBEX_API_KEY << ' ' << GetADSBExAPIKey() << '\n'; + fOut << CFG_ADSBEX_API_KEY << ' ' << Obfuscate(GetADSBExAPIKey()) << '\n'; if (!sFSCUser.empty()) fOut << CFG_FSC_USER << ' ' << sFSCUser << '\n'; if (!sFSCPwd.empty()) diff --git a/Src/LTADSBEx.cpp b/Src/LTADSBEx.cpp index d51b5cd..0a3b719 100644 --- a/Src/LTADSBEx.cpp +++ b/Src/LTADSBEx.cpp @@ -304,6 +304,24 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) return true; } + +// get status info, including remaining requests +std::string ADSBExchangeConnection::GetStatusText () const +{ + std::string s = LTChannel::GetStatusText(); + if (IsValid() && IsEnabled() && dataRefs.ADSBExRLimit > 0) + { + s += ", "; + s += std::to_string(dataRefs.ADSBExRRemain); + s += " / "; + s += std::to_string(dataRefs.ADSBExRLimit); + s += " RAPID API requests left"; + } + return s; +} + + + // add/cleanup API key // (this is actually called prior to each request, so quite often) bool ADSBExchangeConnection::InitCurl () diff --git a/Src/LTOpenSky.cpp b/Src/LTOpenSky.cpp index 84d1ea7..f0cbd02 100644 --- a/Src/LTOpenSky.cpp +++ b/Src/LTOpenSky.cpp @@ -41,6 +41,78 @@ LTFlightDataChannel() urlPopup = OPSKY_CHECK_POPUP; } +// Initialize CURL, adding OpenSky credentials +bool OpenSkyConnection::InitCurl () +{ + // Standard-init first (repeated call will just return true without effect) + if (!LTOnlineChannel::InitCurl()) + return false; + + // if there are credentials then now is the moment to add them + std::string usr, pwd; + dataRefs.GetOpenSkyCredentials(usr, pwd); + if (!usr.empty() && !pwd.empty()) { + curl_easy_setopt(pCurl, CURLOPT_USERNAME, usr.data()); + curl_easy_setopt(pCurl, CURLOPT_PASSWORD, pwd.data()); + } else { + curl_easy_setopt(pCurl, CURLOPT_USERNAME, nullptr); + curl_easy_setopt(pCurl, CURLOPT_PASSWORD, nullptr); + } + + // read headers (for remaining requests info) + curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, ReceiveHeader); + + return true; +} + +// read header and parse for request remaining +size_t OpenSkyConnection::ReceiveHeader(char *buffer, size_t size, size_t nitems, void *) +{ + const size_t len = nitems * size; + static size_t lenRRemain = strlen(OPSKY_RREMAIN); + static size_t lenRetry = strlen(OPSKY_RETRY); + char num[50]; + + // Remaining? + if (len > lenRRemain && + memcmp(buffer, OPSKY_RREMAIN, lenRRemain) == 0) + { + const size_t copyCnt = std::min(len-lenRRemain,sizeof(num)-1); + memcpy(num, buffer+lenRRemain, copyCnt); + num[copyCnt]=0; // zero termination + + long rRemain = std::atol(num); + // Issue a warning when coming close to the end + if (rRemain != dataRefs.OpenSkyRRemain) { + if (rRemain == 50 || rRemain == 10) { + SHOW_MSG(logWARN, "OpenSky: Only %ld requests left today for ca. %ld minutes of data", + rRemain, + (rRemain * dataRefs.GetFdRefreshIntvl()) / 60); + } + dataRefs.OpenSkyRRemain = rRemain; + if (rRemain > 0) + dataRefs.OpenSkyRetryAt.clear(); + } + } + // Retry-after-seconds? + else if (len > lenRetry && + memcmp(buffer, OPSKY_RETRY, lenRetry) == 0) + { + const size_t copyCnt = std::min(len-lenRetry,sizeof(num)-1); + memcpy(num, buffer+lenRetry, copyCnt); + num[copyCnt]=0; // zero termination + long secRetry = std::atol(num); // seconds till retry + // convert that to a local timestamp for the user to use + const std::time_t tRetry = std::time(nullptr) + secRetry; + std::strftime(num, sizeof(num), "%d-%b %H:%M", std::localtime(&tRetry)); + dataRefs.OpenSkyRetryAt = num; + dataRefs.OpenSkyRRemain = 0; + } + + // always say we processed everything, otherwise HTTP processing would stop! + return len; +} + // put together the URL to fetch based on current view position std::string OpenSkyConnection::GetURL (const positionTy& pos) { @@ -57,6 +129,7 @@ std::string OpenSkyConnection::GetURL (const positionTy& pos) } // update shared flight data structures with received flight data +// "a4d85d","UJC11 ","United States",1657226901,1657226901,-90.2035,38.8157,2758.44,false,128.1,269.54,-6.5,null,2895.6,"4102",false,0 bool OpenSkyConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) { char buf[100]; @@ -70,6 +143,22 @@ bool OpenSkyConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) // Only proceed in case HTTP response was OK if (httpResponse != HTTP_OK) { + // Unauthorized? + if (httpResponse == HTTP_UNAUTHORIZED) { + SHOW_MSG(logERR, "OpenSky: Unauthorized! Verify username/password in settings."); + SetValid(false,false); + SetEnable(false); // also disable to directly allow user/pwd change...and won't work on retry anyway + return false; + } + + // Ran out of requests? + if (httpResponse == HTTP_TOO_MANY_REQU) { + SHOW_MSG(logERR, "OpenSky: Used up request credit for today, try again on %s", + dataRefs.OpenSkyRetryAt.empty() ? "" : dataRefs.OpenSkyRetryAt.c_str()); + SetValid(false,false); + return false; + } + // There are a few typical responses that may happen when OpenSky // is just temporarily unresponsive. But in all _other_ cases // we increase the error counter. @@ -219,6 +308,31 @@ bool OpenSkyConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) return true; } + +// get status info, including remaining requests +std::string OpenSkyConnection::GetStatusText () const +{ + std::string s = LTChannel::GetStatusText(); + if (IsValid()) { + if (dataRefs.OpenSkyRRemain < LONG_MAX) + { + s += ", "; + s += std::to_string(dataRefs.OpenSkyRRemain); + s += " requests left today"; + } + } else { + if (!dataRefs.OpenSkyRetryAt.empty()) + { + s += ", retry at "; + s += dataRefs.OpenSkyRetryAt; + } + } + + return s; +} + + + // //MARK: OpenSkyAcMasterdata // diff --git a/Src/SettingsUI.cpp b/Src/SettingsUI.cpp index 9164b5e..0d259ad 100644 --- a/Src/SettingsUI.cpp +++ b/Src/SettingsUI.cpp @@ -63,6 +63,9 @@ txtFixLivery (dataRefs.cslFixLivery) for (size_t i = 0; i < aFlarmAcTys.size(); i++) aFlarmAcTys[i] = str_concat(dataRefs.aFlarmToIcaoAcTy[i], " "); + // Fetch OpenSky credentials + dataRefs.GetOpenSkyCredentials(sOpenSkyUser, sOpenSkyPwd); + // Fetch RealTraffic port number sRTPort = std::to_string(DataRefs::GetCfgInt(DR_CFG_RT_TRAFFIC_PORT)); @@ -243,8 +246,81 @@ void LTSettingsUI::buildInterface() HELP_SET_CH_OPENSKY, "Open Help on OpenSky in Browser", sFilter, nOpCl)) { + LTChannel* pOpenSkyCh = LTFlightDataGetCh(DR_CHANNEL_OPEN_SKY_ONLINE); + const bool bOpenSkyOn = dataRefs.IsChannelEnabled(DR_CHANNEL_OPEN_SKY_ONLINE); + ImGui::FilteredCfgCheckbox("OpenSky Network Master Data", sFilter, DR_CHANNEL_OPEN_SKY_AC_MASTERDATA, "Query OpenSky for aicraft master data like type, registration..."); + + // Hint that user/password increases number of allowed requests + if (!*sFilter && (sOpenSkyUser.empty() || sOpenSkyPwd.empty())) { + ImGui::ButtonURL(ICON_FA_EXTERNAL_LINK_SQUARE_ALT " Registration", + "https://opensky-network.org/login?view=registration", + "Opens OpenSky Network's user registration page"); + ImGui::TableNextCell(); + ImGui::TextUnformatted("Using a registered user allows for more requests to OpenSky per day "); + ImGui::TableNextCell(); + } + + // User + if (ImGui::FilteredLabel("Username", sFilter)) { + ImGui::Indent(ImGui::GetWidthIconBtn(true)); + ImGui::InputTextWithHint("##OpenSkyUser", + "OpenSky Network username", + &sOpenSkyUser, + // prohibit changes to the user while channel on + (bOpenSkyOn ? ImGuiInputTextFlags_ReadOnly : ImGuiInputTextFlags_None)); + ImGui::Unindent(ImGui::GetWidthIconBtn(true)); + + ImGui::TableNextCell(); + } + + // Password + if (ImGui::FilteredLabel("Password", sFilter)) { + // "Eye" button changes password flag + ImGui::Selectable(ICON_FA_EYE "##OpenSkyPwdVisible", &bOpenSkyPwdClearText, + ImGuiSelectableFlags_None, ImVec2(ImGui::GetWidthIconBtn(),0)); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("%s", "Show/Hide password"); + ImGui::SameLine(); // make text entry the size of the remaining space in cell, but not larger + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::InputTextWithHint("##OpenSkyPwd", + "Enter or paste OpenSky Network password", + &sOpenSkyPwd, + // clear text or password mode? + (bOpenSkyPwdClearText ? ImGuiInputTextFlags_None : ImGuiInputTextFlags_Password) | + // prohibit changes to the pwd while channel on + (bOpenSkyOn ? ImGuiInputTextFlags_ReadOnly : ImGuiInputTextFlags_None)); + + ImGui::TableNextCell(); + } + + // Save button or hint how to change + if (!*sFilter) { + ImGui::TableNextCell(); + if (bOpenSkyOn) { + ImGui::TextUnformatted("Disable the channel first if you want to change user/password."); + } else { + if (ImGui::ButtonTooltip(ICON_FA_SAVE " Save and Try", "Saves the credentials and activates the channel")) { + dataRefs.SetOpenSkyUser(sOpenSkyUser); + dataRefs.SetOpenSkyPwd(sOpenSkyPwd); + if (pOpenSkyCh) pOpenSkyCh->SetValid(true,false); + dataRefs.SetChannelEnabled(DR_CHANNEL_OPEN_SKY_ONLINE, true); + bOpenSkyPwdClearText = false; // and hide the pwd now + } + } + ImGui::TableNextCell(); + } + // OpenSky's connection status details + if (ImGui::FilteredLabel("Connection Status", sFilter)) { + if (pOpenSkyCh) { + ImGui::TextUnformatted(pOpenSkyCh->GetStatusText().c_str()); + } else { + ImGui::TextUnformatted("Off"); + } + ImGui::TableNextCell(); + } + if (!*sFilter) ImGui::TreePop(); } diff --git a/docs/readme.html b/docs/readme.html index b024077..aae8c67 100755 --- a/docs/readme.html +++ b/docs/readme.html @@ -176,6 +176,15 @@

    v3.0.0 X-Plane 12 Support

    General performance improvements, especially noticeable if many more aircraft are seen in the data than can be displayed.
  • +
  • + OpenSky: NEW #237 option to + enter credentials + of a registered user account to allow for a higher number of requests + per day (details).
    + Remaining requests per day are shown in the OpenSky status in the + Status / About page + and in the OpenSky settings. +
  • ADS-B Exchange: Switch to version 2 data format.
    Provides more data for potentially better altitude and From 68366fb67f7e9c3a7de535ab920eed7ec567b1c1 Mon Sep 17 00:00:00 2001 From: TwinFan Date: Fri, 8 Jul 2022 23:01:48 +0200 Subject: [PATCH 7/7] ADSBEx: Dynamically support v2 and v1 --- Include/LTADSBEx.h | 75 ++++++-- Src/LTADSBEx.cpp | 458 ++++++++++++++++++++++++++++++--------------- docs/readme.html | 2 +- 3 files changed, 360 insertions(+), 175 deletions(-) diff --git a/Include/LTADSBEx.h b/Include/LTADSBEx.h index 6a73a48..8943466 100644 --- a/Include/LTADSBEx.h +++ b/Include/LTADSBEx.h @@ -52,24 +52,51 @@ #define ADSBEX_TOTAL "total" #define ADSBEX_NOW "now" #define ADSBEX_AIRCRAFT_ARR "ac" -#define ADSBEX_TRANSP_ICAO "hex" // Key data -#define ADSBEX_RADAR_CODE "squawk" // Dynamic data -#define ADSBEX_FLIGHT "flight" -#define ADSBEX_LAT "lat" -#define ADSBEX_LON "lon" -#define ADSBEX_ALT_GEOM "alt_geom" // geometric altitude -#define ADSBEX_ALT_BARO "alt_baro" // barometric altitude -#define ADSBEX_NAV_QNH "nav_qnh" // QNH of barometric altitude -#define ADSBEX_HEADING "true_heading" -#define ADSBEX_TRACK "track" -#define ADSBEX_SEE_POS "seen_pos" -#define ADSBEX_SPD "gs" -#define ADSBEX_VSI_GEOM "geom_rate" -#define ADSBEX_VSI_BARO "baro_rate" -#define ADSBEX_REG "r" -#define ADSBEX_AC_TYPE_ICAO "t" -#define ADSBEX_AC_CATEGORY "category" -#define ADSBEX_FLAGS "dbFlags" + +// Version 2 keys +#define ADSBEX_V2_TRANSP_ICAO "hex" // Key data +#define ADSBEX_V2_RADAR_CODE "squawk" // Dynamic data +#define ADSBEX_V2_FLIGHT "flight" +#define ADSBEX_V2_LAT "lat" +#define ADSBEX_V2_LON "lon" +#define ADSBEX_V2_ALT_GEOM "alt_geom" // geometric altitude +#define ADSBEX_V2_ALT_BARO "alt_baro" // barometric altitude +#define ADSBEX_V2_NAV_QNH "nav_qnh" // QNH of barometric altitude +#define ADSBEX_V2_HEADING "true_heading" +#define ADSBEX_V2_TRACK "track" +#define ADSBEX_V2_SEE_POS "seen_pos" +#define ADSBEX_V2_SPD "gs" +#define ADSBEX_V2_VSI_GEOM "geom_rate" +#define ADSBEX_V2_VSI_BARO "baro_rate" +#define ADSBEX_V2_REG "r" +#define ADSBEX_V2_AC_TYPE_ICAO "t" +#define ADSBEX_V2_AC_CATEGORY "category" +#define ADSBEX_V2_FLAGS "dbFlags" + +// Version 1 keys +#define ADSBEX_TIME "ctime" +#define ADSBEX_V1_TRANSP_ICAO "icao" // Key data +#define ADSBEX_V1_RADAR_CODE "sqk" // Dynamic data +#define ADSBEX_V1_CALL "call" +#define ADSBEX_V1_LAT "lat" +#define ADSBEX_V1_LON "lon" +#define ADSBEX_V1_ELEVATION "galt" // geometric altitude +#define ADSBEX_V1_ALT "alt" // barometric altitude +#define ADSBEX_V1_HEADING "trak" +#define ADSBEX_V1_GND "gnd" +#define ADSBEX_V1_POS_TIME "postime" +#define ADSBEX_V1_SPD "spd" +#define ADSBEX_V1_VSI "vsi" +#define ADSBEX_V1_REG "reg" +#define ADSBEX_V1_COUNTRY "cou" +#define ADSBEX_V1_AC_TYPE_ICAO "type" +#define ADSBEX_V1_MIL "mil" +#define ADSBEX_V1_OP_ICAO "opicao" +#define ADSBEX_V1_ORIGIN "from" +#define ADSBEX_V1_DESTINATION "to" + +#define ADSBEX_V1_TYPE_GND "-GND" + // Testing an API key #define ADSBEX_VERIFY_KEY_URL "https://adsbexchange.com/api/aircraft/icao/000000" @@ -119,6 +146,18 @@ class ADSBExchangeConnection : public LTOnlineChannel, LTFlightDataChannel // need to add/cleanup API key virtual bool InitCurl (); virtual void CleanupCurl (); + + /// Process v2 data + void ProcessV2 (JSON_Object* pJAc, LTFlightData::FDKeyTy& fdKey, + mapLTFlightDataTy& fdMap, + const double tsCutOff, const double adsbxTime, + const positionTy& viewPos); + /// Process v1 data + void ProcessV1 (JSON_Object* pJAc, LTFlightData::FDKeyTy& fdKey, + mapLTFlightDataTy& fdMap, + const double tsCutOff, const double adsbxTime, + const positionTy& viewPos); + // make list of HTTP header fields static struct curl_slist* MakeCurlSList (keyTypeE keyTy, const std::string theKey); // read header and parse for request limit/remaining diff --git a/Src/LTADSBEx.cpp b/Src/LTADSBEx.cpp index 0a3b719..1cc1225 100644 --- a/Src/LTADSBEx.cpp +++ b/Src/LTADSBEx.cpp @@ -107,7 +107,10 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) // for determining an offset as compared to network time we need to know network time // Also used later to calcualte the position's timestamp - const double adsbxTime = jog_n(pObj, ADSBEX_NOW) / 1000.0; + double adsbxTime = jog_n_nan(pObj, ADSBEX_NOW) / 1000.0; + if (std::isnan(adsbxTime)) + adsbxTime = jog_n(pObj, ADSBEX_TIME) / 1000.0; + if (adsbxTime > JAN_FIRST_2019) // if reasonable add this to our time offset calculation dataRefs.ChTsOffsetAdd(adsbxTime); @@ -133,163 +136,35 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) } } - std::string hexKey = jog_s(pJAc, ADSBEX_TRANSP_ICAO); - if (hexKey.empty()) - continue; + // try version 2 first + int ver = 2; + std::string hexKey = jog_s(pJAc, ADSBEX_V2_TRANSP_ICAO); + if (hexKey.empty()) { + // not found, try version 1 + ver = 1; + hexKey = jog_s(pJAc, ADSBEX_V1_TRANSP_ICAO); + if (hexKey.empty()) + continue; + } + + // the key: transponder Icao code or some other code + LTFlightData::FDKeyType keyType = LTFlightData::KEY_ICAO; + if (hexKey.front() == '~') { // key is a non-icao code? + hexKey.erase(0, 1); // remove the ~ + keyType = LTFlightData::KEY_ADSBEX; + } + LTFlightData::FDKeyTy fdKey (keyType, hexKey); + // not matching a/c filter? -> skip it + if (!acFilter.empty() && (fdKey != acFilter)) + continue; + + // Process the details, depends on version detected try { - // the key: transponder Icao code or some other code - LTFlightData::FDKeyType keyType = LTFlightData::KEY_ICAO; - if (hexKey.front() == '~') { // key is a non-icao code? - hexKey.erase(0, 1); // remove the ~ - keyType = LTFlightData::KEY_ADSBEX; - } - LTFlightData::FDKeyTy fdKey (keyType, hexKey); - - // not matching a/c filter? -> skip it - if (!acFilter.empty() && (fdKey != acFilter)) - { - continue; - } - - // ADS-B returns Java tics, that is milliseconds, we use seconds - const double ageOfPos = jog_sn(pJAc, ADSBEX_SEE_POS); - // skip stale data - if (ageOfPos >= tsCutOff) - continue; - - // Try getting best possible position information - // Some fields can come back NAN if not defined - positionTy pos (jog_n_nan(pJAc, ADSBEX_LAT), - jog_n_nan(pJAc, ADSBEX_LON), - jog_n_nan(pJAc, ADSBEX_ALT_GEOM) * M_per_FT, - adsbxTime - ageOfPos, - jog_n_nan(pJAc, ADSBEX_HEADING)); - - // If lat/lon isn't defined then the tracking data is stale: discard - if (std::isnan(pos.lat()) || std::isnan(pos.lon())) - continue; - - // ADSBEx, especially the RAPID API version, returns - // aircraft regardless of distance. To avoid planes - // created and immediately removed due to distanced settings - // we continue only if pos is within wanted range - const double dist = pos.dist(viewPos); - if (dist > dataRefs.GetFdStdDistance_m() ) - continue; - - // The alt_baro field is string "ground" if on ground or can hold a baro altitude number - const JSON_Value* pAltBaro = json_object_get_value(pJAc, ADSBEX_ALT_BARO); - if (pAltBaro) { - switch (json_value_get_type(pAltBaro)) - { - case JSONNumber: - pos.f.onGrnd = GND_OFF; // we are definitely off ground - // But we only need to _process_ baro alt if we don't yet have an altitude - if (std::isnan(pos.alt_m())) - { - // try converting baro alt from given QNH, otherwise we use our own weather - const double baro_alt = json_number(pAltBaro); - const double qnh = jog_n_nan(pJAc, ADSBEX_NAV_QNH); - if (std::isnan(qnh)) - pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt)); - else - pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt, qnh)); - } - break; - - case JSONString: - // There is just one string we are aware of: "ground" - if (!strcmp(json_string(pAltBaro), "ground")) { - pos.f.onGrnd = GND_ON; - pos.alt_m() = NAN; - } - break; - } - } - // _Some_ altitude info needs to be available now, otherwise skip data - if (!pos.IsOnGnd() && std::isnan(pos.alt_m())) - continue; - - // Are we to skip static objects? - const std::string reg = jog_s(pJAc, ADSBEX_REG); - std::string acTy = jog_s(pJAc, ADSBEX_AC_TYPE_ICAO); - const std::string cat = jog_s(pJAc, ADSBEX_AC_CATEGORY); - - // Skip static objects - if (dataRefs.GetHideStaticTwr()) { - if (reg == "TWR" || - acTy == "TWR" || - cat == "C3") - // skip - continue; - } - - // Identify ground vehicles - if (cat == "C1" || cat == "C2" || - reg == "GND" || - acTy == "GND") - acTy = dataRefs.GetDefaultCarIcaoType(); - else if (pos.IsOnGnd() && - acTy.empty() && reg.empty() && cat.empty()) - acTy = dataRefs.GetDefaultCarIcaoType(); - - // from here on access to fdMap guarded by a mutex - // until FD object is inserted and updated - std::unique_lock mapFdLock (mapFdMutex); - - // Check for duplicates with OGN/FLARM, potentially replaces the key type - LTFlightData::CheckDupKey(fdKey, LTFlightData::KEY_FLARM); - - // get the fd object from the map, key is the transpIcao - // this fetches an existing or, if not existing, creates a new one - LTFlightData& fd = fdMap[fdKey]; - - // also get the data access lock once and for all - // so following fetch/update calls only make quick recursive calls - std::lock_guard fdLock (fd.dataAccessMutex); - // now that we have the detail lock we can release the global one - mapFdLock.unlock(); - - // completely new? fill key fields - if ( fd.empty() ) - fd.SetKey(fdKey); - - // -- fill static data -- - LTFlightData::FDStaticData stat; - stat.reg = reg; - stat.acTypeIcao = acTy; - stat.mil = (jog_l(pJAc, ADSBEX_FLAGS) & 0x01) == 0x01; - stat.call = jog_s(pJAc, ADSBEX_FLIGHT); - trim(stat.call); - stat.catDescr = GetADSBEmitterCat(cat); - stat.slug = ADSBEX_SLUG_BASE; - stat.slug += fdKey.key; - - // -- dynamic data -- - LTFlightData::FDDynamicData dyn; - - // non-positional dynamic data - dyn.radar.code = jog_sl(pJAc, ADSBEX_RADAR_CODE); - dyn.gnd = pos.IsOnGnd(); - dyn.heading = pos.heading(); - dyn.spd = jog_n_nan(pJAc, ADSBEX_SPD); - dyn.vsi = jog_n_nan(pJAc, ADSBEX_ALT_GEOM); - if (std::isnan(dyn.vsi)) - dyn.vsi = jog_n_nan(pJAc, ADSBEX_ALT_BARO); - dyn.ts = pos.ts(); - dyn.pChannel = this; - - // update the a/c's master data - fd.UpdateData(std::move(stat), dist); - - // position is rather important, we check for validity - if ( pos.isNormal(true) ) { - fd.AddDynData(dyn, 0, 0, &pos); - } - else - LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),pos.dbgTxt().c_str()); - + if (ver == 2) + ProcessV2(pJAc, fdKey, fdMap, tsCutOff, adsbxTime, viewPos); + else if (ver == 1) + ProcessV1(pJAc, fdKey, fdMap, tsCutOff, adsbxTime, viewPos); } catch(const std::system_error& e) { LOG_MSG(logERR, ERR_LOCK_ERROR, "mapFd", e.what()); } catch(...) { @@ -305,6 +180,277 @@ bool ADSBExchangeConnection::ProcessFetchedData (mapLTFlightDataTy& fdMap) } +// Process v2 data +void ADSBExchangeConnection::ProcessV2 (JSON_Object* pJAc, + LTFlightData::FDKeyTy& fdKey, + mapLTFlightDataTy& fdMap, + const double tsCutOff, + const double adsbxTime, + const positionTy& viewPos) +{ + // ADS-B returns Java tics, that is milliseconds, we use seconds + const double ageOfPos = jog_sn(pJAc, ADSBEX_V2_SEE_POS); + // skip stale data + if (ageOfPos >= tsCutOff) + return; + + // Try getting best possible position information + // Some fields can come back NAN if not defined + positionTy pos (jog_n_nan(pJAc, ADSBEX_V2_LAT), + jog_n_nan(pJAc, ADSBEX_V2_LON), + jog_n_nan(pJAc, ADSBEX_V2_ALT_GEOM) * M_per_FT, + adsbxTime - ageOfPos, + jog_n_nan(pJAc, ADSBEX_V2_HEADING)); + + // If lat/lon isn't defined then the tracking data is stale: discard + if (std::isnan(pos.lat()) || std::isnan(pos.lon())) + return; + + // ADSBEx, especially the RAPID API version, returns + // aircraft regardless of distance. To avoid planes + // created and immediately removed due to distanced settings + // we continue only if pos is within wanted range + const double dist = pos.dist(viewPos); + if (dist > dataRefs.GetFdStdDistance_m() ) + return; + + // The alt_baro field is string "ground" if on ground or can hold a baro altitude number + const JSON_Value* pAltBaro = json_object_get_value(pJAc, ADSBEX_V2_ALT_BARO); + if (pAltBaro) { + switch (json_value_get_type(pAltBaro)) + { + case JSONNumber: + pos.f.onGrnd = GND_OFF; // we are definitely off ground + // But we only need to _process_ baro alt if we don't yet have an altitude + if (std::isnan(pos.alt_m())) + { + // try converting baro alt from given QNH, otherwise we use our own weather + const double baro_alt = json_number(pAltBaro); + const double qnh = jog_n_nan(pJAc, ADSBEX_V2_NAV_QNH); + if (std::isnan(qnh)) + pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt)); + else + pos.SetAltFt(dataRefs.WeatherAltCorr_ft(baro_alt, qnh)); + } + break; + + case JSONString: + // There is just one string we are aware of: "ground" + if (!strcmp(json_string(pAltBaro), "ground")) { + pos.f.onGrnd = GND_ON; + pos.alt_m() = NAN; + } + break; + } + } + // _Some_ altitude info needs to be available now, otherwise skip data + if (!pos.IsOnGnd() && std::isnan(pos.alt_m())) + return; + + // Are we to skip static objects? + const std::string reg = jog_s(pJAc, ADSBEX_V2_REG); + std::string acTy = jog_s(pJAc, ADSBEX_V2_AC_TYPE_ICAO); + const std::string cat = jog_s(pJAc, ADSBEX_V2_AC_CATEGORY); + + // Skip static objects + if (dataRefs.GetHideStaticTwr()) { + if (reg == "TWR" || + acTy == "TWR" || + cat == "C3") + // skip + return; + } + + // Identify ground vehicles + if (cat == "C1" || cat == "C2" || + reg == "GND" || + acTy == "GND") + acTy = dataRefs.GetDefaultCarIcaoType(); + else if (pos.IsOnGnd() && + acTy.empty() && reg.empty() && cat.empty()) + acTy = dataRefs.GetDefaultCarIcaoType(); + + // from here on access to fdMap guarded by a mutex + // until FD object is inserted and updated + std::unique_lock mapFdLock (mapFdMutex); + + // Check for duplicates with OGN/FLARM, potentially replaces the key type + LTFlightData::CheckDupKey(fdKey, LTFlightData::KEY_FLARM); + + // get the fd object from the map, key is the transpIcao + // this fetches an existing or, if not existing, creates a new one + LTFlightData& fd = fdMap[fdKey]; + + // also get the data access lock once and for all + // so following fetch/update calls only make quick recursive calls + std::lock_guard fdLock (fd.dataAccessMutex); + // now that we have the detail lock we can release the global one + mapFdLock.unlock(); + + // completely new? fill key fields + if ( fd.empty() ) + fd.SetKey(fdKey); + + // -- fill static data -- + LTFlightData::FDStaticData stat; + stat.reg = reg; + stat.acTypeIcao = acTy; + stat.mil = (jog_l(pJAc, ADSBEX_V2_FLAGS) & 0x01) == 0x01; + stat.call = jog_s(pJAc, ADSBEX_V2_FLIGHT); + trim(stat.call); + stat.catDescr = GetADSBEmitterCat(cat); + stat.slug = ADSBEX_SLUG_BASE; + stat.slug += fdKey.key; + + // -- dynamic data -- + LTFlightData::FDDynamicData dyn; + + // non-positional dynamic data + dyn.radar.code = jog_sl(pJAc, ADSBEX_V2_RADAR_CODE); + dyn.gnd = pos.IsOnGnd(); + dyn.heading = pos.heading(); + dyn.spd = jog_n_nan(pJAc, ADSBEX_V2_SPD); + dyn.vsi = jog_n_nan(pJAc, ADSBEX_V2_ALT_GEOM); + if (std::isnan(dyn.vsi)) + dyn.vsi = jog_n_nan(pJAc, ADSBEX_V2_ALT_BARO); + dyn.ts = pos.ts(); + dyn.pChannel = this; + + // update the a/c's master data + fd.UpdateData(std::move(stat), dist); + + // position is rather important, we check for validity + if ( pos.isNormal(true) ) { + fd.AddDynData(dyn, 0, 0, &pos); + } + else + LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),pos.dbgTxt().c_str()); +} + +// Process v1 data +void ADSBExchangeConnection::ProcessV1 (JSON_Object* pJAc, + LTFlightData::FDKeyTy& fdKey, + mapLTFlightDataTy& fdMap, + const double tsCutOff, + const double /*adsbxTime*/, + const positionTy& viewPos) +{ + // ADS-B returns Java tics, that is milliseconds, we use seconds + const double posTime = jog_sn(pJAc, ADSBEX_V1_POS_TIME) / 1000.0; + // skip stale data + if (posTime <= tsCutOff) + return; + + // ADSBEx, especially the RAPID API version, returns + // aircraft regardless of distance. To avoid planes + // created and immediately removed due to distanced settings + // we continue only if pos is within wanted range + positionTy pos (jog_sn_nan(pJAc, ADSBEX_V1_LAT), + jog_sn_nan(pJAc, ADSBEX_V1_LON), + NAN, + posTime); + const double dist = pos.dist(viewPos); + if (dist > dataRefs.GetFdStdDistance_m() ) + return; + + // Are we to skip static objects? + if (dataRefs.GetHideStaticTwr()) { + if (!strcmp(jog_s(pJAc, ADSBEX_V1_GND), "1") && // on the ground + !*jog_s(pJAc, ADSBEX_V1_AC_TYPE_ICAO) && // no type + !*jog_s(pJAc, ADSBEX_V1_HEADING) && // no `trak` heading, not even "0" + !*jog_s(pJAc, ADSBEX_V1_CALL) && // no call sign + !*jog_s(pJAc, ADSBEX_V1_REG) && // no tail number + !strcmp(jog_s(pJAc, ADSBEX_V1_SPD), "0")) // speed exactly "0" + // skip + return; + } + + // from here on access to fdMap guarded by a mutex + // until FD object is inserted and updated + std::unique_lock mapFdLock (mapFdMutex); + + // Check for duplicates with OGN/FLARM, potentially replaces the key type + LTFlightData::CheckDupKey(fdKey, LTFlightData::KEY_FLARM); + + // get the fd object from the map, key is the transpIcao + // this fetches an existing or, if not existing, creates a new one + LTFlightData& fd = fdMap[fdKey]; + + // also get the data access lock once and for all + // so following fetch/update calls only make quick recursive calls + std::lock_guard fdLock (fd.dataAccessMutex); + // now that we have the detail lock we can release the global one + mapFdLock.unlock(); + + // completely new? fill key fields + if ( fd.empty() ) + fd.SetKey(fdKey); + + // -- fill static data -- + LTFlightData::FDStaticData stat; + stat.reg = jog_s(pJAc, ADSBEX_V1_REG); + stat.country = jog_s(pJAc, ADSBEX_V1_COUNTRY); + stat.acTypeIcao = jog_s(pJAc, ADSBEX_V1_AC_TYPE_ICAO); + stat.mil = jog_sb(pJAc,ADSBEX_V1_MIL); + stat.opIcao = jog_s(pJAc, ADSBEX_V1_OP_ICAO); + stat.call = jog_s(pJAc, ADSBEX_V1_CALL); + stat.originAp = jog_s(pJAc, ADSBEX_V1_ORIGIN); + stat.destAp = jog_s(pJAc, ADSBEX_V1_DESTINATION); + stat.slug = ADSBEX_SLUG_BASE; + stat.slug += fdKey.key; + + // ADSBEx sends airport info like "LHR London Heathrow United Kingdom" + // That's way to long... + cut_off(stat.originAp, " "); + cut_off(stat.destAp, " "); + + // -- dynamic data -- + LTFlightData::FDDynamicData dyn; + + // non-positional dynamic data + dyn.radar.code = jog_sl(pJAc, ADSBEX_V1_RADAR_CODE); + dyn.gnd = jog_sb(pJAc, ADSBEX_V1_GND); + dyn.heading = jog_sn_nan(pJAc, ADSBEX_V1_HEADING); + dyn.spd = jog_sn(pJAc, ADSBEX_V1_SPD); + dyn.vsi = jog_sn(pJAc, ADSBEX_V1_VSI); + dyn.ts = posTime; + dyn.pChannel = this; + + // altitude, if airborne; fetch barometric altitude here + const double alt_ft = dyn.gnd ? NAN : jog_sn_nan(pJAc, ADSBEX_V1_ALT); + + // position: altitude, heading, ground status + pos.SetAltFt(dataRefs.WeatherAltCorr_ft(alt_ft)); + pos.heading() = dyn.heading; + pos.f.onGrnd = dyn.gnd ? GND_ON : GND_OFF; + + // -- Ground vehicle identification -- + // Sometimes we get "-GND", replace it with "ZZZC" + if (stat.acTypeIcao == ADSBEX_V1_TYPE_GND) + stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); + + // But often, ADSBEx doesn't send a clear indicator + if (stat.acTypeIcao.empty() && // don't know a/c type yet + stat.reg.empty() && // don't have tail number + dyn.gnd && // on the ground + dyn.spd < 50.0) // reasonable speed + { + // we assume ground vehicle + stat.acTypeIcao = dataRefs.GetDefaultCarIcaoType(); + } + + // update the a/c's master data + fd.UpdateData(std::move(stat), dist); + + // position is rather important, we check for validity + if ( pos.isNormal(true) ) { + fd.AddDynData(dyn, 0, 0, &pos); + } + else + LOG_MSG(logDEBUG,ERR_POS_UNNORMAL,fdKey.c_str(),pos.dbgTxt().c_str()); +} + + // get status info, including remaining requests std::string ADSBExchangeConnection::GetStatusText () const { diff --git a/docs/readme.html b/docs/readme.html index aae8c67..44ae4cf 100755 --- a/docs/readme.html +++ b/docs/readme.html @@ -186,7 +186,7 @@

    v3.0.0 X-Plane 12 Support

    and in the OpenSky settings.
  • - ADS-B Exchange: Switch to version 2 data format.
    + ADS-B Exchange: Prepare for version 2 data format (not yet available for the RAPID API interface).
    Provides more data for potentially better altitude and type of vehicle information. Will become mandatory as the v1 format will be phased out by ADS-B Exchange at some point in time.