宣告 adsb.exposed - 基于 ClickHouse 的 ADS-B 航班数据交互式可视化和分析

使用Python获取ADS-B数据,并显示飞机航迹动态 使用Python获取ADS-B数据,并显示飞机航迹动态。 1.绘图环境 1)使用cartopy显示地理位置信息 import cartopy.crs as ccrs from cartopy.io.img_tiles import OSM 2)使用matplotlib实现飞机轨迹的刷新 3)使用OpenSkyApi,获取开发的ADS-B数据。 2.配置开发环境 1)安装cartopy。使用pip安装cartopy无法成功。在https://www.lfd.uci.edu下载whl文... 阅读详情

图片

本文字数:10340;估计阅读时间:26 分钟

审校:庄晓东(魏庄)

本文在公众号【ClickHouseInc】首发

图片

Meetup活动

ClickHouse 上海首届 Meetup 讲师招募中,欢迎讲师在文末扫码报名!

       

也许你已经听说过 Flight Radar,这个实时航班跟踪地图,跟踪飞机在天空中飞行非常有趣,但在这篇博客文章中,我们将向你介绍更酷炫的东西!!

ADS-B(自动相关监视广播)是一种用于广播各种航班数据的无线电协议。我们的联合创始人兼首席技术官 Alexey Milovidov 基于这些数据打造了一个交互式可视化和分析工具。他在这个过程中创造了一种全新的艺术形式!

图片

曼哈顿上空的直升机

这个网站聚合并可视化了大量的航空交通数据。这些数据存储在 ClickHouse 数据库中,并可以实时查询。你可以使用自定义的 SQL 查询调整可视化效果,并从 50 亿条记录中钻取到单个数据记录。结果是一些非常壮观的图像!

虽然这篇博客文章主要关注演示是如何构建的,但你也可以直接跳到结尾查看一些惊人的视觉效果。

或者,访问 https://adsb.exposed,找到你所在城市的可视化效果,并在社交媒体上分享!我们将为最佳图像赠送一个 ClickHouse T 恤,并将在我们下次的社区通话中于 4 月 30 日公布获胜者。

这个演示的完整源代码可以在这里找到【https://github.com/ClickHouse/adsb.exposed?tab=readme-ov-file】。

如何获取 ADS-B 数据?

ADS-B 数据是由安装在飞机上的“应答机”发送的。这种协议没有加密,对于数据的收集、使用和重新分发没有任何限制。大多数民航飞机都会发送这些数据,而在某些国家,甚至滑翔机、无人机和机场地面车辆也会如此。但对于军用飞机和私人轻型飞机,是否发送这些数据就不确定了。

你可以通过自己的无线电接收器(比如 SDR)在空中收集这些数据,不过你的接收器只能在一定范围内接收到数据。此外,也有一些平台可以用来分享和交换这些数据。一些平台邀请用户共享数据,但对于商业使用则可能受限。虽然飞机发送的数据基本上属于公共领域,但公司可以从这些数据中制作和许可衍生作品。

我们使用了两个数据来源:ADSB.lol(提供完整的历史数据,每天 3000 到 5000 万条记录,自 2023 年以来根据开放数据库许可证提供)和 ADSB-Exchange(仅提供每个月第一天的数据样本,每天约 12 亿条记录,覆盖范围更广)。

另一个有前景的数据来源是 airplanes.live,该作者提供了用于非商业用途的历史和实时数据。这个平台的覆盖范围和数据质量都很好,我们计划在接下来的几天内将其纳入使用。

实现细节

该网站采用单个 HTML 页面实现,没有使用 JavaScript 框架,并且源代码未经过压缩,因此易于阅读。

地图渲染

我们使用 Leaflet 库来在两个图层中显示地图。背景图层使用 OpenStreetMap 的瓦片创建了典型的地理地图。而主要图层则将可视化效果叠加在背景地图上。

为了实现可视化效果,我们使用了 GridLayer 和自定义回调函数 createTile,该函数会在需要时动态生成 Canvas 元素:


L.GridLayer.ClickHouse = L.GridLayer.extend({
  createTile: function(coords, done) {
      let tile = L.DomUtil.create('canvas', 'leaflet-tile');
      tile.width = 1024;
      tile.height = 1024;
      render(this.options.table, this.options.priority, coords, tile).then(err => done(err, tile));
      return tile;
  }
});

const layer_options = {
  tileSize: 1024,
  minZoom: 2,
  maxZoom: 19,
  minNativeZoom: 2,
  maxNativeZoom: 16,
  attribution: '(c) Alexey Milovidov, ClickHouse, Inc. (data: adsb.lol, adsbexchange.com)'
};

 为了减少对数据库的请求次数,每个瓦片都具有 1024x1024 的高分辨率。渲染函数使用 JavaScript 的 fetch 函数通过 ClickHouse 的 HTTP API 发送请求:


const query_id = `${uuid}-${query_sequence_num}-${table}-${coords.z - 2}-${coords.x}-${coords.y}`;
const hosts = getHosts(key);
const url = host => `${host}/?user=website&default_format=RowBinary` +
  `&query_id=${query_id}&replace_running_query=1` +
  `&param_table=${table}&param_sampling=${[0, 100, 10, 1][priority]}` +
  `&param_z=${coords.z - 2}&param_x=${coords.x}&param_y=${coords.y}`;

progress_update_period = 1;
const response = await Promise.race(hosts.map(host => fetch(url(host), { method: 'POST', body: sql })));

​​​​​​​用户可以使用页面上的表单即时编辑 SQL 查询,以调整可视化效果。这个带参数的查询接受瓦片坐标 (x, y) 和缩放级别作为参数。

查询返回图像的每个像素的 RGBA 值,采用 RowBinary 格式(1024x1024 像素,1048576 行,每行 4 字节,每个瓦片总共 4 MiB)。只要浏览器支持,查询的 HTTP 响应会采用 ZSTD 压缩。有趣的是,ZSTD 压缩在原始像素位图上的效果比 PNG 更好!(尽管这并不奇怪)

尽管图像数据通常会被多次压缩,但仍然需要在网络上传输数百兆字节,这就是为什么在网络连接较差时,服务可能会感觉很慢的原因。


let ctx = tile.getContext('2d');
let image = ctx.createImageData(1024, 1024, {colorSpace: 'display-p3'});
let arr = new Uint8ClampedArray(buf);

for (let i = 0; i < 1024 * 1024 * 4; ++i) { image.data[i] = arr[i]; }

ctx.putImageData(image, 0, 0, 0, 0, 1024, 1024);

​​​​​​​ 在支持的浏览器中,使用“Display P3”色彩空间可拥有更广的色域。我们使用三个不同级别的详细表:planes_mercator 包含 100% 的数据,planes_mercator_sample10 包含 10%,而 planes_mercator_sample100 包含 1%。加载开始时采用 1% 的样本,以便在渲染整个世界时能够立即响应。加载完第一层级的详细数据后,它继续加载下一个 10% 的层级,然后再加载 100% 的数据。这样做能够产生渐进加载的良好效果。

图像数据还会在客户端使用一个简单的 JavaScript 对象进行缓存:


if (!cached_tiles[key]) cached_tiles[key] = [];
/// If there is a higer-detail tile, skip rendering of this level of detal.
if (cached_tiles[key][priority + 1]) return;
buf = cached_tiles[key][priority];

​​​​​​​ 但唯一的不足是,经过一段时间浏览后,页面会消耗过多的内存 - 这是未来版本需要解决的问题。

数据库和查询

按照 ClickHouse 的标准来说,这个数据库相对较小。截至 2024 年 3 月 29 日,planes_mercator 表中有 444.7 亿行数据,并且持续不断地更新。它占用了 1.6 TB 的磁盘空间。

表结构如下(您可以在 setup.sql 源文件中查看):


CREATE TABLE planes_mercator
(
    `mercator_x` UInt32 MATERIALIZED 4294967295 * ((lon + 180) / 360),
    `mercator_y` UInt32 MATERIALIZED 4294967295 * ((1 / 2) - ((log(tan(((lat + 90) / 360) * pi())) / 2) / pi())),
    `time` DateTime64(3),
    `date` Date,
    `icao` String,
    `r` String,
    `t` LowCardinality(String),
    `dbFlags` Int32,
    `noRegData` Bool,
    `ownOp` LowCardinality(String),
    `year` UInt16,
    `desc` LowCardinality(String),
    `lat` Float64,
    `lon` Float64,
    `altitude` Int32,
    `ground_speed` Float32,
    `track_degrees` Float32,
    `flags` UInt32,
    `vertical_rate` Int32,
    `aircraft_alert` Int64,
    `aircraft_alt_geom` Int64,
    `aircraft_gva` Int64,
    `aircraft_nac_p` Int64,
    `aircraft_nac_v` Int64,
    `aircraft_nic` Int64,
    `aircraft_nic_baro` Int64,
    `aircraft_rc` Int64,
    `aircraft_sda` Int64,
    `aircraft_sil` Int64,
    `aircraft_sil_type` LowCardinality(String),
    `aircraft_spi` Int64,
    `aircraft_track` Float64,
    `aircraft_type` LowCardinality(String),
    `aircraft_version` Int64,
    `aircraft_category` Enum8('A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', ''),
    `aircraft_emergency` Enum8('', 'none', 'general', 'downed', 'lifeguard', 'minfuel', 'nordo', 'unlawful', 'reserved'),
    `aircraft_flight` LowCardinality(String),
    `aircraft_squawk` String,
    `aircraft_baro_rate` Int64,
    `aircraft_nav_altitude_fms` Int64,
    `aircraft_nav_altitude_mcp` Int64,
    `aircraft_nav_modes` Array(Enum8('althold', 'approach', 'autopilot', 'lnav', 'tcas', 'vnav')),
    `aircraft_nav_qnh` Float64,
    `aircraft_geom_rate` Int64,
    `aircraft_ias` Int64,
    `aircraft_mach` Float64,
    `aircraft_mag_heading` Float64,
    `aircraft_oat` Int64,
    `aircraft_roll` Float64,
    `aircraft_tas` Int64,
    `aircraft_tat` Int64,
    `aircraft_true_heading` Float64,
    `aircraft_wd` Int64,
    `aircraft_ws` Int64,
    `aircraft_track_rate` Float64,
    `aircraft_nav_heading` Float64,
    `source` LowCardinality(String),
    `geometric_altitude` Int32,
    `geometric_vertical_rate` Int32,
    `indicated_airspeed` Int32,
    `roll_angle` Float32,
    INDEX idx_x mercator_x TYPE minmax GRANULARITY 1,
    INDEX idx_y mercator_y TYPE minmax GRANULARITY 1
)
ENGINE = MergeTree
ORDER BY (mortonEncode(mercator_x, mercator_y), time)

​​​​​​​ 此架构包含了经纬度值,通过 MATERIALIZED 列自动将它们转换为 Web-Mercator 投影的坐标。这种投影被 Leaflet 软件和互联网上的大多数地图所采用。Mercator 坐标以 UInt32 的形式存储,使得在 SQL 查询中进行瓦片坐标和缩放级别的算术操作变得更加容易。Web Mercator 使用 Morton 曲线对表坐标进行排序,并使用 minmax 索引,使得查询特定瓦片时只需读取所需的数据。

Materialized Views 用于生成不同细节级别的表:

CREATE TABLE planes_mercator_sample10 AS planes_mercator;

CREATE TABLE planes_mercator_sample100 AS planes_mercator;

CREATE MATERIALIZED VIEW view_sample10 TO planes_mercator_sample10
AS SELECT *
FROM planes_mercator
WHERE (rand() % 10) = 0;

CREATE MATERIALIZED VIEW view_sample100 TO planes_mercator_sample100
AS SELECT *
FROM planes_mercator
WHERE (rand() % 100) = 0;

​​​​​​​使用 ClickHouse Cloud

我们在 ClickHouse Cloud 的测试环境中部署了一个服务。这个测试环境主要用于测试新的 ClickHouse 版本和我们正在实现的新型基础设施。

举例来说,我们可以尝试不同类型和规模的机器,或者测试正在开发中的新功能,比如分布式缓存。

测试环境还利用了故障注入和混沌工程:我们会以一定概率中断网络连接,以确保服务正常运行。此外,我们会随机终止 clickhouse-server 和 clickhouse-keeper 上的不同机器,并随机调整服务的规模。这种做法有助于促进我们服务的开发和测试。

最后,请求也会负载均衡到备用服务。无论哪个服务返回得更快,都将被使用。这样我们就能够避免停机,同时仍然能够利用测试环境。

示例查询:波音与空客对比

考虑到这个备受关注的主题可视化:“波音与空客对比”。

图片

让我们来看一下这个可视化的 SQL 查询:


WITH
  bitShiftLeft(1::UInt64, {z:UInt8}) AS zoom_factor,
  bitShiftLeft(1::UInt64, 32 - {z:UInt8}) AS tile_size,

  tile_size * {x:UInt16} AS tile_x_begin,
  tile_size * ({x:UInt16} + 1) AS tile_x_end,

  tile_size * {y:UInt16} AS tile_y_begin,
  tile_size * ({y:UInt16} + 1) AS tile_y_end,

  mercator_x >= tile_x_begin AND mercator_x < tile_x_end
  AND mercator_y >= tile_y_begin AND mercator_y < tile_y_end AS in_tile,

  bitShiftRight(mercator_x - tile_x_begin, 32 - 10 - {z:UInt8}) AS x,
  bitShiftRight(mercator_y - tile_y_begin, 32 - 10 - {z:UInt8}) AS y,

  y * 1024 + x AS pos,

  count() AS total,
  sum(desc LIKE 'BOEING%') AS boeing,
  sum(desc LIKE 'AIRBUS%') AS airbus,
  sum(NOT (desc LIKE 'BOEING%' OR desc LIKE 'AIRBUS%')) AS other,

  greatest(1000000 DIV {sampling:UInt32} DIV zoom_factor, total) AS max_total,
  greatest(1000000 DIV {sampling:UInt32} DIV zoom_factor, boeing) AS max_boeing,
  greatest(1000000 DIV {sampling:UInt32} DIV zoom_factor, airbus) AS max_airbus,
  greatest(1000000 DIV {sampling:UInt32} DIV zoom_factor, other) AS max_other,

  pow(total / max_total, 1/5) AS transparency,

  255 * (1 + transparency) / 2 AS alpha,
  pow(boeing, 1/5) * 256 DIV (1 + pow(max_boeing, 1/5)) AS red,
  pow(airbus, 1/5) * 256 DIV (1 + pow(max_airbus, 1/5)) AS green,
  pow(other, 1/5) * 256 DIV (1 + pow(max_other, 1/5)) AS blue

SELECT round(red)::UInt8, round(green)::UInt8, round(blue)::UInt8, round(alpha)::UInt8
FROM {table:Identifier}
WHERE in_tile

​​​​​​​ 查询的第一部分计算了条件 in_tile,在 WHERE 部分中用于过滤所请求瓦片中的数据。然后计算颜色:alpha、red、green 和 blue。它们通过 pow 函数进行调整以获得更好的均匀性,被夹在 0 到 255 的范围内,并转换为 UInt8。采样参数用于调整,以便于低细节级别的查询返回的图像大部分具有相同的相对颜色。我们按像素坐标 pos 进行分组,并在 ORDER BY 中使用 WITH FILL 修饰符来填充像素位置中没有数据的零。结果,我们将获得一个精确大小为 1024x1024 的 RGBA 位图。

报表

如果您使用右键选择区域或使用选择工具,它将从数据库中为所选区域生成查询结果。这是十分方便的。例如,以下是关于顶级飞机类型的查询:


const sql_types = `
  WITH mercator_x >= {left:UInt32} AND mercator_x < {right:UInt32}
      AND mercator_y >= {top:UInt32} AND mercator_y < {bottom:UInt32} AS in_tile
  SELECT t, anyIf(desc, desc != '') AS desc, count() AS c
  FROM {table:Identifier}
  WHERE t != '' AND ${condition}
  GROUP BY t
  ORDER BY c DESC
  LIMIT 100`;

​​​​​​​ 报告是基于航班号、飞机类型、注册(机尾号)和所有者进行的计算。您点击任何项目后,它将为主 SQL 查询应用一个过滤器。例如,点击 A388,它将显示空客 A380-800 的可视化。此外,如果您将光标移到飞机类型上,它将自动访问维基百科 API 并尝试查找该飞机的图片。但通常在维基百科上找到的是其他内容。

已保存的查询

您可以编辑查询,然后分享链接。该查询会被转换为一个 128 位的哈希值,并保存在同一个 ClickHouse 数据库中:


async function saveQuery(text) {
  const sql = `INSERT INTO saved_queries (text) FORMAT RawBLOB`;
  const hosts = getHosts(null);
  const url = host => `${host}/?user=website_saved_queries&query=${encodeURIComponent(sql)}`;
  const response = await Promise.all(hosts.map(host => fetch(url(host), { method: 'POST', body: text })));
}

async function loadQuery(hash) {
  const sql = `SELECT text FROM saved_queries WHERE hash = unhex({hash:String}) LIMIT 1`;
  const hosts = getHosts(null);
  const url = host => `${host}/?user=website_saved_queries&default_format=JSON&param_hash=${hash}`;
  const response = await Promise.race(hosts.map(host => fetch(url(host), { method: 'POST', body: sql })));
  const data = await response.json();
  return data.data[0].text;
}

​​​​​​​ 我们使用一个名为 website_saved_queries 的不同用户,针对这些查询设置了不同的访问控制和配额。

进度条

在页面上显示一个进度条,展示已处理数据的行数和字节数,这样更直观。


const sql = `SELECT
          sum(read_rows) AS r,
          sum(total_rows_approx) AS t,
          sum(read_bytes) AS b,
          r / max(elapsed) AS rps,
          b / max(elapsed) AS bps,
          formatReadableQuantity(r) AS formatted_rows,
          formatReadableSize(b) AS formatted_bytes,
          formatReadableQuantity(rps) AS formatted_rps,
          formatReadableSize(bps) AS formatted_bps
      FROM clusterAllReplicas(default, system.processes)
      WHERE user = 'website' AND startsWith(query_id, {uuid:String})`;

  const hosts = getHosts(uuid);
  const url = host => `${host}/?user=website_progress&default_format=JSON&param_uuid=${uuid}`;

  let responses = await Promise.all(hosts.map(host => fetch(url(host), { method: 'POST', body: sql })));
  let datas = await Promise.all(responses.map(response => response.json()));

​​​​​​​ 我们从集群中所有服务器的 system.processes 表中进行选择。由于存在许多并行请求的瓦片和查询,其中一些已经完成,一些仍在进行中,因此它不会显示精确的进度。查询只会看到正在进行中的查询,因此总处理记录数会低于实际值。此外,当我们加载第一级别的细节、第二级别的细节等时,进度条的颜色也会有所不同。

缓存局部性

ClickHouse Cloud 中的服务可以使用多个副本,默认情况下,请求会路由到任意健康的副本。处理大量数据的查询将在许多副本上并行执行,而较简单的查询将仅使用单个副本。数据存储在 AWS S3 中,每个副本 pod 还附加了一个本地 SSD,用于缓存,因此内存中的页面缓存也会影响最终查询时间。

精彩的可视化

以下是 Alexey 选取的一些初始图像。这只是一个开始,该网站提供了大量免费的艺术品!

丹佛机场

图片

当我们放大到机场时,我们可以看到飞机停放的位置,甚至可以按制造商或航空公司对它们进行着色:

图片

在德克萨斯州进行的军事训练

图片

在伦敦,直升机在河流上空飞行

图片

在拉斯维加斯没有河流

图片

湾区的小型机场

图片

美国的 F-16 空军基地

图片

墨西哥城附近的一个奇怪的洞

图片

一个火山

图片

51 区

图片

阿联酋航空工程

在迪拜机场,绿色的毛球是阿联酋航空工程的一个飞机库,用于维修空中客车。

图片

欧洲各地的航空公司

图片

达拉斯的小型机场

图片

Meetup 活动讲师招募

我们正为上海活动招募讲师,如果你有独特的技术见解、实践经验或 ClickHouse 使用故事,非常欢迎你加入我们,成为这次活动的讲师,与大家分享你的经验。

点击此处或扫描下方二维码,立刻报名成为讲师!

图片

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

图片

​​联系我们

手机号:13910395701

邮箱:Tracy.Wang@clickhouse.com

满足您所有的在线分析列式数据库管理需求

(1)ADS-B接收机 Ardupilot官网关于《Peripheral Hardware》的翻译 —《(1) ADS-B接收机》。 阅读详情

相关推荐

航空大数据——使用FineBI对ADS-B接收机布站情况及报文分析

这个专题的前面三篇文章主要是由ADS-B报文系统预测飞机坐标,偏向于数据应用。本文主要是对ADS-B接收机的数据做分析,为接收机的维护和增设提供依据,偏向于数据分析。 本文相当于是对前文数据集的再利用,再分析。使用FineBI作为分析工具,机缘巧合碰到了这个软件,个人感觉在数据可视化上,用起来要比MATLAB方便一点。 本文只是提供分析思路,所有可视化分析均可由MATLAB实现。

cyc头发还挺多的博客 2954

【免费下载】 深入解析ADS-B协议:航空电子工程师的必备资源

深入解析ADS-B协议:航空电子工程师的必备资源 【下载地址】ADS-B协议中文版资源下载 本仓库提供了一个名为 `ADS-B协议(中文版).zip` 的资源文件下载。该文件包含了 ADS-B 协议的详细内容,特别是针对 1090MHz ES 标准的详细说明 ...

gitblog_09770的博客 1437

无人机ADS-B模块 (兼容Px4、ardupilot、极致飞控)拒绝黑飞,耗子尾汁!

Aero属于市场上最小的ADS-B接收器类别,专为民用和商用无人机系统。特别适用于UAS控制器支持MAVLink协议。Aero的工作频率为1090MHz,可跟踪有人驾驶的空中交通(配备ADS-B技术)在UAS附近。目的是确保安全有人机和无人飞机之间的分离。Aero开启了实施检测和避免算法,支持将UAS集成到空域中。 ...

Breakthrough 4536

超100T的ADS-B数据,准实时数据获取API

超100T的ADS-B数据,准实时实际数据获取API

泡椒酱的的Java学习记录 2391

ADS-B Art: 将航空数据转换为视觉艺术

本文还有配套的精品资源,点击获取 简介:ADS-B Art是一个项目,它将航空领域的平面转发器(ADS-B)数据包转换为艺术作品。ADS-B是一种用于飞机间位置和飞行信息交换的技术。该项目的核心功能是将接收的ADS-B数据记录下来,并通过算法或设计方式转化为图形、动画或其他视觉形式。项目使用JavaScript编程语言,适合结合数据科学、可视化和艺术设计元素。通过这个项目,...

weixin_33531560的博客 1633

display-data: ADS-B数据Web展示服务器开发指南

自动相关监视广播(ADS-B)是一种在航空领域中广泛应用的技术,它允许飞机自动广播其位置信息,这样地面站和空中的其他飞机就能实时监控飞机的飞行状态。这一技术极大提升了航空交通的监控效率和飞行安全。在互联网上传输数据,尤其是敏感信息时,必须采取加密措施以防止数据泄露。现代加密技术广泛应用于网络安全领域,常用的有对称加密和非对称加密。对称加密:使用相同的密钥对数据进行加密和解密,速度较快,但密钥的分发和管理是个问题。非对称加密:使用一对密钥,即公钥和私钥,其中公钥可以公开分发,私钥保密。

weixin_35756892的博客 700

一段ADSI和EXCHANGE结合的示范代码

在独孤九剑兄的帮助下,完成了这段代码 包括NT用户的建立,EXCHANGE邮箱的建立,两者的结合,权限的设置本代码在nt4.0+sp6+exchange5.5+adsi2.5下运行通过建立以后的用户可以直接收发信件,是一个简化版本的WEB MAIL ACCESSadsi_exchange.asp----------------------------------------------------

Cendy.Chen的专栏 1190

dump1090-to-db:将ADS-B收集的数据存储在dump1090捕获的数据库中

从dump1090导出到数据库 存储在数据库dump1090捕获中。 仓库 作者 姓名:劳尔·卡罗·帕斯托里诺(RaúlCaro Pastorino) 网址: 推特: 特征 自动安装数据库,创建数据库和表 飞机模型 从dump1090 json获取数据 自动安装PHP依赖项 .env的变量 将数据保存到Postgresql DB api上传 创建守护程序服务 相依性 PHP> = 8.0 PostgreSQL 作曲家> = 2.0.11 Datos del json 十六进制→ICAO 24位(6位十六进制) squawk→应答八角星(Señalsquawkenpresentación八进制) 航班→Nombre del Vuelo lat,lon→纬度y十进制数 nucp→为该位置报告的NUCp(导航不确定性类别) seen_pos→塞菲多斯大区(Tempo en seg

gitbook-adsb-guide:轻松实现ADS-B数据的接收、解码与共享

gitbook-adsb-guide:轻松实现ADS-B数据的接收、解码与共享 项目介绍 gitbook-adsb-guide 是一个开源项目,旨在帮助航空爱好者利用 Docker 容器轻松接收、解码并共享 ADS-B 数据。Automatic Dependent Surveillance-Broadcast(ADS-B)是一种安全监控技术,飞机通过卫星导航确定自身位置并周期性广播,使其能够被追踪...

gitblog_00627的博客 863

docker-adsbexchange:将ADS-B数据输入到adsbexchange.com。 设计用于mikenyereadsb-protobuf

米肯耶/ adsbexchange 将ADS-B数据馈送到Docker容器。 旨在与或其他BEAST提供商协同工作。 在x86,x86_64,arm32v6,arm32v7和arm64v8上构建并运行。 容器从BEAST提供者处提取ADS-B信息,并将数据发送到 。 有关更多信息,请参见: 。 此容器使用该页面上概述的“脚本方法”的修改版本。 支持的标签和相应的Dockerfile latest是从每晚为所有受支持的体系结构构建的。 它包含: 在指定的mlat-client和readsb版本 最新版本的adsbexchange-stats 最新发布的rtl-sdr版本 latest_nohealthcheck与上面的latest版本相同。 但是,此版本删除了docker healthcheck。 这是针对运行平台(例如 )的人员完成的,这些平台不支持手动禁用运行状况检查,而不需

ADS-B-1090MHz-ES标准.zip_1090ES协议_ADS-B 1090MHz_ADS_B的 ES协议_ES_ads

ADS-B协议标准,1090MHz 欧洲标准

ADS-B信号处理技术(PartI:信号基础)

设计了一种ADS-B信号检测识别与解调处理算法,并采用C++完成了软件设计实现

软件无线电 1023

ADS-B数据报文采集与解析系统的设计与实现

针对典型ADS-B地面站系统中显控主机显示的信息量较少,且不支持飞行目标航迹数据报文实时采集、数据层面的航迹信息动态显示、原始数据报文历史回放等更细粒度的实际应用需求,旨在构建一套ADS-B数据报文采集与解析系统,尝试在ADS-B地面站处理主机后方对所获取报文的处理应用进行优化改进,对ADS-B Category(Cat)021报文的数据采集方法进行设计,采用UDP组播引接外联方式转发至Cat 021报文解析处理模块,按照标准的Cat 021数据报文协议格式,设计实现相应的报文解析算法,实时对采集的数据报文进行解析和分类存储。

ShadowBroker:实时全球情报地图,开源情报(OSINT)的终极聚合平台

ShadowBroker 是一个实时、多领域的开源情报(OSINT)仪表板。它将数十个分散的公开情报源聚合到一个统一的界面中,能实时追踪飞机、船舶、卫星、地震、冲突区、CCTV网络、GPS干扰以及突发地缘政治事件。项目定位:“Global Threat Intercept — Real-Time Geospatial Intelligence Platform”(全球威胁拦截——实时地理空间情报平台)。核心原则:不创造新的监视能力,只将已公开的数据集进行可视化聚合。技术栈。

曼陀罗的博客 1950

ros2 humble cartographer 2D激光雷达建图

Cartographer是一个支持多平台和传感器配置的SLAM的系统。 本文主要讲述在ros2 humble系统上cartographer的安装方法,以及如何配置参数实现自己的ros2 bag包的离线建图。

weixin_43087302的博客 6938

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

【免费API】transportation运输

API 描述 Auth HTTPS CORS ADS-B Exchange 访问任何空中飞机的实时和历史数据 No Yes Unknown airportsapi 通过ICAO代码获取机场名称和网站URL No Yes Unknown AIS Hub 任何配备AIS跟踪系统的海洋和内陆船舶的实时数据 apiKey No Unknown Amadeus for Developers 旅行搜索-有限使用 OAuth Yes Unknown apilayer aviationsta

API开发 296

开源Agent Skill让AI画图不再翻车:从数据到专业图表全流程

在人工智能与数据可视化交叉领域,让模型直接生成图表往往伴随字体乱码、坐标轴密集、配色失调等高频问题。Agent Skill作为一种可复用的能力封装机制,将专业绘图流程固化为标准化操作手册,从数据特征识别、图表类型决策到代码生成与渲染校验形成完整闭环。它不再依赖临时提示词的一次性发挥,而是让AI按领域专家的思维执行任务,显著提升出图质量与稳定性。这种能力在数据分析报告、运营日报、论文插图等场景具有广泛实用价值,尤其适用于需要快速产出规范化图表的工作流。本文即从这一技术范式出发,介绍一个GitHub上获得2.5

weixin_33851429的博客 938

【免费下载】 探索FlightAware的dump1090:一款强大的ADS-B信号解析工具

在现代航空领域,自动 dependent surveillance-broadcast (ADS-B) 是一种革命性的技术,它允许飞机实时分享其位置、速度等信息。而作为开源社区的一大贡献, 是一个专为接收和解析这些ADS-B数据的软件,对于航空爱好者、开发者或任何对飞行数据感兴趣的人来说,它都是一个宝贵的资源。 ## 项目简介 dump1090是一个用C语言编写的命令行工具,主要目的是从飞机发...

gitblog_00086的博客 2100

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文详细介绍了如何在PHP项目中快速集成SM4国密加密算法,提供完整的代码实现和实际应用示例。从算法原理到核心代码解析,再到性能优化与安全实践,帮助开发者高效实现数据加密功能,满足金融、政务等领域的合规需求。

weixin_29315569的博客 354

【漏洞复现】7-Zip目录穿越漏洞(CVE-2025-11001)

摘要:CVE-2025-11001是7-Zip(v21.02-v24.09)Windows版处理ZIP包符号链接时的高危漏洞,攻击者可构造恶意ZIP文件实现目录穿越和任意文件写入。漏洞源于路径检查缺陷,当用户解压含特殊符号链接的压缩包时,可能将文件写入系统目录。复现利用GitHub公开的Python脚本(https://github.com/pacbypass/CVE-2025-11001)可生成攻击包,需注意该漏洞仅影响Windows且需要用户交互。

LongL_GuYu的博客 1607

ADS-B你知道是什么吗?

上面我们已经讲了,ADS-B的主要信息有飞机的位置、高度、速度、航向、识别号等信息,而这些信息全部来源于机载设备,如飞机的位置信息从机上GPS设备获得、飞机的高度从机上气压高度表获得;如果说二次雷达是管制员的“眼睛”,那么随着ADS-B IN技术的推广使用,ADS-B将成为飞行员的“眼睛”,从而使保持飞行安全间隔的责任更多地向空中转移,这是未来实现“自由飞行”不可或缺的技术基础;ADS-B IN是指飞机接收其他飞机发送的ADS-B OUT信息或地面服务设备发送的信息,为机组提供运行支持。

u011468564的博客 1万+

华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。

MISAYAONE的博客 224

零基础入门adsb_deku:Rust开发者的ADS-B协议解码实战教程

adsb_deku是一个基于Rust语言开发的ADS-B协议解码工具,它不仅能够高效解码飞行器广播的信息,还提供了一个直观的TUI雷达应用界面,帮助开发者和航空爱好者轻松获取实时航班数据。本教程将带你从零开始,快速掌握adsb_deku的安装、配置和基础使用方法。 ## 什么是ADS-B以及adsb_deku的核心功能 ADS-B(Automatic Dependent Surveillanc

gitblog_00516的博客 653

【汽车 OTA 】差分升级

汽车 OTA 差分升级,本质是在整包 OTA 的基础上,通过“只传变化”的方式,大幅减少下载数据量、时间和成本,是当前车端软件升级的主流方向之一。

天赐好车的博客 482

在轻量化与精度之间取得平衡:YOLOv8 + GhostNet 的设计与实验分析

摘要: GhostNet系列(GhostNet、GhostNetv2、GhostNeXt)通过“幽灵特征图”技术,以极低计算量生成丰富特征,为YOLOv8提供轻量化改造方案。该技术能在减少参数量与计算量的同时保持或提升检测精度,适用于边缘设备部署。实现时需替换YOLOv8的Backbone为GhostNet模块,并通过消融实验验证其有效性。实验数据表明,改造后的模型在参数量降低30%的同时,推理速度提升28.6%,mAP@0.5最高提升1.9个百分点,平衡了轻量化与精度,为毕设提供技术创新性与工程落地性的双

m0_64661770的博客 194
上一篇: 如何只用 ClickHouse SQL 实现 K-Means 聚类
下一篇: ClickHouse 24.5 版本发布说明
ClickHouseDB
博客等级 码龄3年 1707粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值