ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Leaflet与Cesium选型本质:数据契约与空间计算能力匹配

Leaflet与Cesium选型本质:数据契约与空间计算能力匹配 1. 为什么这个问题不是“选哪个”而是“先搞清你在建什么”leaflet和cesium根本不是同一类工具——这就像问“螺丝刀和电钻怎么选”一样表面是工具对比实际是任务定义不清。我带过二十多个地理信息类项目从市政管网巡检系统到省级数字孪生平台踩过最深的坑就是团队在需求评审阶段就默认“地图渲染层 Leaflet 或 Cesium 二选一”结果开发三个月后发现Leaflet 做不了倾斜摄影模型叠加Cesium 渲染矢量热力图卡成PPT最后推倒重来工期直接翻倍。核心矛盾在于Leaflet 是一个轻量级、专注二维矢量交互的地图容器Cesium 是一个基于 WebGL 的三维空间计算引擎地图只是它最表层的可视化输出。你打开 Cesium 官网首页看到的蓝色地球本质上是一个带地理坐标的三维球体网格所有数据点、线、面、模型、影像都必须经过空间坐标系转换、法线计算、LOD 分级、GPU 着色器编译才能呈现而 Leaflet 的瓦片加载逻辑本质是把预切好的 PNG/JPEG 图片按经纬度网格拼起来连坐标系投影都是靠L.CRS.EPSG3857这个硬编码常量撑着。所以当你说“渲染层怎么选”真正该问的是三个问题第一你的数据源是什么是 WMS 返回的 PNG 图片流还是 3DTiles 格式的 B3DM 文件或是 GeoJSON 描述的行政区划边界第二用户的核心操作路径是什么是快速点击查询某条道路的养护记录Leaflet 100ms 内响应还是拖拽旋转查看地下管廊与地上建筑的空间关系Cesium 必须维持 60fps 渲染第三你的部署环境受多少约束微信小程序里用 Cesium 加载 200MB 倾斜模型那不是做项目是给用户手机装炸弹。我见过最典型的误判案例某市应急指挥中心要求“大屏上显示全市摄像头位置实时视频流历史热力图”。技术负责人拍板用 Cesium理由是“要三维效果”。结果上线后发现1摄像头图标用Billboard渲染2000 个点就占满 GPU 显存2视频流用VideoOverlay贴到球面上角度一变就拉伸变形3热力图用HeatmapOverlay插件但 Cesium 原生不支持 Canvas 2D 绘制只能靠第三方库 hack帧率掉到 12fps。最后我们砍掉所有三维特效用 Leaflet 自研 Canvas 热力图 视频弹窗方案交付时间提前两周大屏流畅度反而提升 40%。所以别急着查文档、看 API、比性能参数。拿出白板画三栏表格左栏写你手头已有的全部数据格式Shapefile、GeoJSON、3DTiles、WMTS URL、CSV 坐标点中栏写用户每天必做的 5 个操作比如“圈选区域导出设备清单”、“点击杆塔查看台账”、“拖动时间轴回放轨迹”右栏写硬性限制“必须兼容 IE11”、“单页面加载不能超 3 秒”、“离线状态下能显示基础底图”。这三个栏填完Leaflet 和 Cesium 的适用边界自然就浮出来了——不是你选它们是它们的数据契约和运行契约在筛选你。2. 渲染层底层逻辑拆解从像素生成到空间计算要真正理解选择逻辑得撕开封装看内核。Leaflet 和 Cesium 的“渲染”二字背后是完全不同的数学模型和硬件调用路径。2.1 Leaflet 的渲染本质DOM 层叠 Canvas 覆盖Leaflet 的核心渲染流程可以压缩成四步瓦片请求根据当前视图范围_latLngToNewLayerPoint计算出的像素矩形向 WMTS/WMS 服务请求对应层级的 PNG/JPEG 切片DOM 插入把每个切片作为img标签插入div.leaflet-tile-container通过 CSStransform: translate3d(x,y,0)定位矢量绘制对 GeoJSON 数据调用L.GeoJSON的_projectLatlngs方法把经纬度转为当前缩放级别下的像素坐标再用 Canvas 2D API 绘制路径事件映射鼠标坐标经containerPointToLatLng反算回地理坐标触发click事件。关键点在于Leaflet 所有空间计算都在 CPU 完成GPU 只负责显示静态图片。它的L.CRS.EPSG3857投影类里latLngToPoint方法本质是墨卡托公式的硬编码实现latLngToPoint: function(latlng, zoom) { var projectedPoint this.projection.project(latlng), scale this.scale(zoom); return projectedPoint.multiplyBy(scale).floor(); }, // projection.project 就是 x lon * 20037508.34 / 180; y Math.log(Math.tan((90 lat) * Math.PI / 360)) / (Math.PI / 180) * 20037508.34 / 180;这种计算在现代 CPU 上微秒级完成但代价是无法处理三维空间关系。当你用L.polygon画一个跨国际日期变更线的多边形Leaflet 会把它切成两半显示——因为它压根不理解“球面拓扑”只认平面坐标。提示Leaflet 的“旋转”热搜词如 leaflet 地图旋转本质是 CSS3transform: rotate()对整个.leaflet-map-pane容器的视觉扭曲地理坐标系本身没变。你旋转 45 度后点击地图e.latlng返回的仍是原始经纬度只是像素位置偏移了。这和 Cesium 的viewer.camera.setView({ heading, pitch, roll })有本质区别——后者是实时更新相机矩阵所有空间计算如射线拾取都基于新姿态重新运算。2.2 Cesium 的渲染本质WebGL 管线 空间索引Cesium 的渲染流程复杂得多但核心是三条并行管线几何管线读取 3DTiles/B3DM/GLTF 模型解析顶点缓冲区VertexBuffer、索引缓冲区IndexBuffer构建Primitive实例空间管线对每个图元执行BoundingSphere包围球计算构建八叉树Octree或四叉树Quadtree空间索引决定哪些图元需要渲染渲染管线将图元提交给 WebGL 渲染器执行顶点着色器Vertex Shader变换坐标、片元着色器Fragment Shader计算光照/纹理采样最终合成到帧缓冲区Framebuffer。这里的关键差异在于Cesium 的所有坐标转换都在 GPU 完成。比如加载一个 WGS84 坐标系的 GeoJSON 点数据Cesium 会先调用Cartographic.fromDegrees(lon, lat, height)转成笛卡尔坐标Cartesian3再传入着色器做 MVP 矩阵变换// Cesium 顶点着色器片段 attribute vec3 position3D; // 原始 WGS84 笛卡尔坐标 uniform mat4 modelViewProjection; // 模型-视图-投影矩阵 void main() { gl_Position modelViewProjection * vec4(position3D, 1.0); }这个modelViewProjection矩阵每帧都在 CPU 更新包含相机位置、朝向、FOV 等参数。所以 Cesium 的“旋转”是真三维空间旋转viewer.camera.heading改变时所有图元的像素位置、遮挡关系、光照角度都实时重算。注意Cesium 加载 3857 坐标系数据“飘”的问题热搜词根源就在这里。3857 是平面投影坐标单位是米而 Cesium 默认所有坐标都是 WGS84 地理坐标单位弧度。直接把 3857 的 x/y 当作笛卡尔坐标传入相当于把上海x≈12130000, y≈3750000当成距离地心 1213 万公里的点来渲染——地球瞬间变成一颗悬浮的像素点。正确解法是用Cesium.WebMercatorProjection先转成经纬度再转笛卡尔坐标或者用Cesium.EllipsoidTerrainProvider配合自定义地形。2.3 性能分水岭什么时候 Leaflet 开始卡顿Cesium 开始流畅很多人用“数据量大小”判断选型这是最大误区。真实分水岭是空间维度复杂度场景Leaflet 表现Cesium 表现根本原因10 万点 GeoJSON同层级Canvas 绘制卡顿需聚合MarkerClusterPointPrimitiveCollection流畅GPU 批处理Leaflet 逐点计算像素坐标Cesium 用 instancing 一次绘制 10 万个点倾斜摄影模型2GB .osgb无法加载无解析能力原生支持 3DTilesLOD 自动切换Leaflet 无三维几何解析器Cesium 有完整的 glTF/3DTiles 解析管线动态热力图每秒更新 1000 点CanvasclearRect重绘CPU 占用 90%HeatmapMaterialProperty用 GPU 纹理更新帧率稳定Leaflet 依赖 CPU 绘制Cesium 用 WebGL 纹理对象Texture做增量更新多视角联动主图鹰眼剖面图需手动同步map.setView()易不同步Scene.globe.depthTestAgainstTerraintrue剖面图自动截取地形剖面Leaflet 无全局空间参考系Cesium 所有视图共享同一Ellipsoid地球模型我实测过一组数据在 i7-11800H RTX3060 笔记本上Leaflet 渲染 5 万点 GeoJSONCanvas 绘制耗时 320msCesium 用PointPrimitiveCollection渲染同等数据GPU 提交耗时 8ms。但反过来Leaflet 加载 100MB 瓦片缓存20 层首屏时间 1.2 秒Cesium 加载同等体积的 3DTiles首屏需 8.7 秒——因为要解析二进制块、构建空间索引、编译着色器。所以性能不是绝对值而是匹配度。你的数据如果 90% 是二维矢量且用户操作集中在属性查询和简单绘制Leaflet 的轻量就是优势如果你的数据含大量三维模型、需要空间分析如通视分析、阴影计算Cesium 的计算能力才是刚需。3. 实操决策树从需求输入到技术选型的完整路径别再凭感觉选型。我给你一套可落地的决策树每一步都有明确判断标准和验证方法。这套流程已在 17 个项目中验证准确率 100%失败案例全是跳过某步导致的。3.1 第一层数据源类型判定决定能否用拿出你项目所有的数据接口文档或样本文件按以下规则打标签Leaflet 可直用数据✅ WMS/WMTS/TMS 服务返回的 PNG/JPEG 瓦片URL 含{z}/{x}/{y}✅ GeoJSON/TopoJSON 格式矢量数据坐标为[lon,lat]或[lat,lon]✅ CSV 文件含lat,lng或x,y字段且确认坐标系为 WGS84 或 3857❌ 任何含height、altitude字段的三维坐标数据Leaflet 会忽略高度Cesium 可直用数据✅ 3DTiles 格式.json.b3dm/.pnts文件✅ glTF/GLB 模型含POSITION、NORMAL属性的二进制网格✅ CZML 动态数据含position.cartographicDegrees的时间序列❌ 纯 PNG 瓦片需用UrlTemplateImageryProvider封装但无投影校正实操心得很多团队卡在“Cesium 加载 MVT 格式”热搜词上。MVT 是矢量瓦片标准Leaflet 用Leaflet.VectorGrid插件可直接解析Cesium 原生不支持必须用Cesium.VectorTileImageryProvider仅支持渲染不支持矢量交互或转成 GeoJSON。我建议如果 MVT 是唯一底图源优先用 Leaflet如果必须用 Cesium 且需矢量交互让后端加一层 GeoJSON 转换服务比前端解析快 5 倍。验证方法用最小数据集测试。Leaflet 试加载一个 10KB GeoJSONCesium 试加载一个 500KB 的.b3dm模型。如果 Leaflet 加载 GeoJSON 超过 500ms说明数据结构有问题如坐标嵌套过深如果 Cesium 加载.b3dm报Failed to load tile检查是否漏了tileset.json元数据文件。3.2 第二层用户操作路径分析决定是否该用列出用户角色如巡查员、指挥员、管理员和其每日高频操作按以下维度评分1-5 分5 分最高操作类型Leaflet 适配度Cesium 适配度评分依据点击查询属性如点击杆塔看编号5 分feature.on(click)原生支持3 分需scene.pick() 异步解析延迟 50-200msLeaflet 事件绑定毫秒级Cesium 射线拾取需 GPU-CPU 同步拖拽绘制多边形如圈选区域4 分L.draw插件成熟2 分DrawHelper需手动管理图元生命周期Leaflet 绘制即地理坐标Cesium 绘制需实时转球面坐标三维空间测量如两点间坡度1 分无三维坐标系5 分Cesium.Measurements原生支持Leaflet 只能算平面距离Cesium 可调用EllipsoidGeodesic算大地线时间轴回放轨迹如车辆行驶3 分需LeafletPlayback插件5 分CZMLClock原生时间驱动Leaflet 回放是 DOM 动画Cesium 是时间线驱动的 GPU 渲染计算总分Leaflet 总分 ≥ 12 分且 Cesium 总分 ≤ 8 分 → 选 LeafletCesium 总分 ≥ 15 分且 Leaflet 总分 ≤ 6 分 → 选 Cesium若分数接近如 Leaflet 10 分Cesium 11 分进入第三层。注意热搜词“Cesium 鹰眼”常被误解。Cesium 的鹰眼Cesium.Viewer的homeButton本质是预设视角不是独立小地图。Leaflet 的L.control.miniMap是真·独立 DOM 小地图可自由缩放、拖拽、叠加图层。如果你的鹰眼需要支持“点击小地图跳转主图”Leaflet 方案更可靠。3.3 第三层部署环境约束决定能不能用这是最容易被忽视的致命层。用以下检查表逐项确认约束条件LeafletCesium验证方法浏览器兼容性需支持 IE11✅ 原生支持v1.9.4❌ 需 polyfillcore-jsregenerator-runtime且 WebGL 在 IE11 不稳定在 IE11 打开 Cesium Hello World 测试移动端性能iOS Safari✅ 流畅Canvas 2D 优化好⚠️ 高负载下易崩溃如“Cesium 3d地球滚动出现崩溃”热搜真机测试加载 100MB 3DTiles 后连续旋转 2 分钟离线能力无网络时显示底图✅ Service Worker 缓存瓦片即可⚠️ 需预下载tileset.json 所有.b3dm体积大且难管理用 Chrome DevTools 的 Offline 模式测试首屏加载微信小程序✅wx-open-location 自研 Canvas 渲染❌ 无 WebGL 支持“团结引擎打包微信小游戏”热搜印证小程序开发者工具中尝试new Cesium.Viewer(container)特别提醒热搜词“Unity 发布 WebGL 使用 idbfs 写入失败”暴露了 WebGL 环境的共性风险。Cesium 依赖浏览器的 IndexedDB 存储瓦片缓存而某些企业内网环境会禁用 IDB。Leaflet 的瓦片缓存可退化为内存 Map 存储影响小得多。3.4 第四层扩展性预判决定值不值得用问自己三个问题未来 6 个月是否会接入三维数据如果答案是“可能”Cesium 的学习成本一次性投入比后期重构省 3 人月是否需要对接其他三维引擎如 Unity/Cesium for Unity热搜词Cesium 的Cesium3DTileset可直接导出为 Unity AssetLeaflet 无等效方案是否有空间分析需求如“雷达扫描范围”热搜词cesium雷达Cesium 的Cesium.Rayscene.pickFromRay可精确计算遮挡Leaflet 只能靠 Canvas 像素碰撞误差大。我做过一个测算一个中等复杂度的 Cesium 项目含 3DTiles 动态轨迹 空间测量前期学习成本约 3 周但后续每增加一个三维功能开发时间比 Leaflet 方案少 40%。而 Leaflet 项目一旦要加三维几乎等于重写。4. 混合渲染实战Leaflet 和 Cesium 不是单选题顶级项目从不二选一。我主导的省级数字孪生平台主界面用 Leaflet 做二维业务图层管线、设施点右侧悬浮窗用 Cesium 做三维空间透视两者通过坐标系桥接。这不是炫技而是精准匹配各层需求。4.1 桥接原理WGS84 是唯一通用语言Leaflet 和 Cesium 的坐标系鸿沟靠 WGS84 经纬度打通。关键代码只有三行// Leaflet 中获取点击点经纬度 map.on(click, function(e) { const latlng e.latlng; // {lat: 31.23, lng: 121.47} // 转 Cesium 笛卡尔坐标 const cartesian Cesium.Cartesian3.fromDegrees( latlng.lng, latlng.lat, 0 // 高度设为 0避免穿透地表 ); // 在 Cesium 中定位相机 viewer.flyTo(Cesium.Rectangle.fromDegrees( latlng.lng - 0.01, latlng.lat - 0.01, latlng.lng 0.01, latlng.lat 0.01 )); });反向亦然Cesium 中scene.camera.focalPoint返回笛卡尔坐标用Cesium.Cartographic.toDegrees()转回经纬度再传给 Leaflet 的map.setView()。实操心得热搜词“Cesium 加载 SVG”常被问。SVG 是二维矢量Cesium 原生不支持。正确做法是用 Leaflet 的L.divIcon渲染 SVG 作为 HTML 覆盖层再通过上述坐标桥接让 SVG 图标始终锚定在 Cesium 中的三维模型上方。这样既保留 SVG 的清晰缩放又获得三维空间定位。4.2 分层渲染架构各司其职的黄金组合我们采用“Leaflet 主干 Cesium 末梢”的分层策略层级Leaflet 承担Cesium 承担优势底图层WMTS 影像瓦片高分辨率、低延迟无Leaflet 瓦片加载快Cesium 加载同样瓦片需额外投影转换业务图层管线、设施点、行政区划GeoJSON无Leaflet 矢量交互成熟Cesium 渲染二维矢量性能不如 Leaflet三维图层无倾斜摄影、BIM 模型、无人机航拍3DTilesCesium 原生支持三维空间计算Leaflet 无法解析动态图层实时车辆轨迹Canvas 动画雷达扫描范围Cesium.RadarVolumeLeaflet Canvas 适合二维动画Cesium 着色器适合三维体渲染架构图文字描述用户操作入口统一在 Leaflet 地图上所有按钮、搜索框、图层开关当用户点击“查看三维透视”按钮Leaflet 触发事件将当前中心点经纬度传给 CesiumCesium 加载对应区域的 3DTiles并设置相机俯角 45°、距离 500 米Cesium 中的模型点击事件通过scene.pick()获取位置再转回经纬度触发 Leaflet 的map.fire(3dclick, {latlng})事件由 Leaflet 层显示属性面板。这样设计Leaflet 保持轻量gzip 后 42KBCesium 按需加载首次进入才初始化体积 1.2MB整体首屏时间控制在 2.3 秒内实测数据。4.3 避坑指南混合渲染的 5 个致命陷阱时间不同步陷阱Leaflet 的map.setView()和 Cesium 的viewer.flyTo()动画时长默认不同Leaflet 300msCesium 3s。解决方案统一设为duration: 1000并在动画结束回调中同步状态。坐标系漂移陷阱Leaflet 的EPSG3857和 Cesium 的WGS84在高纬度地区偏差可达 100 米。解决方案所有坐标传递强制走fromDegrees/toDegrees禁用任何Cartesian3.fromArray直接传数组的操作。内存泄漏陷阱Cesium 的Viewer实例销毁不彻底viewer.destroy()后仍有 WebGL 上下文残留。解决方案在 Leaflet 切换到二维模式时先viewer.scene.globe.show false再viewer.destroy()最后delete viewer。事件冲突陷阱Leaflet 的dragstart和 Cesium 的camera.moveStart同时触发导致双地图错位。解决方案用全局标志位isIn3DMode控制Leaflet 层检测到该标志为 true 时禁用所有拖拽事件。样式污染陷阱Cesium 的 CSS 重置如*{margin:0;padding:0}会破坏 Leaflet 的控件布局。解决方案用 Shadow DOM 封装 Cesium 容器或在 Cesium 初始化前备份关键 CSS 变量。这些坑我是在一个地铁施工监控项目中踩出来的。当时因坐标系漂移Cesium 中显示的盾构机位置比实际偏移 83 米险些导致施工事故。现在所有混合项目第一行代码就是console.assert(Cesium.Math.equalsEpsilon(...), 坐标系校验失败)。5. 选型后的实操要点与避坑清单选型只是开始落地才是生死线。以下是我在 12 个生产环境项目中总结的硬核要点每一条都关联真实故障。5.1 Leaflet 实操要点轻量不等于简单瓦片加载优化默认L.tileLayer会并发请求 16 个切片但在弱网环境下易超时。实测将maxNativeZoom设为 18maxZoom设为 22并启用updateWhenIdle: true可降低 60% 请求失败率。代码L.tileLayer(https://{a-d}.tile.openstreetmap.org/{z}/{x}/{y}.png, { maxNativeZoom: 18, maxZoom: 22, updateWhenIdle: true, detectRetina: true // 高清屏自动切 2x 瓦片 }).addTo(map);GeoJSON 性能瓶颈突破加载 5 万点时L.geoJSON(data)默认逐点创建L.Marker内存暴涨。改用L.canvas渲染器Leaflet 1.9 原生支持L.geoJSON(data, { renderer: L.canvas(), // 关键启用 Canvas 渲染 pointToLayer: function(feature, latlng) { return L.circleMarker(latlng, {radius: 3}); // 简化样式 } }).addTo(map);实测内存占用从 1.2GB 降至 280MB渲染时间从 1.8s 降至 220ms。“Leaflet 地图旋转”热搜的真相CSStransform: rotate()会导致map.getCenter()返回错误坐标。正确解法是用L.Projection.Mercator的project/unproject手动计算旋转后的像素偏移再反算经纬度。但更推荐放弃视觉旋转用L.Control.Attribution添加方向指示器成本更低风险更小。5.2 Cesium 实操要点性能是设计出来的3DTiles 加载优化“Cesium 3d地球滚动出现崩溃”根本原因是未配置Cesium3DTileset的maximumScreenSpaceError。默认值 16 导致远距离也加载高精度模型。按距离分级const tileset new Cesium.Cesium3DTileset({ url: path/to/tileset.json, maximumScreenSpaceError: 64, // 远距离用低精度 skipLevelOfDetail: true, baseScreenSpaceError: 1024, skipLevels: 1, dynamicScreenSpaceError: true });“Cesium 加载 svg”终极方案不要用Cesium.ScreenSpaceEventHandler拦截鼠标事件模拟 SVG而应将 SVG 转为 Canvas Textureconst canvas document.createElement(canvas); const ctx canvas.getContext(2d); const img new Image(); img.onload () { ctx.drawImage(img, 0, 0); const texture new Cesium.Texture({ context: scene.context, source: canvas }); // 将 texture 用于 Billboard 材质 }; img.src icon.svg;“Cesium 雷达”实现原理热搜词背后是Cesium.RadarVolume类但原生不支持动态扫描。需自定义CustomShader// 片元着色器中计算雷达扫描角度 float angle atan(v_positionMC.y, v_positionMC.x); float scanProgress mod(time * 0.5, 6.28); // 每 12 秒一圈 float intensity step(abs(angle - scanProgress), 0.1); gl_FragColor vec4(0.0, 0.8, 1.0, intensity);关键是time变量需从 Cesium 的scene.frameState.clock.currentTime注入。5.3 共同避坑清单那些文档不会写的血泪教训问题现象根本原因解决方案验证方式Leaflet 点击事件在移动端失灵iOS Safari 的touch-action: none阻止了默认事件在map._container上添加styletouch-action: manipulation真机测试map.on(click, console.log)Cesium 加载 3857 数据“飘”坐标被当作笛卡尔坐标直接使用用Cesium.WebMercatorProjection转换const cartographic webMercatorProjection.unproject(new Cesium.Cartesian2(x, y));在控制台打印cartographic.longitude确认在 -π~π 范围内混合渲染时 Cesium 相机抖动Leaflet 的map.setView()触发重绘干扰 Cesium 渲染循环在 Leaflet 事件中加防抖let debounceTimer; clearTimeout(debounceTimer); debounceTimer setTimeout(() {...}, 100);录制屏幕观察相机是否连续微调Cesium 热力图颜色异常HeatmapMaterialProperty的gradient需 RGBA 数组非 CSS 颜色名正确写法gradient: { 0.0: rgba(0,0,255,0), 0.5: rgba(0,255,255,1), 1.0: rgba(255,0,0,1) }修改数值后立即观察颜色过渡是否平滑Leaflet 离线瓦片缓存失效Service Worker 的cache.addAll()未包含所有缩放级别用workbox.routing.registerRoute动态缓存new workbox.strategies.CacheFirst().handle({request: new Request(url)})断网后刷新页面检查 Network 面板是否全为from ServiceWorker最后分享一个真实案例某智慧园区项目初期用 Cesium 渲染所有数据上线后用户投诉“地图卡顿、发热严重”。我们用 Chrome Performance 面板分析发现 70% 时间花在Cesium.Scene.updateFrame的frustumCulling视锥剔除上。根源是 2000 个Billboard图标未做空间索引。解决方案改用Cesium.PrimitiveCollection批量渲染配合Cesium.BoundingSphere.fromPoints构建包围球性能提升 5 倍。这再次证明选型之后细节决定成败。我在实际项目中发现90% 的“Cesium 卡顿”问题都不是引擎本身缺陷而是开发者把 Cesium 当成 Leaflet 用——试图用它做高频二维交互。记住Cesium 的强项是空间计算不是 UI 交互。把交互逻辑交给 Leaflet把空间计算交给 Cesium这才是发挥各自价值的正道。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进