用 Rerun 可视化实时空中交通数据:GeoPandas + pyproj + `send_columns` 实战解析

发布时间:2026/11/10 19:05:33

用 Rerun 可视化实时空中交通数据:GeoPandas + pyproj + `send_columns` 实战解析 用 Rerun 可视化实时空中交通数据GeoPandas pyproj send_columns实战解析【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本教程围绕 Rerun 官方示例 examples/python/air_traffic_data 展开演示如何把 INVOLI 提供的真实空中交通数据航班位置、高度、航速等接入 Rerun viewer在地图视图Map View与 3D 视图中同时呈现航班轨迹用 pyproj 完成坐标系重投影用 GeoPandas 加载真实国界地图数据并对比行式rr.log与列式rr.send_columns两种日志写入策略。读完本文你将掌握一套可复用的地理空间数据 Rerun 多视图的可视化工程方案。示例概览一个多视图的空中交通数据看板示例的核心脚本是 air_traffic_data.py它展示了 Rerun viewer 的多个能力维度使用**地图视图Map View**显示地理空间原始图元GeoPoints等使用pyproj将地理数据从一个坐标系变换到另一个坐标系EPSG:4326 经纬度 → 最适合当前区域的 UTM 投影坐标系使用GeoPandas加载真实行政边界矢量数据EU NUTS 边界并投影到 3D 视图使用Polars对数据分批batch再通过rr.send_columns()一次调用批量下发--batch模式。示例代码内部构建了一个固定布局的 blueprint上方横向并排一个 3D 视图Spatial3DView与一个地图视图MapView下方是一个时间序列视图TimeSeriesView并设置行高比例为row_shares[3, 1]blueprint rrb.Vertical( rrb.Horizontal(rrb.Spatial3DView(origin/), rrb.MapView(origin/)), rrb.TimeSeriesView(origin/aircraft), row_shares[3, 1], ) rr.script_setup(args, rerun_example_air_traffic_data, default_blueprintblueprint)关于地图视图的能力边界可以参考仓库内文档 map_view.md它是一个 2D 地图视图用于展示地理空间图元可配置zoom缩放级别与background底图当前可可视化的 archetype 为GeoLineStrings与GeoPoints其中GeoPoints的位置以 EPSG:4326 经纬度北/东为正的度数表达可选颜色与半径。运行示例环境准备示例要求本机已安装 Rerun SDK 并克隆本仓库Rerun 最新版本 SDK 对应的 Python 版本要求见仓库文档随后按 README 完成安装pip install --upgrade rerun-sdk # 安装最新版 Rerun SDK git clone gitgithub.com:rerun-io/rerun.git # 克隆仓库 cd rerun git checkout latest # 检出与最新 SDK 发布版匹配的提交示例的 Python 依赖声明在 pyproject.toml 中包括geopandas、numpy、polars、pyproj、requests、rerun-sdk、shapely、tqdm。以可编辑模式安装pip install -e examples/python/air_traffic_data启动与参数直接运行主脚本即可看到效果python -m air_traffic_data如需定制行为或保存数据用--help查看全部命令行参数python -m air_traffic_data --help从源码看示例实际支持的 CLI 参数包括参数默认值说明--dataset2h选择自动下载的数据集可选10min或2h见下方数据集一节--rawFalsestore_true若开启直接记录含缺失值等问题的原始数据用于在 viewer 中压测边界情况--batchTrue若开启使用批处理 logger基于rr.send_columns要求 Rerun 0.18--batch-size8192批处理 logger 的批次大小--dir无使用本地目录中的 JSON 数据而不是下载数据集此外rr.script_add_args(args)还会注入 Rerun 脚本的标准参数如连接/服务/保存等使得该示例可以直接以rerun支持的各种运行方式连接 viewer、起 server、保存.rrd文件启动。数据集与数据模型INVOLI 数据集数据由 INVOLI 提供脚本内置了两个可直接下载的数据集air_traffic_data.pyINVOLI_DATASETS { 10min: https://storage.googleapis.com/rerun-example-datasets/involi/involi_demo_set_1_10min.zip, 2h: https://storage.googleapis.com/rerun-example-datasets/involi/involi_demo_set_2_2h.zip, }下载带 tqdm 进度条、按 chunk 流式写入内存io.BytesIO并校验content-length是否一致随后解压到仓库内examples/python/air_traffic_data/dataset/目录首次运行时自动创建。如果你已经有同类 JSON 数据也可以用--dir指向本地目录脚本会递归收集该目录下所有*.json文件get_paths_for_directory。Measurement 数据模型每一条航班记录被建模为Measurementdataclassair_traffic_data.py字段与原始 JSON 的对应关系如下字段类型来源icao_idstrdata[ids][icao]ICAO 24 位地址码同时用作实体路径latitude/longitudefloat \| Nonedata.get(latitude)等允许缺失barometric_altitudefloat \| None气压高度用于 3D 点位与时间序列wg84_altitudefloat \| NoneWGS84 高度coursefloat \| None航向ground_speedfloat \| None地速vertical_speedfloat \| None垂直速度ground_statusstr \| None地面状态如起降阶段标记timestampfloatdata[timestamp][0] data[timestamp][1] / 1e9即秒 纳秒组合时间戳换算成浮点秒注意原始数据中大量字段允许为空None这一特点直接决定了后面批处理 logger 需要按字段分别drop_nulls再下发的设计。坐标系变换从经纬度到最优 UTM 投影这是本示例最有价值的技术点之一把地理坐标经度、纬度投影为适合展示的平面坐标同时保留一份经纬度原始坐标用于地图视图。自动挑选最优 UTM 分带find_best_utm_crsair_traffic_data.py根据所有测量点的经纬度跨度计算AreaOfInterest再通过pyproj.database.query_utm_crs_info(datum_nameWGS 84, area_of_interest...)查询覆盖该区域的最佳 UTM 带最终CRS.from_epsg(...)返回对应 CRSarea_of_interest get_area_of_interest(measurements) utm_crs_list query_utm_crs_info(datum_nameWGS 84, area_of_interestarea_of_interest) return CRS.from_epsg(utm_crs_list[0].code)因为航班数据集中在欧洲德国、瑞士上空自动选出的 UTM 带天然覆盖该区域无需硬编码投影参数。Transformer 的使用随后构造一个永远 x经度、y纬度顺序的变换器always_xyTrue避免经纬度顺序歧义proj Transformer.from_crs(EPSG:4326, utm_crs, always_xyTrue)在行式 logger 中每个测量点这样投影为 3D 坐标rr.log( entity_path, rr.Points3D( [self._proj.transform(measurement.longitude, measurement.latitude, measurement.barometric_altitude)], colorscolor, ), rr.GeoPoints(lat_lon[measurement.latitude, measurement.longitude]), )一次rr.log同时写入两类图元Points3DUTM 平面坐标 高度进入 3D 视图GeoPoints保留经纬度进入地图视图。航线所在实体的颜色由实体路径字符串确定性生成rr.components.Color.from_string(entity_path)同一架飞机在多个视图中颜色一致。高度夸张与 Transform3D由于航班高度约万米级相对横向距离尺度极小脚本对整棵aircraft实体树施加了一个静态的 z 轴 10 倍缩放rr.log(aircraft, rr.Transform3D(scale[1, 1, 10]), staticTrue)这是 Rerun 典型的静态数据 运行时变换组合用法staticTrue表示该变换不会随时间变化一次性写入即可作用于其下所有子实体。用 GeoPandas 加载真实地图边界为了在 3D/2D 视图中显示国界、区域边界脚本会从欧盟 GISCO 服务下载 NUTS 2021 边界数据1:1000 万比例尺EPSG:4326解压到examples/python/air_traffic_data/dataset/map_data/然后用 GeoPandas 读取并重投影到之前选定的 UTM CRSmap_data ( gpd.read_file(MAP_DATA_DIR / fNUTS_RG_01M_2021_4326_LEVL_{level}.json) .set_crs(epsg:4326) .to_crs(crs) )对每个属于目标国家示例硬编码为德国DE、瑞士CHlevel 0的多边形用shapely_geom_to_numpy把Polygon/MultiPolygon含内环interiors转成 numpy 坐标数组同一实体路径下同时记录 2D 与 3D 两组LineStrips2D 直接用平面坐标3D 用np.hstack([line, np.zeros((len(line), 1))])补齐 z0以rr.AnyValues(**metadata)把该边界多边形的属性如 NUTS_ID 等剔除 geometry 字段静态挂到实体上。rr.log(entity_path /2D, rr.LineStrips2D(lines, colorscolor), staticTrue) rr.log( entity_path /3D, rr.LineStrips3D([np.hstack([line, np.zeros((len(line), 1))]) for line in lines], colorscolor), staticTrue, )边界、地面状态等不随时间变化的数据都使用staticTrue这正符合 Rerun 数据模型中静态数据不占时间索引的设计详见 static.md。两种日志写入策略行式rr.log与列式rr.send_columns示例最有教学价值之处在于同一份数据分别实现了两种 loggerair_traffic_data.py源码中用LoggerProtocol 统一接口process_measurementflushlog_everything根据--batch选择具体实现。策略一MeasurementLogger逐行rr.log面向数据在运行中逐步产生的场景逐条处理每条测量记录rr.set_time(unix_time, timestampmeasurement.timestamp) # ... 投影后的 Points3D GeoPoints ... rr.log(entity_path, rr.AnyValues(**metadata)) # 其他属性 rr.log(entity_path /barometric_altitude, rr.Scalars(...), rr.SeriesLines(colorscolor)) # 高度时间序列要点时间通过rr.set_time(unix_time, ...)设置实体路径按aircraft/{icao_id}组织icao_id天然成为实体标识_ignored_fields中排除icao_id与timestamp避免重复记录在非--raw模式下dict_factory会过滤掉值为None的字段让记录更干净高度被单独记录为ScalarsSeriesLines供下方的TimeSeriesView展示。策略二MeasurementBatchLogger批量rr.send_columns当数据已经是列式存储例如从文件、数据库批量读出时逐行log会带来大量小调用。send_columns允许一次调用更新实体在多个时间点的状态是更高效的方案。相关概念可参考仓库文档 send-columns.md与面向行的logAPI 不同send_columns会绕过时间上下文与微批处理micro-batching且不会自动添加log_time/log_tick等内置时间线只包含调用中显式传入的时间列。批处理 logger 的核心流程air_traffic_data.pydf polars.DataFrame(self._measurements).sort(timestamp) # 原始数据未按时间排序先排序 for (icao_id,), group in df.group_by(icao_id): self.log_position_and_altitude(group, icao_id) self.log_ground_status(group, icao_id) self.log_metadata(group, icao_id)由于原始数据各字段缺失模式不同位置/高度、地面状态、航向等元数据被拆成三次独立的send_columns调用各自drop_nulls后再下发。位置与高度部分air_traffic_data.py最为典型timestamps rr.TimeColumn(unix_time, timestampdf[timestamp].to_numpy()) pos self._proj.transform(df[longitude], df[latitude], df[barometric_altitude]) rr.send_columns( entity_path, [timestamps], [ *rr.Points3D.columns(positionsnp.vstack(pos).T), *rr.GeoPoints.columns(positionsnp.vstack((df[latitude], df[longitude])).T), *rr.AnyValues.columns(latitude..., longitude..., barometric_altitude...), ], ) rr.send_columns( entity_path /barometric_altitude, [timestamps], rr.Scalars.columns(scalarsdf[barometric_altitude].to_numpy()), )几个值得注意的实现细节先注册静态指示器indicator每个飞机实体第一次出现时用rr.Points3D.from_fields(colorscolor)、rr.SeriesLines.from_fields(colorscolor)配合staticTrue写入一次用于声明颜色等静态属性此后send_columns不再重复传颜色。源码中对此有注释说明_position_indicators集合去重且留有一处已知限制的 TODOGeoPoints.from_fields(colors...)在 untagged index 下暂时是未定义行为因此批处理模式下地图视图的点位颜色由 3D 指示器间接决定。批大小默认 8192process_measurement累积满self._batch_size即触发flush最终在log_everything末尾还会再flush()一次确保残留数据被写入。时间列与组件列分离rr.TimeColumn(unix_time, ...)作为索引列*.columns(...)返回组件列send_columns把若干索引列 若干组件列一次性提交等价于多条时间戳的批量log。对应概念详见 chunks.md 与 chunk-processing-api.md。排序的收益get_paths_for_directory用自然排序human sortre.split(r(\d))按数字段排序整理 JSON 文件路径。虽然 Rerun 本身接受乱序数据但乱序会带来较小的性能开销日志侧先做廉价排序总是更优——源码注释明确说明了这一取舍。实体层级与数据组织从代码可以归纳出完整的实体树设计供读者参考其组织方式aircraft/ # Transform3D(scale[1,1,10]) 静态变换 ├── {icao_id}/ # Points3D GeoPoints AnyValues(航向/地速/垂直速度/地面状态) │ └── barometric_altitude/ # Scalars SeriesLines高度时间序列 region_boundaries/ ├── DE/{level}/{NUTS_ID}/ # LineStrips2D LineStrips3D AnyValues(属性) └── CH/{level}/{NUTS_ID}/时间线统一使用unix_time浮点秒由rr.set_time行式或rr.TimeColumn列式写入静态数据边界、变换、指示器用staticTrue动态数据每架飞机的轨迹、高度序列按时间推进。延伸把方案迁移到自己的地理数据综合上述实现若你要在自己的项目里复刻这套可视化管线核心步骤可归纳为确定 CRS用query_utm_crs_infoAreaOfInterest自动挑选覆盖数据范围的最优 UTM 带或按需固定使用某个投影构造 TransformerTransformer.from_crs(EPSG:4326, target_crs, always_xyTrue)同时保留原始经纬度数据分层位置/轨迹写入Points3D投影坐标与GeoPoints经纬度双份静态背景边界、底图要素以LineStrips*staticTrue写入时序属性高度、速度单独写成Scalars供时间序列视图消费选写入策略实时流式数据用行式rr.log批量/列式数据Polars/DataFrame/文件用rr.send_columnsrr.TimeColumn并按字段缺失模式分组下发组织布局用rrb.Vertical/rrb.Horizontal/rrb.Spatial3DView/rrb.MapView/rrb.TimeSeriesView构建多视图 dashboard把 3D、地图、时序三个视角并置。本示例的完整代码air_traffic_data.py、依赖声明pyproject.toml与官方说明README.md都位于本仓库内可随时对照阅读地图视图与列式 API 的完整参考分别见 map_view.md 与 send-columns.md。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/10 19:05:30

Linux防火墙firewalld只允许特定IP访问配置与排查实战

1. 需求先拆清楚:什么场景下才叫"只允许特定IP访问"去年帮一个朋友收拾一台被暴力破解的测试机,登进去一看/var/log/secure里刷了几万条失败登录记录,来源IP换着花样来。他当时的诉求很朴素:这台机器只给自己公司的两台…

2026/11/7 11:15:56

OpenEuler22.04部署Docker:系统级适配与华为云镜像源实战

1. 这不是普通安装:OpenEuler22.04上Docker部署的本质是“系统级适配”你搜“docker安装教程”,满屏都是Ubuntu、CentOS的步骤,复制粘贴到OpenEuler22.04上——十有八九卡在apt update报错、yum install docker-ce提示包不存在、或者装完启动…

2026/11/9 22:17:42

C语言实现SBC音频编解码算法:从原理到嵌入式优化

简介:SBC(Subband Coding,子带编码)是蓝牙音频传输中广泛使用的低复杂度音频编解码算法。这份C语言实现资源面向嵌入式开发者和音频算法学习者,帮助理解子带划分、滤波、量化、熵编码等核心环节在资源受限环境下的落地…

2026/11/10 19:00:42

学低压电工证去哪里实操考试考什么

低压电工证过期了不知道怎么复审?官方报名入口在这儿,快看! 证书过期了不知道怎么复审延期?别慌,你不是一个人。上周我接到一个三门峡的建筑工人老张的电话,他说自己低压电工证三年前就该复审了,但因为工作忙一直没处理,现在连工地都不让进。这种“临…

2026/11/10 19:00:42

高压电工作业报考要求全知道,全国通用证书助你快速上岗

高压电工作业报考要求全知道,全国通用证书助你快速上岗 你是不是正在为找不到工作发愁?特种作业证成了不少建筑行业、电力安装类岗位的“门槛证”,特别是高压电工作业,全国通用,没有它,连面试机会都难有。今天就带你搞清楚高压电工作业报考要求,别再被…

2026/11/10 19:00:42

电工证单据报名费多少钱 通过率揭秘怎么避开中介套路

电工证单据报名费多少钱 通过率揭秘怎么避开中介套路 不知道去哪报名怕被中介坑?现在考电工证越来越多人重视,但信息不对称、流程复杂、价格不透明,真的让人头大。尤其是刚从商丘转岗来的你,想要拿到电工证单据,又怕被中介坑钱、考试不通过,这事儿必须…

2026/11/10 19:00:42

苏州行车特种工考证班2026河南最新政策下怎么报更划算

苏州行车特种工考证班2026河南最新政策下怎么报更划算 学历不高怕报不上名,现在考行车特种工证真的难吗?尤其是看到2026河南最新政策出台后,很多人心里直打鼓,怕自己因为学历不够被拒之门外。但其实,河南省应急管理厅明确规定,特种作业证书报考…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑