时空数据可视化实战:用Python+Kepler.gl制作动态交通网络演变地图
如果你是一名数据可视化爱好者或者对交通网络、地理信息系统GIS感兴趣那么你一定见过那种令人着迷的“时间推移地图”Timelapse Map。它们像有生命一样动态地展示着城市扩张、人口迁徙或是交通网络的生长。但你是否想过自己动手制作一个比如用代码“复活”德国铁路网在过去几十年里的演变过程这听起来像是一个庞大的工程需要海量的历史数据、复杂的地理信息处理和高超的可视化技巧。很多人因此望而却步认为这只是专业机构或大型团队的专利。今天这篇文章要打破这个认知。我们将从一个具体的项目——“德国铁路网时间推移地图”入手但核心目的不是复现它而是为你拆解实现这类“时空数据可视化”的完整技术栈和通用方法论。你会发现借助现代开源工具和清晰的数据处理流程从零开始构建一个动态的交通网络演变图并没有想象中那么困难。本文将解决几个关键问题数据从哪来如何获取、清洗和结构化历史交通网络数据流程怎么走从原始数据到动态地图需要经过哪些核心步骤工具怎么选有哪些高效、免费的工具和库如Python的GeoPandas, Kepler.gl, Mapbox可以组合使用坑怎么避在坐标系统、时间数据处理、性能优化上有哪些新手必知的陷阱读完本文你将获得一套可复用的技术方案不仅能理解“German Train Network – Map Timelapse”背后的原理更能将其应用于你感兴趣的任何时空数据集如国内高铁网络、城市地铁发展、航空航线变化等制作出属于自己的专业级动态可视化作品。1. 理解核心挑战时空数据可视化的“三层关卡”在动手之前我们必须清楚要跨越哪些障碍。一个完整的“铁路网时间推移地图”项目本质上是将空间信息铁路线在哪里、拓扑信息站点如何连接和时间信息何时开通/废弃三者融合并映射到时间轴上。这带来了三大核心挑战第一关数据获取与清洗这是最耗时、也最决定成败的一步。理想的数据应包含每条铁路段的几何信息经纬度坐标构成的线、开通年份、可能还有运营状态、线路等级等。现实中这类数据往往分散、格式不一、质量参差。你可能需要从开放数据门户、学术研究数据集甚至通过爬虫和历史地图数字化来获取。第二关时空数据建模如何用数据结构优雅地表示“一条2010年开通2023年仍在运营的铁路线”简单地为每条线添加一个open_year字段是不够的。你需要考虑线路的改建、电气化、提速甚至废弃。一个更健壮的模型是使用“有效时间”区间[start_date, end_date]来表示每条几何要素的生命周期。第三关动态渲染与交互静态地图展示某一时刻的状态很简单但如何平滑地、按时间顺序渲染出网络的生长过程这需要前端可视化库支持基于时间属性的动态过滤和过渡动画。同时用户可能需要控制时间轴、暂停、查看某一年的快照。理解了这三关我们的技术方案就有了清晰的靶心。接下来我们将逐一攻克。2. 技术栈选型轻量、高效、全开源的组合拳对于个人开发者或小团队我们追求的是在效果和专业性之间取得平衡。以下是一个经过验证的、以Python为核心的技术栈环节推荐工具/库核心职责备选方案数据处理Python (Pandas, GeoPandas)数据清洗、整合、时空属性计算、格式转换。Python生态是数据处理的事实标准。R (sf, tidyverse)地理处理GeoPandas, Shapely处理地理空间数据点、线、面进行空间运算如简化几何、坐标转换。PostGIS (数据库内处理)可视化开发Kepler.gl (Python Web)由Uber开源的强大地理数据分析工具原生支持时间序列数据的动态播放且能与Jupyter Notebook无缝集成。Mapbox GL JS (更底层定制性强) Folium (较简单)底图服务Mapbox / OpenStreetMap提供美观、高性能的在线地图底图。Kepler.gl默认集成。高德/百度地图API (需处理国内坐标系)数据存储GeoJSON / Shapefile中间数据交换格式。GeoJSON尤其适合Web可视化。PostGIS, GeoPackage为什么是Kepler.gl因为它极大地降低了动态地理可视化的门槛。你无需编写复杂的前端JavaScript代码只需在Python中准备好带有时间字段的GeoDataFrame通过keplergl库即可生成一个包含时间轴控件的交互式网页应用并可以轻松导出为静态HTML文件分享。它完美解决了上述的“第三关”挑战。3. 环境准备搭建你的地理数据处理工作台确保你的计算机上已经安装了Python推荐3.8及以上版本。我们将使用conda或pip来管理环境因为地理空间库的依赖相对复杂。步骤1创建并激活虚拟环境强烈推荐# 使用 conda (如果已安装Anaconda/Miniconda) conda create -n geo-timelapse python3.9 conda activate geo-timelapse # 或者使用 venv python -m venv geo-timelapse # Windows geo-timelapse\Scripts\activate # Linux/Mac source geo-timelapse/bin/activate步骤2安装核心库pip install pandas geopandas shapely fiona keplergl mapboxgl jupyterlabgeopandas: 核心地理数据处理库。shapely: 用于操作几何对象。fiona: 用于读写各种地理空间数据格式。keplergl: Kepler.gl的Python接口。mapboxgl: 可选用于更低层的Mapbox集成。jupyterlab: 推荐在Notebook中交互式开发。步骤3验证安装创建一个Python脚本或Jupyter Notebook单元格运行以下代码检查关键库是否就绪import pandas as pd import geopandas as gpd from shapely.geometry import LineString print(fPandas version: {pd.__version__}) print(fGeoPandas version: {gpd.__version__}) # 尝试创建一个简单的线几何对象 line LineString([(13.4, 52.5), (13.5, 52.6)]) print(fGeometry created: {line})如果以上步骤顺利完成你的基础工作台就搭建好了。4. 数据获取与清洗实战以开放数据为例完全获取德国铁路网百年历史数据是项巨大工程。为演示流程我们可以从开放数据入手。例如欧洲环境署EEA或OpenStreetMapOSM可能提供当前或某个时间段的铁路网络数据。这里我们以模拟数据来演示完整流程其方法完全适用于真实数据。假设我们有一个CSV文件german_railways_simulated.csv模拟了三条铁路线line_id,name,start_year,geometry_wkt 1,Rhine Valley Line,1856,LINESTRING (7.6 50.3, 7.7 50.4, 7.8 50.5) 2,Berlin-Hamburg Line,1846,LINESTRING (13.4 52.5, 12.3 52.4, 10.0 53.5) 3,Munich-Augsburg Line,1839,LINESTRING (11.6 48.1, 11.9 48.4)注WKT (Well-Known Text) 是一种表示几何对象的文本格式。步骤1加载并转换为GeoDataFrameimport pandas as pd import geopandas as gpd from shapely import wkt # 读取CSV df pd.read_csv(german_railways_simulated.csv) # 将WKT文本列转换为几何对象 df[geometry] df[geometry_wkt].apply(wkt.loads) # 创建GeoDataFrame并指定坐标系这里使用WGS84EPSG:4326 gdf gpd.GeoDataFrame(df, geometrygeometry, crsEPSG:4326) # 查看前几行 print(gdf.head()) print(gdf.crs) # 查看坐标系步骤2处理时间数据构建“生命周期”对于时间推移每条线需要一个时间字段。我们可以用start_year作为其“出生”时间。为了可视化我们通常需要将其转换为日期格式假设每年1月1日开通。# 将年份整数转换为日期每年1月1日 gdf[start_date] pd.to_datetime(gdf[start_year].astype(str) -01-01) # 假设所有线路都运营至今我们设置一个“结束日期”为今天或可视化结束年份 gdf[end_date] pd.to_datetime(2023-12-31) # 如果数据中有废弃年份字段则应使用真实数据 # 查看时间范围 print(fTime span: {gdf[start_date].min()} to {gdf[end_date].max()})步骤3数据增强与简化可选但重要简化几何如果真实数据非常精细点数多会影响渲染性能。可以使用simplify方法。# 公差0.001度约100米在缩放时平衡精度和性能 gdf[geometry] gdf[geometry].simplify(tolerance0.001)添加属性可以添加颜色、线宽等视觉变量例如根据开通年代着色。def color_by_decade(year): if year 1850: return #8B0000 # 深红 elif year 1900: return #FF4500 # 橙红 elif year 1950: return #FFD700 # 金色 else: return #32CD32 # 亮绿 gdf[color] gdf[start_year].apply(color_by_decade)步骤4导出为GeoJSONKepler.gl和大多数Web地图库最友好的格式是GeoJSON。# 只保留需要的列 output_gdf gdf[[line_id, name, start_year, start_date, end_date, color, geometry]] # 导出为GeoJSON output_gdf.to_file(german_railways_processed.geojson, driverGeoJSON)现在我们得到了一个包含空间、属性、时间信息的干净数据集。5. 使用Kepler.gl创建动态时间推移地图这是将数据变为可视化成果的关键一步。我们将在Jupyter Notebook中完成。步骤1在Notebook中初始化Kepler.gl地图from keplergl import KeplerGl import json # 1. 加载处理好的GeoJSON数据 with open(german_railways_processed.geojson, r) as f: geo_data json.load(f) # 2. 创建Kepler.gl地图对象 map_1 KeplerGl(height600) # 3. 添加数据。data参数是一个字典键是数据集名称值是数据本身。 map_1.add_data(datageo_data, namegerman_railways) # 4. 在Notebook中显示地图 map_1此时你会看到一个交互式地图但还没有时间轴。步骤2配置图层启用时间过滤Kepler.gl的强大之处在于其丰富的配置。我们需要通过配置告诉它哪个字段代表时间并启用时间播放器。# 获取当前的配置字典 config map_1.config # 我们需要修改配置。通常Kepler.gl会自动生成一个配置。 # 我们可以通过编程方式调整。更简单的方法是先显示地图然后通过UI操作配置再导出配置。 # 这里演示如何以编程方式设置假设知道配置结构。 # 一个更实用的方法是在Notebook中显示地图后手动进行如下UI操作 # 1. 点击左侧面板的图层图标三个叠放的圆。 # 2. 找到‘german_railways’图层点击它进入设置。 # 3. 在‘Visual Channels’选项卡找到‘Time’。 # 4. 将‘Time’下拉菜单设置为‘start_date’字段。 # 5. 地图上方会出现一个时间轴滑块。点击旁边的播放按钮即可看到动画。 # 手动配置后我们可以将配置保存下来供下次直接使用 # useful_config map_1.config # with open(kepler_config.json, w) as f: # json.dump(useful_config, f)步骤3调整视觉样式通过UI你可以轻松调整颜色在‘Color’选项选择‘color’字段我们之前生成的或固定一个颜色。线宽调整线条粗细。不透明度可以设置随时间变化的不透明度让新线路更突出。底图在底图设置中可以选择Mapbox的深色、浅色等样式使铁路线更清晰。步骤4生成可分享的HTML文件这是Kepler.gl的一大亮点你可以将包含数据和配置的完整地图导出为一个独立的HTML文件。# 导出为HTML这将包含所有数据和配置文件会稍大 map_1.save_to_html(file_namegerman_railway_timelapse.html)现在你可以将german_railway_timelapse.html文件用浏览器打开或者分享给任何人。他们无需安装任何软件就能交互式地播放德国铁路网的“生长”动画。6. 进阶技巧与性能优化当数据量变大例如全国高铁网络数万条线段时性能和体验成为关键。1. 数据切片与简化几何简化如前所述在可接受的精度损失下使用simplify大幅减少坐标点数。属性筛选只导出可视化必需的字段到GeoJSON减少文件体积。按层级切片对于超大规模数据考虑使用矢量切片Vector Tiles技术如生成MBTiles格式但这需要更复杂的前后端配合。2. Kepler.gl配置优化聚合模式对于点数据可以开启聚合。但对于线数据此选项意义不大。渲染选项在“地图设置”中可以关闭不必要的特效提升渲染速度。3. 使用Mapbox GL JS进行深度定制如果Kepler.gl的模板功能无法满足需求如自定义时间轴样式、更复杂的动画可以转向更底层的Mapbox GL JS。你需要将GeoJSON数据上传至Mapbox Studio创建为一个Tileset。然后编写JavaScript代码使用map.setFilter方法根据时间属性动态显示/隐藏线路。这需要前端开发知识但控制力最强。// 伪代码示例 map.on(load, function() { map.addSource(railways, { type: geojson, data: your_data.geojson }); map.addLayer({ id: railways-layer, type: line, source: railways, ... }); let currentYear 1850; function updateMapByYear(year) { map.setFilter(railways-layer, [all, [, [get, start_year], year], [, [get, end_year], year] ]); } // 用滑块或按钮控制currentYear并调用updateMapByYear });7. 常见问题与排查思路在制作过程中你很可能遇到以下问题问题现象可能原因排查方式解决方案Kepler.gl地图不显示1. 数据坐标系不是WGS84 (EPSG:4326)。2. 几何对象无效自相交、空值。3. 数据范围异常经纬度值错误。1. 检查gdf.crs。2. 运行gdf.is_valid检查几何。3. 打印gdf.total_bounds查看范围。1. 用gdf.to_crs(epsg4326)转换坐标系。2. 用gdf.buffer(0)尝试修复无效几何。3. 清洗数据确保经纬度在合理范围经度-180~180纬度-90~90。时间轴无法播放或无效果1. 时间字段格式不是标准日期/时间格式。2. 时间字段名未正确配置到图层中。1. 检查gdf[start_date].dtype应为datetime64[ns]。2. 在Kepler UI中确认图层“Time”通道已绑定正确字段。1. 使用pd.to_datetime强制转换。2. 在Kepler UI中手动选择或通过配置config中的filter部分进行设置。导出HTML文件巨大100MBGeoJSON数据量过大包含了过多不必要的几何细节或属性字段。检查导出的GeoJSON文件大小。1. 几何简化。2. 删除不必要的属性列。3. 考虑将数据上传到在线服务如Mapbox Studio在HTML中引用Tileset ID而非内嵌数据。线条显示不连续或破碎1. 原始数据本身就是分段的路网。2. 坐标精度过高在简化时被过度打断。在地图上放大查看断裂处。1. 如果是数据特性可接受。2. 调整simplify的tolerance参数或使用更复杂的简化算法如Douglas-Peucker。浏览器卡顿或崩溃数据量超出浏览器WebGL渲染能力。打开浏览器开发者工具的性能面板。1. 实施“数据切片与简化”中的所有优化。2. 降低Kepler.gl地图的渲染质量设置。3. 升级电脑显卡驱动。8. 最佳实践与项目建议版本控制数据管道将数据清洗和处理的每一步下载、清洗、转换、导出写成Python脚本.py文件并使用Git管理。这确保了流程的可复现性。分层设计将数据准备Python、可视化配置Kepler.gl UI/JSON、发布HTML分离。保存好最终的Kepler.gl配置文件config.json这样当数据更新时只需替换数据源加载配置即可快速生成新地图。元数据文档创建一个README.md文件记录数据来源、字段含义、处理步骤、坐标系以及如何运行脚本。这对未来的你或合作者至关重要。测试不同规模数据在开发早期先用一个子集如一个州的铁路测试整个流程快速迭代。确认无误后再跑全量数据。版权与许可务必确认你所使用的数据尤其是底图和铁路数据的许可协议特别是用于公开分享或商业用途时。OpenStreetMap数据遵循ODbL协议要求署名。讲述故事一个成功的时间推移地图不仅是技术展示更是故事讲述。考虑在关键时间点如东西德统一后铁路整合添加文字注解Kepler.gl支持添加注记层引导观众理解变化背后的历史或社会因素。通过本文的拆解你会发现“German Train Network – Map Timelapse”这类看似复杂的项目被系统地分解为了数据获取、清洗、建模、可视化配置和优化等可执行的步骤。这套方法论不仅适用于铁路网络同样可以迁移到可视化城市边界变化、疫情传播路径、物流网络扩张等任何时空数据场景。核心工具链Python (GeoPandas) Kepler.gl的组合为你提供了从数据科学家到地图叙事者的桥梁。现在你可以尝试寻找自己感兴趣领域的数据开始构建你的第一个动态时空故事地图了。建议从一个小区域、短时间范围的数据集开始快速获得正反馈再逐步挑战更复杂的项目。

相关新闻

OpenRouter API升级:智能体级活动数据查询与监控实践

OpenRouter API升级:智能体级活动数据查询与监控实践

在实际 AI 应用开发中,无论是构建智能体、集成大模型还是进行数据分析,调用稳定、功能丰富的 API 平台是核心环节。OpenRouter 作为聚合了众多主流大模型的服务平台,其 API 的稳定性和功能迭代直接影响着开发者的集成效率和最终用户体验。近期…

2026/8/26 9:04:07 阅读更多 →
AI产业落地瓶颈与破局:从技术狂欢到价值创造的务实路径

AI产业落地瓶颈与破局:从技术狂欢到价值创造的务实路径

1. 从全民热潮到产业落地:一场认知与现实的碰撞最近两年,AI的热度几乎达到了沸点。从科技媒体的头条,到投资人的饭局,再到普通人的茶余饭后,“大模型”、“Agent”、“算力”这些词出现的频率高得惊人。打开社交媒体&a…

2026/8/26 4:58:53 阅读更多 →
OpenClaw与Hermes对比:AI Agent从思考到执行的技术架构与选型指南

OpenClaw与Hermes对比:AI Agent从思考到执行的技术架构与选型指南

1. 项目概述:从“会聊天”到“能动手”的AI进化最近在AI圈子里,OpenClaw和Hermes这两个名字被讨论得越来越频繁。如果你还在和ChatGPT、Claude这类纯文本模型“聊天”,那你可能已经有点落伍了。新一代的AI Agent,或者说“智能体”…

2026/8/26 5:44:22 阅读更多 →

最新新闻

从网页到PDF:高质量打印件生成全攻略与工具实践

从网页到PDF:高质量打印件生成全攻略与工具实践

1. 项目概述:从“网页打印件”到高效信息留存每次在网上冲浪,看到一篇干货满满的文章、一个设计精良的教程,或者一份重要的在线文档,你是不是都有一种冲动——把它“保存”下来?收藏夹固然方便,但总感觉不够…

2026/8/26 9:06:51 阅读更多 →
ESP32+HB100多普勒雷达测速系统:从原理到实战

ESP32+HB100多普勒雷达测速系统:从原理到实战

雷达测速这活儿,听着挺硬核,其实动手做起来比想象中接地气。我前后折腾了大半个月,从只知道“雷达测速是警察用的”到能自己搭一套实时监测路上车辆速度的小系统,中间踩了不少坑,也把原本模糊的原理彻底搞透了。这篇就…

2026/8/26 9:06:51 阅读更多 →
深入解析Cortex-M3调试系统:从硬件断点到性能追踪的实战指南

深入解析Cortex-M3调试系统:从硬件断点到性能追踪的实战指南

1. 项目概述:深入Cortex-M3调试系统如果你正在用STM32或者类似的Cortex-M3内核芯片做开发,大概率遇到过这样的场景:程序跑飞了,停在某个奇怪的地方,单步执行时变量值莫名其妙地变化,或者更糟,直…

2026/8/26 9:06:51 阅读更多 →
深入解析Xilinx 7A50T FPGA引脚功能:从电源架构到配置实战

深入解析Xilinx 7A50T FPGA引脚功能:从电源架构到配置实战

1. 项目概述:为什么需要深入理解7A50T的引脚?在硬件设计领域,尤其是FPGA(现场可编程门阵列)的应用中,芯片的引脚定义图(Pinout)和功能详解,其重要性不亚于建筑师手中的施…

2026/8/26 9:06:51 阅读更多 →
全开源H5十四合一代付系统源码解析与二次开发部署教程

全开源H5十四合一代付系统源码解析与二次开发部署教程

简介:代付系统作为平台批量打款的核心中间件,是电商结算、佣金发放、供应链付款等场景不可或缺的技术基础设施。它通过统一封装多个支付通道的接口抽象,解决异构上游协议差异,并借助订单状态机保障资金流转可靠性。一套全开源、可…

2026/8/26 9:06:51 阅读更多 →
AI驱动网络钓鱼攻击的防御策略:从技术原理到实战指南

AI驱动网络钓鱼攻击的防御策略:从技术原理到实战指南

1. 项目概述:当钓鱼攻击披上AI的“新衣” 最近几年,网络安全圈里一个老生常谈的话题——“网络钓鱼”,正在经历一场静默但深刻的“工业革命”。过去,我们识别钓鱼邮件,很大程度上依赖于一些“粗糙”的痕迹:…

2026/8/26 9:05:47 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →