news 2026/6/12 20:07:23

网页版三维空间测距测面工具:CesiumJS实现,开箱即用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网页版三维空间测距测面工具:CesiumJS实现,开箱即用

本文还有配套的精品资源,点击获取

简介:直接打开index.html就能用的三维测量小工具,基于CesiumJS构建,支持在浏览器里实时量算地表两点间直线距离、折线路径长度,以及任意多边形区域的地理面积。所有功能封装在独立的measure模块中,交互操作简单——点击开始、移动添加点、双击结束,结果即时显示在右上角。底层调用Cesium官方库处理三维球面坐标,结合Turf.js做WGS84坐标系下的高精度空间计算,确保山地、曲面等复杂地形下的面积估算准确可靠。lib目录已预置Cesium和Turf依赖,turf子目录专用于地理分析运算,无需npm安装或webpack打包,也不依赖后端服务。适合快速集成到WebGIS系统、数字孪生平台或三维项目原型中,常见于地质调查、国土规划、基建勘测等需要现场空间量算的前端开发环节。

1. 项目概述:为什么一个“点开即用”的三维测量工具值得单独拎出来讲?

你有没有遇到过这样的场景:在做地质勘查外业汇报时,领导指着三维地形模型问:“这个滑坡体大概多大?从A点到B点的直线距离是多少?”——你手忙脚乱切窗口、找插件、等加载、调坐标系,最后报出个带两位小数但自己心里都没底的数字;又或者在城市更新项目评审会上,规划师临时想比对两个地块的三维投影面积,而你正在调试的WebGIS系统还没接入测量模块,只能尴尬地说“稍后导出再算”……这些不是边缘需求,而是三维空间可视化落地过程中每天都在发生的“最后一公里”卡点。

我做WebGIS前端开发八年,参与过十几个省级实景三维平台和数字孪生项目,发现一个反直觉的事实:最常被临时调用、最影响现场沟通效率的功能,往往不是炫酷的光照渲染或粒子特效,而是最朴素的“量一量”。但市面上要么是Cesium官方Sandcastle里藏得深、改起来费劲的示例代码,要么是封装过度、强依赖Vue/React生态、动辄要npm install + vite build的“工程化方案”,真正能塞进一个U盘、发给野外队员、双击index.html就立刻干活的轻量工具,几乎找不到现成可用的。

这个“网页版三维空间测距测面工具”就是为解决这个问题而生的。它不追求框架兼容性,不堆砌配置项,不做后台服务,甚至不碰Node.js——整个包解压后只有23MB,核心逻辑压缩在不到400行JavaScript里,所有交互遵循“三步法则”:点击启动 → 移动添加点 → 双击结束。结果实时显示在右上角浮动面板,单位自动适配(米/千米/平方米/平方公里),山地地形下面积误差控制在0.3%以内(实测某海拔3800米高原滑坡体,Turf.js球面算法 vs 专业GIS软件结果偏差仅127㎡)。它不是玩具,而是我在西藏那曲某矿权核查项目中,连续三个月每天用它校验无人机倾斜摄影建模成果的真实工作流沉淀。关键词里的“Cesium测距”“Cesium测面”不是功能标签,而是它每天被调用的两种具体动作;“三维测量工具”这六个字背后,是WGS84椭球体上每一度经度对应的弧长动态计算、是Cesium.Entity与Turf.polygon的坐标系桥接、是浏览器内存里实时维护的折线顶点链表——这些细节,接下来我会一层层拆给你看。

2. 整体设计思路与架构选型:为什么放弃“标准工程化”,选择“裸奔式集成”

2.1 核心矛盾:精度、速度、易用性,必须砍掉一个?

三维空间测量看似简单,实则横跨三个技术断层:
-坐标系断层:CesiumJS内部使用笛卡尔坐标(Cartesian3)进行GPU渲染,但用户需要的是WGS84经纬度下的地理距离与面积;
-几何模型断层:地球是椭球体,平面几何库(如普通多边形面积公式)在>1km²区域会产生显著误差,必须用球面/椭球面算法;
-交互体验断层:野外作业时屏幕可能反光、手套操作不精准、网络不稳定,要求操作路径极短、反馈即时、失败可秒退。

常规方案通常选择牺牲某一项:
- 用Leaflet+3D插件?精度不够,无法处理高程变化;
- 用Cesium官方MeasureWidget?深度耦合Sandcastle沙盒,剥离困难,且不支持自定义UI;
- 用Three.js自研?开发周期长,球面计算需重写Turf核心算法,团队没这个人力。

我们最终选择“裸奔式集成”,本质是把三个断层全部显性化、模块化,用最小耦合代价打通。整个架构只有三层:
1.视图层(Cesium Viewer):负责三维场景渲染、相机控制、拾取交互;
2.测量逻辑层(measure模块):独立JS文件,不依赖任何框架,只接收Cesium实例和坐标事件;
3.地理计算层(Turf.js):专注WGS84坐标系下的空间分析,与Cesium解耦,通过坐标转换桥接。

提示:这里刻意避开Webpack/Vite等构建工具,是因为野外项目常需离线部署——某次在云南哀牢山基站施工,现场只有4G热点且信号时断时续,工程师直接把index.html拷贝到平板电脑Chrome里打开就能用,而基于Vite的版本因缺少dev-server会报跨域错误。这种“物理级离线能力”是工程化方案永远无法提供的。

2.2 为什么是CesiumJS + Turf.js这个组合?

单看技术栈,CesiumJS和Turf.js都是成熟库,但它们的结合点常被误解。很多人以为“Turf.js能算面积,Cesium能画三维,拼一起就行”,实际踩坑后才发现:Turf.js默认处理的是平面坐标(EPSG:3857),而Cesium的WGS84坐标(EPSG:4326)直接喂给Turf会得出荒谬结果。比如在青藏高原某地,用平面公式算10km²区域面积,误差高达23%,因为没考虑地球曲率。

本工具的关键突破在于:所有坐标在进入Turf前,强制走Cesium的EllipsoidGeodesy路径。具体流程如下:
- 用户点击地面生成Cartesian3坐标 → 转为Cartographic(经度、纬度、高度)→ 提取经纬度数组;
- 将经纬度数组传入Turf,但不直接调用turf.area(),而是先用turf.transformScale()做球面投影预处理,再调用turf.polygon()构建地理多边形;
- 面积计算使用turf.area()options.units = 'meters'参数,该参数底层调用的是Turf内置的Vincenty椭球算法,而非默认的平面三角剖分。

实测对比数据(同一高原滑坡体):
| 方法 | 计算结果 | 相对误差 | 适用场景 |
|--------|-----------|------------|-------------|
| 平面坐标直接计算 | 1,248,932㎡ | +22.7% | 城市中心<1km²平坦区域 |
| Cesium原生surfaceArea(仅支持矩形) | 1,018,543㎡ | -0.3% | 官方API限制多,不支持任意多边形 |
| 本工具(Turf+Vincenty) | 1,021,678㎡ | ±0.0%(与ArcGIS Pro一致) | 全地形通用 |

注意:lib目录下的turf子目录并非完整Turf包,而是用Rollup按需打包的精简版(仅含@turf/area@turf/length@turf/helpers@turf/invariant四个模块),体积从1.2MB压缩至218KB。这是为了解决Cesium加载时Turf全局污染导致的Cesium.Cartesian3 is not a constructor报错——后者源于Turf某些模块会重写Array原型,与Cesium的类型检测冲突。

2.3 “开箱即用”的物理实现:如何让index.html真正零配置运行?

所谓“开箱即用”,不是一句宣传语,而是对每个文件角色的极致明确:
-index.html:唯一入口,内联CSS(避免外部样式加载失败)、异步加载JS(防止阻塞渲染)、硬编码CDN回退机制;
-lib/Cesium/:存放Cesium 1.105版本(2023年稳定版),剔除Apps/Builds/冗余目录,仅保留Build/Cesium/核心文件;
-lib/turf/:前述精简版Turf,已预编译为UMD格式,可直接<script>引入;
-measure/:核心逻辑,包含measure.js(主模块)和measure.css(浮动面板样式),无任何构建依赖。

关键细节在于资源加载策略:

<!-- index.html 片段 --> <script> // 检测本地Cesium是否存在,不存在则自动切换CDN const cesiumPath = './lib/Cesium/Build/Cesium/Cesium.js'; fetch(cesiumPath).catch(() => { document.write('<script src="https://cesium.com/downloads/cesiumjs/releases/1.105/Build/Cesium/Cesium.js"><\/script>'); }); </script>

这段代码确保即使用户误删lib/Cesium目录,工具仍可通过CDN降级运行(虽慢但可用)。而Turf的加载更激进——直接内联在measure.js顶部:

// measure.js 开头 const turf = (function(){/* 精简版Turf源码,约1800行 */})();

这样做的代价是measure.js体积增至247KB,但换来的是绝对的加载可靠性:没有网络、没有CDN、没有CORS,只要浏览器能解析HTML,测量功能就一定能启动。

3. 核心模块解析:measure.js如何把“点击-移动-双击”变成可信数据

3.1 交互状态机设计:为什么不用监听器堆砌,而用有限状态机?

初版实现曾用viewer.screenSpaceEventHandler.setInputAction绑定一堆事件监听器,结果在高原强光屏上频繁触发误操作:手指悬停0.3秒就被识别为“长按”,导致测量意外终止。后来重构为四状态有限状态机(FSM),彻底解决稳定性问题:

状态触发条件行为退出条件
IDLE(空闲)页面加载完成显示“点击开始测量”提示用户左键单击地面
MEASURING_DISTANCE(测距中)左键单击地面创建起点Entity,监听鼠标移动用户再次左键单击(添加折线点)或双击(结束)
MEASURING_AREA(测面中)右键单击地面创建首顶点,进入多边形绘制模式用户双击(闭合多边形)或ESC键(取消)
RESULT_SHOWING(结果展示)测量完成锁定相机、高亮测量图形、显示浮动面板用户点击面板“清除”按钮或按C键

状态切换全部由setState(newState)统一管理,杜绝了监听器嵌套导致的内存泄漏。例如,从MEASURING_DISTANCE切换到RESULT_SHOWING时,自动执行:
- 清除所有screenSpaceEventHandler监听;
- 将当前折线Entity的polyline.material设为高亮黄色;
- 启动requestAnimationFrame循环,实时更新面板中的动态长度值(当用户拖拽相机时,长度随视角变化而重算)。

实操心得:状态机最大的好处是“可预测性”。某次在甘肃风电场项目中,客户要求增加“测量中暂停”功能,只需新增PAUSED状态及对应按键映射(空格键),其他状态逻辑完全不动。而旧版监听器方案需要修改7处事件绑定,极易遗漏。

3.2 坐标转换链:从屏幕像素到平方米的七步推演

用户看到的只是“点一下、再点一下”,背后是七步精密坐标转换:

Step 1:屏幕坐标 → 窗口坐标

const pickPosition = viewer.scene.pickPosition(movement.position); // movement.position 是ScreenSpaceEventHandler传入的Cartesian2坐标

Step 2:窗口坐标 → 三维笛卡尔坐标(Cartesian3)
Cesium的pickPosition返回的是世界坐标系下的Cartesian3,但存在精度陷阱:当相机离地过高(>10km)时,该方法可能返回undefined(因射线未击中地形)。此时启用降级方案:

if (!pickPosition) { // 用viewer.camera.getPickRay()手动发射射线 const ray = viewer.camera.getPickRay(movement.position); const intersection = Cesium.IntersectionTests.rayPlane(ray, Cesium.Plane.fromPointNormal(Cesium.Cartesian3.ZERO, Cesium.Cartesian3.UNIT_Z)); pickPosition = Cesium.Ray.getPoint(ray, Cesium.Cartesian3.magnitude(intersection)); }

Step 3:Cartesian3 → 地理坐标(Cartographic)

const carto = Cesium.Cartographic.fromCartesian(pickPosition); const lon = Cesium.Math.toDegrees(carto.longitude); // 经度转度 const lat = Cesium.Math.toDegrees(carto.latitude); // 纬度转度

Step 4:地理坐标 → WGS84经纬度数组
此处关键:必须保留原始经纬度,禁止四舍五入。曾有版本为节省内存将经纬度保留6位小数,结果在赤道附近1°经度≈111km,6位小数精度仅0.11m,导致面积计算偏差超5%。现改为全程使用JavaScript原生Number精度(15位有效数字)。

Step 5:经纬度数组 → Turf地理多边形

const turfPolygon = turf.polygon([[ [lon1, lat1], [lon2, lat2], ..., [lon1, lat1] // 首尾闭合 ]], { units: 'meters' });

Step 6:Turf面积计算 → 椭球面修正
Turf的area()默认使用球面模型(Earth radius=6371km),但WGS84是椭球体。本工具通过预设options强制启用椭球计算:

const area = turf.area(turfPolygon, { units: 'meters', properties: { // Turf 6.x+ 支持椭球参数注入 ellipsoid: 'WGS84' } });

Step 7:面积数值 → 用户友好显示
根据结果自动选择单位:
- <100㎡ → 平方米(保留1位小数);
- 100–10,000㎡ → 平方米(整数);
- >10,000㎡ → 平方公里(保留3位小数);
- 同时显示“约XX亩”(1亩=666.67㎡),方便农业/国土领域用户快速理解。

3.3 浮动面板(Floating Panel)的实现哲学:为什么拒绝Modal弹窗?

很多同类工具用Bootstrap Modal显示结果,但在三维场景中极其违和:Modal会遮挡地形、打断空间感知、且无法随相机旋转。本工具的浮动面板采用“绝对定位+Canvas动态渲染”方案:

  • 面板DOM元素固定在<body>下,CSS设置position: fixed; top: 20px; right: 20px;
  • 关键创新:面板内的数字使用<canvas>绘制,而非HTML文本。原因有三:
    1. Canvas可启用抗锯齿,数字在Retina屏上更清晰;
    2. 可动态调整字体大小(当用户缩放浏览器时,Canvas文字自动适配);
    3.最重要的是:Canvas可叠加半透明阴影,模拟真实悬浮效果——用CSSbox-shadow在三维场景中会产生视觉割裂,而Canvas阴影与Cesium天空盒自然融合。

面板数据更新频率设为60fps(匹配显示器刷新率),但做了智能节流:仅当测量点坐标变化>0.0001°(约11m)时才重绘,避免CPU空转。

4. 实操全流程详解:从双击index.html到输出可信报告

4.1 首次运行:三分钟建立可信工作流

Step 1:解压与验证
下载资源包后,无需任何安装,直接解压到任意文件夹(建议路径不含中文或空格,如D:\cesium-measure)。打开文件夹,确认以下文件存在:
-index.html(主入口)
-lib/Cesium/Build/Cesium/Cesium.js(Cesium核心)
-measure/measure.js(测量逻辑)

提示:若双击index.html后页面空白,90%概率是浏览器安全策略阻止了本地file://协议加载JS。此时右键index.html→ “复制路径”,粘贴到Chrome地址栏,手动在开头加上file:///(注意三个斜杠),或更简单——用VS Code安装Live Server插件,右键index.html→ “Open with Live Server”。

Step 2:加载三维场景
默认加载Cesium Ion的全球影像(需联网),首次加载约需15–30秒。若需离线使用,可替换为本地3D Tiles:
- 将.3dtiles文件夹放入lib/目录;
- 修改index.htmlCesium.Ion.defaultAccessTokennull
- 在viewer.scene.globe.show = true;后添加:

viewer.scene.globe.tileCacheSize = 1000; // 增大缓存提升流畅度 viewer.scene.globe.baseColor = Cesium.Color.WHITE; // 设置默认底色 // 加载本地3D Tiles(示例) const tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: './lib/my-tileset/tileset.json' })); viewer.flyTo(tileset); // 自动飞向模型

Step 3:启动测量(以测滑坡体面积为例)
1. 按住鼠标右键拖拽,将视角调整至滑坡体正上方;
2. 滚轮缩放至能清晰辨识边界(建议高度<500m);
3.右键单击滑坡体左上角→ 出现红色圆点(首顶点);
4.依次右键单击边界各转折点(每点间隔建议>5m,避免密集采样导致计算延迟);
5.双击最后一个点→ 红色圆点变为绿色填充多边形,右上角面板显示面积;
6. 若某点位置错误,按Z键撤销上一点(支持最多10步撤销);
7. 点击面板“导出CSV”按钮,生成包含时间戳、坐标序列、面积值的文本文件。

注意:实测发现,在陡峭山体(坡度>45°)测量时,pickPosition可能因地形遮挡返回错误高度。此时启用“贴地模式”:在measure.js中将clampToGround: true参数传入viewer.scene.globe.depthTestAgainstTerrain = true,强制所有点吸附到地表。

4.2 进阶技巧:应对复杂地形与特殊需求

场景1:测量跨越山脊的折线路径(如输电线路)

普通测距模式在山脊处会因高度突变导致路径“悬空”。解决方案:
- 启用measure.js中的followTerrain选项(默认关闭);
- 折线绘制时,每添加一个点,自动沿地形生成中间点:

// 在addPointToPolyline函数中插入 const terrainSampledPoints = await Cesium.sampleTerrainMostDetailed( viewer.terrainProvider, [cartographic] // cartographic为当前点地理坐标 ); // 将terrainSampledPoints[0].height赋给当前点高度,确保贴地

实测某50km输电线路,在3000m海拔落差下,开启此模式后路径长度比默认模式多出2.3km(计入真实起伏)。

场景2:批量导出多个测量结果

工具本身不提供批量功能,但预留了API接口。在浏览器控制台(F12)中执行:

// 获取所有历史测量记录 console.table(measureModule.history); // 导出为GeoJSON(可用于QGIS进一步分析) const geojson = measureModule.exportAsGeoJSON(); const blob = new Blob([JSON.stringify(geojson)], {type: 'application/json'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'measurements.geojson'; a.click();
场景3:嵌入现有WebGIS系统

无需改造原系统,仅需两步:
1. 将measure/目录整体拷贝到你的项目src/assets/下;
2. 在Vue组件中:

<script setup> import { onMounted } from 'vue'; onMounted(() => { // 动态加载measure模块 const script = document.createElement('script'); script.src = '/assets/measure/measure.js'; script.onload = () => { window.measureModule.init(CesiumViewerInstance); // 传入你的Cesium实例 }; document.head.appendChild(script); }); </script>

注意:CesiumViewerInstance必须是已初始化的Cesium Viewer对象,且scene.globe.show = true

4.3 性能调优实战:让老旧笔记本也能流畅运行

在某县级自然资源局项目中,客户使用i5-4200U+8GB内存的旧笔记本,加载三维模型后帧率仅12fps。通过以下四项优化,将测量交互帧率提升至48fps:

优化1:禁用非必要Cesium特性
index.html中Cesium初始化后添加:

viewer.scene.globe.baseColor = Cesium.Color.BLACK; // 关闭默认蓝色海洋 viewer.scene.skyBox = undefined; // 关闭星空背景 viewer.scene.fog.enabled = false; // 关闭雾效 viewer.scene.globe.depthTestAgainstTerrain = true; // 仅开启地形深度测试

优化2:测量图形轻量化
默认Entity使用Billboard(图标)和Polyline(线条),但Billboard在远距离会模糊。改为:
- 起点/终点用PointGraphics(纯色圆点,性能更好);
- 折线用PolylineCollection替代Polyline(批量渲染,减少Draw Call);
- 多边形填充用PolygonHierarchy+material: Cesium.Color.YELLOW.withAlpha(0.3)(半透明,避免遮挡地形)。

优化3:坐标计算缓存
measure.js中添加LRU缓存:

const coordinateCache = new Map(); function getTurfPolygon(points) { const key = points.map(p => `${p.lon.toFixed(6)},${p.lat.toFixed(6)}`).join('|'); if (coordinateCache.has(key)) return coordinateCache.get(key); const poly = turf.polygon([[...points, points[0]]]); coordinateCache.set(key, poly); if (coordinateCache.size > 50) coordinateCache.delete(coordinateCache.keys().next().value); return poly; }

优化4:懒加载Turf
将Turf初始化移至首次测量时:

let turfLoaded = false; async function ensureTurf() { if (turfLoaded) return; // 动态加载turf.min.js const script = document.createElement('script'); script.src = './lib/turf/turf.min.js'; await new Promise(resolve => { script.onload = resolve; document.head.appendChild(script); }); turfLoaded = true; }

5. 常见问题排查与避坑指南:那些文档里不会写的血泪教训

5.1 典型问题速查表

问题现象可能原因解决方案
点击无反应,控制台报Cannot read property 'pickPosition' of undefinedviewer.scene.globe.show = false或地形服务未加载index.html中确认viewer.scene.globe.show = true,并检查Cesium.Ion.defaultAccessToken是否有效
测量结果显示“NaN”或“Infinity”坐标数组中存在undefined点(如点击空中未击中地形)启用measure.js中的validateCoordinates: true选项,自动过滤无效点
面积值明显偏小(如1km²区域显示仅100㎡)坐标未闭合(多边形首尾点不一致)双击结束时,代码自动将首点追加到数组末尾,检查measure.js第217行coordinates.push(coordinates[0]);是否被注释
浮动面板文字模糊、有锯齿浏览器缩放比例非100%在Chrome地址栏输入chrome://settings/appearance,将“页面缩放”设为100%
导出CSV后坐标全是0,0turf.helpers模块未正确加载检查lib/turf/目录下是否存在turf-helpers.js,或确认measure.jsturf.point()调用是否正常

5.2 必须规避的三大认知陷阱

陷阱1:“Cesium的Cartographic就是WGS84,直接喂给Turf就行”
错!Cesium的Cartographic是弧度制,Turf需要十进制度。必须经过Cesium.Math.toDegrees()转换。曾有团队跳过此步,导致在新疆某地测算的油田面积偏差达37%,返工两周。

陷阱2:“面积单位设为’squareKilometers’就能自动换算”
错!Turf的units参数仅影响返回值数值,不改变计算模型。turf.area(polygon, {units: 'kilometers'})仍是按平方米计算后再除以1e6,精度无提升。真正提升精度的是ellipsoid: 'WGS84'参数。

陷阱3:“测量模块必须和Cesium版本严格匹配”
不必。本工具已做向下兼容:measure.js中所有Cesium API调用均检测版本号:

if (Cesium.VERSION.startsWith('1.10')) { // 使用1.105的pickPosition API } else if (Cesium.VERSION.startsWith('1.9')) { // 回退到1.9x的getPickRay方案 }

实测兼容Cesium 1.89–1.105全系列,无需为升级Cesium而重写测量逻辑。

5.3 真实项目中的扩展实践

在内蒙古某草原生态监测项目中,我们基于本工具做了三项增强:

扩展1:植被覆盖度估算
measure.js中接入Sentinel-2 NDVI数据:
- 用户绘制多边形后,自动调用https://services.sentinel-hub.com/ogc/wms获取该区域NDVI均值;
- 面板同步显示“面积:12.3km²|NDVI均值:0.28|推测植被覆盖度:中等”。

扩展2:合规性红线预警
对接自然资源部永久基本农田数据库:
- 将测量区域WKT上传至/api/check-redline接口;
- 若多边形与红线相交,面板红色闪烁并提示“该区域涉及永久基本农田,请谨慎施工”。

扩展3:测量报告自动生成
点击“生成PDF”按钮,调用jsPDF + html2canvas
- 截图当前三维视图(含测量图形);
- 截图浮动面板数据;
- 自动生成带项目名称、时间、操作员签名的PDF报告。

最后分享一个小技巧:在野外无网络时,可提前将常用区域的地形瓦片缓存到本地。用Cesium ion的Cesium.IonWorldImageryPicker下载指定范围瓦片,保存为./lib/tiles/,再修改index.htmlviewer.imageryLayers.addImageryProvider指向本地路径。某次在青海无人区,靠此方案连续72小时无网运行,测量数据零丢失。

这个工具没有炫技的动画,没有复杂的配置界面,甚至没有一行TypeScript——但它在我经手的17个三维项目中,平均每天被调用23次,累计生成超过4万份空间量算数据。它存在的意义,从来不是证明技术多先进,而是让一线工程师、地质队员、规划师,在面对真实世界的问题时,能少一分犹豫,多一分笃定。

本文还有配套的精品资源,点击获取

简介:直接打开index.html就能用的三维测量小工具,基于CesiumJS构建,支持在浏览器里实时量算地表两点间直线距离、折线路径长度,以及任意多边形区域的地理面积。所有功能封装在独立的measure模块中,交互操作简单——点击开始、移动添加点、双击结束,结果即时显示在右上角。底层调用Cesium官方库处理三维球面坐标,结合Turf.js做WGS84坐标系下的高精度空间计算,确保山地、曲面等复杂地形下的面积估算准确可靠。lib目录已预置Cesium和Turf依赖,turf子目录专用于地理分析运算,无需npm安装或webpack打包,也不依赖后端服务。适合快速集成到WebGIS系统、数字孪生平台或三维项目原型中,常见于地质调查、国土规划、基建勘测等需要现场空间量算的前端开发环节。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 3:13:00

如何在生产环境中稳定运营成百上千个智能体

尽管增长前景广阔&#xff0c;但企业在实际生产环境中面临着严峻的运营挑战。当AI 从“边缘试用”进入“核心生产”后&#xff0c;如何稳定、安全、可持续地运营成百上千个智能体&#xff0c;成为了CIO 与CTO 们的头号课题。 ⊲ 成本压力与预算逻辑的重构&#xff1a;Token 正在…

作者头像 李华
网站建设 2026/6/9 18:22:58

KE15Z/14Z外部晶振与SWD接口硬件设计实战指南

1. 项目概述&#xff1a;为什么KE15Z/14Z的时钟与调试设计值得深究在嵌入式硬件开发中&#xff0c;有两样东西最让人“又爱又恨”&#xff1a;一个是时钟&#xff0c;一个是调试接口。时钟是系统的心跳&#xff0c;一旦不稳&#xff0c;轻则串口乱码&#xff0c;重则程序跑飞&a…

作者头像 李华
网站建设 2026/6/11 7:30:57

瑞芯微RV1126B开发板(EASY-EAI-PI2) WIFI STA

1. 网络配置简介 本文档介绍了系统的网络基础配置。另外为了解决在程序中修改网络配置需求&#xff0c;我们也提供使用yaml-cpp库修改网络配置的简单示例。 1.1 netplan与yaml文件 1.1.1 背景 本分析系统运行环境采用的是Ubuntu22.04系统。由于Ubuntu从18.04版本不再使用 i…

作者头像 李华
网站建设 2026/6/9 18:14:42

告别复杂配置 OpenClaw v2.7.9 可视化安装使用教程

✨ OpenClaw v2.7.9&#xff08;虾壳云版&#xff09;一键安装部署指南 ✨ 全系统适配 | 可视化操作 | 内置全套依赖 | 零基础友好 &#x1f4cc; 基础信息说明 适配系统&#xff1a;Windows10/11 64 位、macOS当前版本&#xff1a;v2.7.9&#xff08;虾壳云版&#xff09;压缩…

作者头像 李华
网站建设 2026/6/9 18:09:20

钢结构工程角焊缝的构造要求有哪些?

钢结构工程角焊缝的构造要求有哪些? (1)最大焊脚尺寸 为了避免烧穿较薄的焊件,减少焊接应力和焊接变形,且扩大热影响区,角焊缝的焊脚尺寸不宜太大。规范规定:除了直接焊接钢管结构的焊脚尺寸hf不宜大于支管壁厚的2倍之外,hf不宜大于较薄焊件厚度的1.2倍。 在板件边…

作者头像 李华
网站建设 2026/6/11 6:53:21

唐山广告宣传:性价比之王花落谁家?

在唐山&#xff0c;广告宣传是企业提升品牌知名度和市场竞争力的重要手段。然而&#xff0c;面对众多的广告服务商&#xff0c;如何选择一家性价比高的合作伙伴成为了许多企业的难题。本文将从多个维度分析&#xff0c;帮助您找到最适合您的广告宣传服务商。一、本地化资源优势…

作者头像 李华