Cesium快速入门到精通系列教程九:Cesium 中高效添加和管理图标/标记的标准方式​​

Cesium中通过 ​​Primitive 高效添加 ​​点、线、多边形、圆、椭圆、球、模型​​ 等地理要素,以下是各类地理要素的高效添加方式:

一、公告板

1. 创建 BillboardCollection 并添加到场景​

const billboards = viewer.scene.primitives.add(new Cesium.BillboardCollection());
  • ​​new Cesium.BillboardCollection()​​

创建一个新的 ​​公告板集合​​(BillboardCollection),用于管理多个公告板(Billboard)。

  • ​​viewer.scene.primitives.add(...)​​

将这个公告板集合添加到 Cesium 的 ​​场景(Scene)​​ 中,使其能够被渲染。

作用​​:
类似于创建一个“容器”,用于高效管理多个公告板(比如多个图标、标记点等),而不是单独添加每个公告板(单独添加会有更高的性能开销)。 

2. 向 BillboardCollection 添加一个公告板​ 

billboards.add({position: Cesium.Cartesian3.fromDegrees(113.3244, 23.1049, 600),image: '/Assets/nav.svg',width: 32,height: 32,scaleByDistance: new Cesium.NearFarScalar(1e3, 1.0, 2e6, 0.2)
});
  • ​​position: Cesium.Cartesian3.fromDegrees(113.3244, 23.1049, 600)​​

定义公告板的 ​​3D 坐标位置​​:

113.3244, 23.1049 是经纬度(WGS84 坐标系)。

600 是高度(单位:米),表示公告板在地球表面上方 600 米处。

  • ​​image: '/Assets/nav.svg'​​

公告板显示的 ​​图片路径​​(这里是 /Assets/nav.svg,可以是一个 SVG 或 PNG 图标)。

  • ​​width: 32, height: 32​​

公告板的 ​​尺寸​​(宽度和高度均为 32 像素)。

  • ​​scaleByDistance: new Cesium.NearFarScalar(1e3, 1.0, 2e6, 0.2)​​

​​视距缩放优化​​(根据相机距离动态调整公告板大小):

当相机距离 ​​1000 米(1e3)​​ 时,公告板显示原始大小(1.0 倍)。

当相机距离 ​​2000000 米(2e6)​​ 时,公告板缩小到 0.2 倍(避免远处图标过大)。

作用​​:
在指定位置(广州附近,高度 600 米)添加一个 ​​导航图标​​(nav.svg),并优化其显示大小(近大远小)。 

3、整体作用​​

这段代码的 ​​核心功能​​ 是:

  1. ​​创建一个公告板集合​​(BillboardCollection),用于高效管理多个公告板。
  2. ​​向集合中添加一个公告板​​,指定其:
  • ​​位置​​(经纬度 + 高度)。
  • ​​显示的图片​​(nav.svg)。
  • ​​尺寸​​(32x32 像素)。
  • ​​视距缩放优化​​(近大远小,避免远处图标过大)。

4、优化点​​

  • ​​使用 BillboardCollection 而不是单独添加 Billboard​​

批量管理多个公告板时,性能更高(减少 GPU 调用次数)。

  • ​​scaleByDistance 优化​​

避免远处图标过大,提升视觉效果。

  • ​​支持 3D 位置(含高度)​​

不仅能在地表放置图标,还能在 3D 空间(如空中)放置。

5、扩展用法​​

如果需要添加多个公告板,可以循环调用 billboards.add():

const positions = [{ lon: 113.3244, lat: 23.1049, height: 600 },{ lon: 113.3254, lat: 23.1059, height: 700 }
];
positions.forEach(pos => {billboards.add({position: Cesium.Cartesian3.fromDegrees(pos.lon, pos.lat, pos.height),image: '/Assets/nav.svg',width: 32,height: 32});
});

性能更好的方式:

const billboards = viewer.scene.primitives.add(new Cesium.BillboardCollection({scene: viewer.scene,debugShowBoundingVolume: false // 关闭调试框,提升性能[4](@ref)})
);const positions = [{ lon: 116.40, lat: 39.91, image: "icon1.png" },{ lon: 121.47, lat: 31.23, image: "icon2.png" }
];const billboardList = positions.map(pos => {return {image: pos.image,position: Cesium.Cartesian3.fromDegrees(pos.lon, pos.lat),scale: 0.8,color: Cesium.Color.WHITE.withAlpha(0.9),horizontalOrigin: Cesium.HorizontalOrigin.CENTER,verticalOrigin: Cesium.VerticalOrigin.BOTTOM};
});// 批量添加(减少渲染调用)
billboards.add(billboardList);

6、动态更新策略

直接修改属性

const billboard = billboards.get(0); // 获取第一个广告牌
billboard.scale = 1.2; // 修改缩放比例
billboard.position = Cesium.Cartesian3.fromDegrees(120.0, 30.0); // 更新位置

动态效果(旋转/闪烁)​​ 

// 通过 preRender 事件实现旋转动画[9](@ref)
viewer.scene.preRender.addEventListener(() => {const time = Date.now() * 0.001;billboard.rotation = time % (Math.PI * 2); // 持续旋转billboard.color.alpha = 0.5 + 0.5 * Math.sin(time); // 透明度闪烁
});

按需更新​​

// 仅当广告牌可见时更新
if (billboard.show) {billboard.scale = calculateScaleBasedOnDistance();
}

7、性能优化技巧

7.1 ​​GPU 合并渲染​​

    ​​批量添加​​:单次 billboards.add() 提交多个广告牌,触发 GPU 实例化渲染。

    ​​纹理复用​​:相同图片自动合并纹理,减少 Draw Call。

7.2 距离动态控制​​

billboard.scaleByDistance = new Cesium.NearFarScalar(1e3, 1.0, 1e5, 0.2);
billboard.translucencyByDistance = new Cesium.NearFarScalar(1e4, 1.0, 2e5, 0.1);

近距离正常显示,远距离缩小并渐隐,降低渲染负载。 

7.3 ​​视锥体裁剪​​

viewer.scene.frustumCulling = true; // 默认开启,自动剔除视野外广告牌

8、内存管理机制

8.1 移除单个广告牌​​

billboards.remove(billboard); // 移除指定对象

8.2 ​​批量清理​​

// 移除所有广告牌
billboards.removeAll();
// 或从场景中移除整个集合
viewer.scene.primitives.remove(billboards);

8.3 避免内存泄漏​​

// 销毁时释放资源
viewer.scene.primitives.destroyPrimitives = true;

9、总结​

代码部分作用
new Cesium.BillboardCollection()创建公告板集合(高效管理多个 Billboard)
viewer.scene.primitives.add(...)将集合添加到场景(使其可渲染)
billboards.add({...})添加一个公告板,指定位置、图片、尺寸和缩放优化

这段代码是 ​​Cesium 中高效添加和管理 3D 图标/标记的标准方式​​,适用于地图、仿真、游戏等场景。 

二、文本

使用 Primitive API

  // 初始化Viewerconst viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: Cesium.createWorldTerrain(),sceneMode: Cesium.SceneMode.SCENE3D});// 创建LabelCollection图元const labelCollection = viewer.scene.primitives.add(new Cesium.LabelCollection({show: true,// 启用深度测试避免被地形遮挡(需权衡性能)depthTest: false}));// 批量添加文本标签const positions = [{ lon: 116.404, lat: 39.915, text: "北京" },{ lon: 121.47, lat: 31.23, text: "上海" },// 更多位置数据...];positions.forEach(pos => {labelCollection.add({position: Cesium.Cartesian3.fromDegrees(pos.lon, pos.lat),text: pos.text,font: '14px sans-serif', // 字体优化:避免过大字号fillColor: Cesium.Color.WHITE,outlineColor: Cesium.Color.BLACK,outlineWidth: 2,// 垂直对齐:文本位于坐标点下方verticalOrigin: Cesium.VerticalOrigin.BOTTOM,// 像素偏移:微调位置pixelOffset: new Cesium.Cartesian2(0, -15)});});

三. 点(Point)​ 

使用 Primitive API(高性能,适合大量点)​

const pointPrimitiveCollection = viewer.scene.primitives.add(new Cesium.PointPrimitiveCollection());
pointPrimitiveCollection.add({position: Cesium.Cartesian3.fromDegrees(113.3244, 23.1049, 0),color: Cesium.Color.RED,pixelSize: 10
});

四、线(Polyline)​

使用 Primitive API(Primitive 方式需手动构建 Geometry)​

const polylineCollection = viewer.scene.primitives.add(new Cesium.PolylineCollection());
polylineCollection.add({positions: Cesium.Cartesian3.fromDegreesArray([113.3244, 23.1049,113.3254, 23.1059]),width: 2,material: new Cesium.ColorMaterialProperty(Cesium.Color.BLUE)
});

五、多边形(Polygon)​

使用 Primitive API(Primitive 方式需手动构建 Geometry)​

const polygonCollection = viewer.scene.primitives.add(new Cesium.PolygonCollection());
polygonCollection.add({hierarchy: Cesium.Cartesian3.fromDegreesArray([113.3244, 23.1049,113.3254, 23.1059,113.3264, 23.1039]),material: new Cesium.ColorMaterialProperty(Cesium.Color.GREEN.withAlpha(0.5))
});

六、圆(Circle)​

使用 Primitive API(需手动计算圆周点)​

// 初始化Cesium
const viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: Cesium.createWorldTerrain(),baseLayerPicker: false, // 禁用底图选择器geocoder: false, // 禁用地理编码器homeButton: false, // 禁用主页按钮infoBox: false, // 禁用信息框sceneModePicker: false, // 禁用场景模式选择器selectionIndicator: false, // 禁用选择指示器navigationHelpButton: false, // 禁用导航帮助按钮animation: false, // 禁用动画控件timeline: false, // 禁用时间轴fullscreenButton: false // 禁用全屏按钮
});// 定义圆的中心点和半径
const centerLon = 113.3244;
const centerLat = 23.1049;
const radiusInMeters = 1000;// 将圆心转换为 Cartesian3 坐标
const centerCartesian = Cesium.Cartesian3.fromDegrees(centerLon, centerLat);// 计算圆的 Cartesian3 点集(近似采样)
const granularity = Cesium.Math.RADIANS_PER_DEGREE; // 采样精度(弧度/度)
const positions = [];
for (let angle = 0; angle < 360; angle += granularity) {const radians = Cesium.Math.toRadians(angle);// 计算圆周上的点(基于球面坐标)const x = radiusInMeters * Math.cos(radians);const y = radiusInMeters * Math.sin(radians);// 将局部坐标转换为全局 Cartesian3const point = Cesium.Cartesian3.fromDegrees(centerLon + x / 111320, // 经度偏移(1度≈111320米)centerLat + y / (111320 * Math.cos(Cesium.Math.toRadians(centerLat))), // 纬度偏移(考虑纬度缩放)0 // 高度(与圆心相同));positions.push(point);
}// 闭合圆(首尾相连)
positions.push(positions[0]);// 使用 Primitive API 添加圆
const primitiveCollection = viewer.scene.primitives.add(new Cesium.PrimitiveCollection());
primitiveCollection.add(new Cesium.Primitive({geometryInstances: new Cesium.GeometryInstance({geometry: new Cesium.PolygonGeometry({polygonHierarchy: new Cesium.PolygonHierarchy(positions),perPositionHeight: false // 固定高度}),attributes: {color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE.withAlpha(0.5) // 半透明蓝色)}}),appearance: new Cesium.PerInstanceColorAppearance({outline: true,outlineColor: Cesium.Color.RED,outlineWidth: 2})})
);// 定位相机到圆的位置
viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 5000),orientation: {heading: Cesium.Math.toRadians(0),pitch: Cesium.Math.toRadians(-30)}
});

七、椭圆(Ellipse)​

使用 Primitive API(需手动计算椭圆点集)​

const viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: Cesium.createWorldTerrain(),baseLayerPicker: false, // 禁用底图选择器geocoder: false, // 禁用地理编码器homeButton: false, // 禁用主页按钮infoBox: false, // 禁用信息框sceneModePicker: false, // 禁用场景模式选择器selectionIndicator: false, // 禁用选择指示器navigationHelpButton: false, // 禁用导航帮助按钮animation: false, // 禁用动画控件timeline: false, // 禁用时间轴fullscreenButton: false // 禁用全屏按钮
});// 定义椭圆的中心点、半长轴、半短轴和旋转角度const centerLon = 113.3244;const centerLat = 23.1049;const semiMajorAxis = 2000; // 半长轴(米)const semiMinorAxis = 1000; // 半短轴(米)const rotation = Cesium.Math.toRadians(45); // 旋转角度(弧度)// 将椭圆中心转换为 Cartesian3 坐标const centerCartesian = Cesium.Cartesian3.fromDegrees(centerLon, centerLat);// 计算椭圆的 Cartesian3 点集(近似采样)const granularity = Cesium.Math.RADIANS_PER_DEGREE; // 采样精度(弧度/度)const positions = [];for (let angle = 0; angle < 360; angle += granularity) {const radians = Cesium.Math.toRadians(angle);// 计算椭圆上的点(基于参数方程)const x = semiMajorAxis * Math.cos(radians);const y = semiMinorAxis * Math.sin(radians);// 旋转椭圆const rotatedX = x * Math.cos(rotation) - y * Math.sin(rotation);const rotatedY = x * Math.sin(rotation) + y * Math.cos(rotation);// 将局部坐标转换为全局 Cartesian3const point = Cesium.Cartesian3.fromDegrees(centerLon + rotatedX / 111320, // 经度偏移(1度≈111320米)centerLat + rotatedY / (111320 * Math.cos(Cesium.Math.toRadians(centerLat))), // 纬度偏移(考虑纬度缩放)0 // 高度(与椭圆中心相同));positions.push(point);}// 闭合椭圆(首尾相连)positions.push(positions[0]);// 使用 Primitive API 添加椭圆const primitiveCollection = viewer.scene.primitives.add(new Cesium.PrimitiveCollection());primitiveCollection.add(new Cesium.Primitive({geometryInstances: new Cesium.GeometryInstance({geometry: new Cesium.PolygonGeometry({polygonHierarchy: new Cesium.PolygonHierarchy(positions),perPositionHeight: false // 固定高度}),attributes: {color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE.withAlpha(0.5) // 半透明蓝色)}}),appearance: new Cesium.PerInstanceColorAppearance({outline: true,outlineColor: Cesium.Color.RED,outlineWidth: 2})}));// 定位相机到椭圆位置viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 5000),orientation: {heading: Cesium.Math.toRadians(0),pitch: Cesium.Math.toRadians(-30)}});

八、球(Sphere)​

使用 Primitive API(Primitive 方式需手动构建 Geometry)​

const sphereCollection = viewer.scene.primitives.add(new Cesium.PrimitiveCollection());
sphereCollection.add(new Cesium.Primitive({geometryInstances: new Cesium.GeometryInstance({geometry: new Cesium.EllipsoidGeometry({vertexFormat: Cesium.VertexFormat.POSITION_AND_NORMAL,radii: new Cesium.Cartesian3(100, 100, 100)})}),appearance: new Cesium.PerInstanceColorAppearance()})
);

九、3D 模型(Model)​

使用 Primitive API(Primitive 方式需手动加载模型)​

性能优化建议​

场景推荐方式原因
​少量要素​Entity API代码简洁,开发效率高
​大量要素(>1000)​Primitive API性能更高,减少 CPU-GPU 通信开销
​动态更新(如轨迹动画)​Entity API支持更简单的属性动画
​自定义渲染(如特殊着色器)​Primitive API可深度定制渲染逻辑

总结​

要素类型推荐 API示例代码
​点​Entity 或 PointPrimitiveCollectionviewer.entities.add({ point: {...} })
​线​Entity 或 PolylineCollectionviewer.entities.add({ polyline: {...} })
​多边形​Entity 或 PolygonCollectionviewer.entities.add({ polygon: {...} })
​圆/椭圆​Entity API(更简单)viewer.entities.add({ circle: {...} })
​球​Entity API(更简单)viewer.entities.add({ ellipsoid: {...} })
​模型​Entity API(更简单)viewer.entities.add({ model: {...} })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

volka烹饪常用英语

1. 视频开场与主题介绍 Today, we are going to learn English while cooking. Fire. In this video, I’m going to continue to teach you the 3,000 most common English words that will allow you to understand 95% of spoken English. And we are going to be preparin…

同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——B

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24C64芯片&#xff1b; 适应于同旺科技 USB TO SPI / I2C适配器专业版&#xff1b; 烧写EEPROM数据、读取EEPROM数据、拷贝EEPROM数据、复制产品固件&#xff0c;一切将变得如此简单&#xff01; 1…

Linux下成功编译CPU版Caffe的保姆级教程(基于Anaconda Python3.8 包含完整可用Makefile.config文件)

目录 前言 一、环境准备 1. 系统要求 2. 安装必要依赖 二、Anaconda环境配置 1. 安装Anaconda 2. 创建专用Python环境 3. 安装必要的Python包 三、获取Caffe源代码 四、配置编译选项 1. 修改Makefile.config 2. 修改Makefile 3. 修改CMakeLists.txt&#xff08;如…

shell三剑客

了解三剑客 三剑客指的是: grep、sed和awk这三个在linux系统中常用的命令行工具 shell三剑客 grep&#xff1a; 主要用于查找和过滤特定文本 sed&#xff1a;是一个流编辑器&#xff0c;可以对文本进行增删改查 awk&#xff1a;是一个文本处理工具&#xff0c;适合对列进行处…

创客匠人视角:知识IP变现的主流模式与创新路径

知识IP变现赛道正从“野蛮生长”走向“精细化运营”&#xff0c;如何在流量红利消退期实现可持续变现&#xff1f;创客匠人基于服务数万职业教育IP的实践经验&#xff0c;总结出一套兼顾效率与长尾价值的变现逻辑&#xff0c;为行业提供了可参考的路径。 主流变现模式&#x…

【嵌入式人工智能产品开发实战】(二十三)—— 政安晨:将小智AI代码中的display与ota部分移除

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 本篇目标 第一步 ✅ 修改说明 &#x1f527; 修改后的代码节选 &#x1f4cc; 总…

从sdp开始到webrtc的通信过程

1. SDP 1.1 SDP的关键点 SDP&#xff08;Session Description Protocol&#xff09;通过分层、分类的属性字段&#xff0c;结构化描述实时通信会话的 会话基础、网络连接、媒体能力、安全策略、传输优化 等核心信息&#xff0c;每个模块承担特定功能&#xff1a; 1. 会话级别…

PHP、Apache环境中部署sqli-labs

初始化数据库的时候&#xff0c;连接不上 检查配置文件里面的数据库IP、用户名、密码是否正确 mysqli_connect函数报错 注意要下载兼容PHP7的sqli-labs版本 1、下载sqli-labs工程 从预习资料中下载。 文件名&#xff1a;sqli_labs_sqli-for7.zip 2、配置数据库 把下载好的…

Spring AI Alibaba Graph 实践

本文中将阐述下 AI 流程编排框架和 Spring AI Alibaba Graph 以及如何使用。 1. Agent 智能体 结合 Google 和 Authropic 对 Agent 的定义&#xff1a;Agent 的定义为&#xff1a;智能体&#xff08;Agent&#xff09;是能够独立运行&#xff0c;感知和理解现实世界并使用工具…

Server 11 ,⭐通过脚本在全新 Ubuntu 系统中安装 Nginx 环境,安装到指定目录( 脚本安装Nginx )

目录 前言 一、准备工作 1.1 系统要求 1.2 创建目录 1.3 创建粘贴 1.4 授权脚本 1.5 执行脚本 1.6 安装完成 二、实际部署 2.1 赋予权限 2.2 粘贴文件 2.3 重启服务 三、脚本解析 步骤 1: 安装编译依赖 步骤 2: 创建安装目录 步骤 3: 下载解压源码 步骤 4: 配置…

层压板选择、信号完整性和其他权衡

关于印刷电路材料&#xff0c;我有很多话要说&#xff0c;我觉得这非常有趣&#xff0c;而且所有候选人都带有“材料”这个词。无论出现在顶部的东西都是我最终选择的。我实际上会描述决策过程&#xff0c;因为我认为这很有趣&#xff0c;但首先要强调将我带到这里的职业旅程。…

几种经典排序算法的C++实现

以下是几种经典排序算法的C实现&#xff0c;包含冒泡排序、选择排序、插入排序、快速排序和归并排序&#xff1a; #include <iostream> #include <vector> using namespace std;// 1. 冒泡排序 void bubbleSort(vector<int>& arr) {int n arr.size();f…

[学习] 多项滤波器在信号插值和抽取中的应用:原理、实现与仿真(完整仿真代码)

多项滤波器在信号插值和抽取中的应用&#xff1a;原理、实现与仿真 文章目录 多项滤波器在信号插值和抽取中的应用&#xff1a;原理、实现与仿真引言 第一部分&#xff1a;原理详解1.1 信号插值中的原理1.2 信号抽取中的原理1.3 多项滤波器的通用原理 第二部分&#xff1a;实现…

Linux中source和bash的区别

在Linux中&#xff0c;source和bash&#xff08;或sh&#xff09;都是用于执行Shell脚本的命令&#xff0c;但它们在执行方式和作用域上有显著区别&#xff1a; 1. 执行方式 bash script.sh&#xff08;或sh script.sh&#xff09; 启动一个新的子Shell进程来执行脚本。脚本中的…

解决文明6 内存相关内容报错EXCEPTION_ACCESS_VIOLATION

我装了很多Mod&#xff0c;大约五六十个&#xff0c;经常出现内存读写异常的报错。为了这个问题&#xff0c;我非常痛苦&#xff0c;已经在全球各大论坛查询了好几周&#xff0c;终于在下方的steam评论区发现了靠谱的解答讨论区。 https://steamcommunity.com/app/289070/dis…

IIS 实现 HTTPS:OpenSSL证书生成与配置完整指南

参考 IIS7使用自签名证书搭建https站点(内网外网都可用) windows利用OpenSSL生成证书,并加入IIS 亲测有效 !!! IIS 配置自签名证书 参考:IIS7使用自签名证书搭建https站点(内网外网都可用) 亲测可行性,不成功。 IIS 配置OpenSSL 证书 √ OpenSSL 下载 https://slp…

Spark DAG、Stage 划分与 Task 调度底层原理深度剖析

Spark DAG、Stage 划分与 Task 调度底层原理深度剖析 核心知识点详解 1. DAG (Directed Acyclic Graph) 的构建过程回顾 Spark 应用程序的执行始于 RDD 的创建和一系列的转换操作 (Transformations)。这些转换操作&#xff08;如 map(), filter(), reduceByKey() 等&#xff…

关于阿里云-云消息队列MQTT的连接和使用,以及SpringBoot的集成使用

一、目的 本文主要记录物联网设备接入MQTT以及对接服务端SpringBoot整个的交互流程和使用。 二、概念 2.1什么是MQTT? MQTT是基于TCP/IP协议栈构建的异步通信消息协议&#xff0c;是一种轻量级的发布、订阅信息传输协议。可以在不可靠的网络环境中进行扩展&#xff0c;适用…

车载功能框架 --- 整车安全策略

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

HarmonyOS5 让 React Native 应用支持 HarmonyOS 分布式能力:跨设备组件开发指南

以下是 HarmonyOS 5 与 React Native 融合实现跨设备组件的完整开发指南&#xff0c;综合关键技术与实操步骤&#xff1a; 一、分布式能力核心架构 React Native JS 层 → Native 桥接层 → HarmonyOS 分布式能力层(JavaScript) (ArkTS封装) (设备发现/数据同步/硬件…