Cesium加载20GB航测影像.tif

从20GB无人机影像到Cesium三维地图:小白也能学会的GDAL全流程教程

适用人群 :刚接触GIS、QGIS、GDAL的小白用户
目标成果 :将本地大尺寸无人机正射影像(.tif)转换为Web地图瓦片,并在 CesiumJS 中流畅加载
所需工具:已安装 QGIS(自带 OSGeo4W 和 GDAL)


📦 背景说明

你有一张由无人机生成的高精度正射影像(比如 1-3正射.tif),大小可能高达 10~20GB ,坐标系是 CGCS2000(如 EPSG:4538)。你想把它放到网页上,在 CesiumJS 这样的三维地球引擎中查看。

但问题来了:

  • Cesium 默认使用 Web 墨卡托(EPSG:3857)WGS84(EPSG:4326)
  • 大文件不能直接加载,需要切成小瓦片(类似 Google Maps 的方式)
  • 手动操作太复杂?别担心,GDAL 帮你搞定!

🔧 第一步:确认原始数据的坐标系

打开 OSGeo4W Shell(安装QGIS软件,附带会安装好gdal插件,就会有这个玩意,在开始菜单搜索即可,本文所有代码都在这里面输入,),输入:

复制代码
gdalsrsinfo -o epsg "d:\qp\1-3正射.tif"

你会看到类似输出:

复制代码
EPSG:4538

✅ 这表示你的数据使用的是 CGCS2000 / 3度带高斯-克吕格投影(第38带),这是中国常用的测绘坐标系。

💡 小知识:不同地区的 CGCS2000 投影带编号不同(如北京常用 4527,上海用 4531)。务必先确认你的 EPSG 编号!


🔄 第二步:将影像重投影到 Web 墨卡托(EPSG:3857)

Cesium 和大多数在线地图(如 Google Maps、高德、百度)都使用 Web 墨卡托(EPSG:3857),所以我们先把影像转过去。

在 OSGeo4W Shell 中运行:

复制代码
gdalwarp -s_srs EPSG:4538 -t_srs EPSG:3857 -r bilinear ^
         -co TILED=YES -co BIGTIFF=YES -co COMPRESS=LZW ^
         "d:\qp\1-3正射.tif" "d:\qp\output_3857.tif"

参数详解(小白友好版):

参数 作用
-s_srs EPSG:4538 源坐标系(你的原始数据)
-t_srs EPSG:3857 目标坐标系(Web 墨卡托,Cesium 友好)
-r bilinear 重采样方法:双线性插值,图像更平滑(也可选 cubic 更精细)
-co TILED=YES 内部分块存储,加快后续读取速度
-co BIGTIFF=YES 支持 >4GB 的大文件(必须加!)
-co COMPRESS=LZW 无损压缩,减小文件体积(也可用 ZSTD 更快)

倒数第二个参数是原始的tif文件的绝对路径,倒数第一个参数是坐标转换之后输出的绝对路径

⏱️ 注意:20GB 文件转换可能需要 几十分钟到几小时,取决于电脑性能。


✅ 第三步:验证转换是否成功

再次检查新文件的坐标系:

复制代码
gdalsrsinfo -o epsg "d:\qp\output_3857.tif"

输出应为:

复制代码
EPSG:3857

✅ 如果看到这个,恭喜!坐标转换成功!


🧩 第四步:切片!生成 Web 地图瓦片

现在要把大图切成成千上万个小图片(瓦片),供网页加载。

运行以下命令:

复制代码
python "D:\QGIS\apps\Python312\Scripts\gdal2tiles.py" ^
  --xyz ^
  --zoom=10-22 ^
  --resampling=bilinear ^
  --processes=8 ^
  "d:\qp\output_3857.tif" ^
  "d:\qp\tiles"

参数详解:

参数 说明
--xyz 生成标准 XYZ 瓦片(如 z/x/y.png),兼容 Google、Cesium、Leaflet 等
--zoom=10-22 生成缩放级别 10 到 22 的瓦片 • 10级 ≈ 城市级视图 • 22级 ≈ 建筑细节(根据影像分辨率调整)
--resampling=bilinear 切片时的重采样方式,保持清晰度
--processes=8 使用 8 个 CPU 核心并行处理,大幅提速(根据你的 CPU 修改)
"d:\qp\output_3857.tif" 输入文件(已转为 EPSG:3857)
"d:\qp\tiles" 输出目录,会自动生成 {z}/{x}/{y}.png 结构

倒数第二个参数是需要切片的tif文件绝对路径,倒数第一个参数是切片之后输出的绝对路径

💾 提示:20GB 影像切到 22 级可能产生 数十万甚至上百万个 PNG 文件 ,占用 上百 GB 空间

建议先试 --zoom=15-18 测试效果。


🌐 第五步:在 CesiumJS 中加载瓦片

1. 启动本地 Web 服务器

浏览器不能直接通过 file:// 加载瓦片(安全限制),需启动 HTTP 服务。(需要安装http-server)

在任何目录下打开终端,运行:

复制代码
npx http-server D:\qp\tiles -p 8080 --cors

然后访问:http://localhost:8080/tiles/15/20000/10000.png(对应你切片文件夹里面的路径,这里只是示例)

如果能看到图片,说明服务正常!

2. cesium加载切片

复制代码
  let rect = Cesium.Rectangle.fromDegrees(
    ...[87.3913, 43.7689, 87.4156, 43.7904]
  );

  // 使用 TileProvider 的 rectangle 属性锁定范围
  viewer.imageryLayers.addImageryProvider(
    new Cesium.UrlTemplateImageryProvider({
      url: "http://localhost:8080/{z}/{x}/{y}.png",
      // minimumLevel: 10,//请求的最小详细级别
      // maximumLevel: 22,//请求的最大详细级别(都是根据你的切片数据,有就是有,没有就是没有,不用设置也可以)
      // tilingScheme: new Cesium.WebMercatorTilingScheme(),//默认 Web-Mercator 标准 XYZ
      rectangle: rect, // 限定瓦片加载范围,否则页面会卡死
    })
  );
  viewer.camera.setView({ destination: rect });

这个限定范围的四至边界坐标可以通过命令行查看

直接问AI即可计算完成,得到对应的四至边界坐标


🛠️ 常见问题 & 优化建议

❓ 为什么瓦片显示错位或空白?

  • 检查 tilingScheme 是否为 WebMercatorTilingScheme()(因为你用了 EPSG:3857)
  • 确保缩放级别在 10-22 范围内
  • 用浏览器直接打开一个瓦片 URL 测试是否能显示
相关推荐
BomanGe212 小时前
NSK直线导轨LH55EL与NH55EM替代指南
前端·javascript·数据库·经验分享·规格说明书
云水一下12 小时前
Vue.js从零到精通系列(四):前端路由与Vue Router——打造多页单页应用
前端·javascript·vue.js
糯米导航12 小时前
浏览器解析HTML头部的底层逻辑:从字节流到渲染树的关键一步
前端·html
风骏时光牛马12 小时前
C++开发常见问题与解决方案汇总
前端
用户831348593069812 小时前
Vue3+Cesium实现3DTiles模型实时调节(离地面高度/xyz轴旋转/模型经纬度偏移)
vue.js·cesium
zhedream12 小时前
Vue 3 Teleport 报错实录:从 patch 时机到 `defer` 属性
前端·vue.js
雁北向12 小时前
自定义指令 数值输入显示优化 巴飞特 测试
前端·vue.js
研☆香12 小时前
jQuery补充知识点
前端·javascript·jquery
lichenyang45312 小时前
打车票根卡片 UI 重构:从 Circle 挖洞到 clipShape PathShape,再到 100% 自适应
前端
傅科摆 _ py12 小时前
AI Ping 平台使用教程
java·前端·人工智能