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 测试是否能显示
相关推荐
milanleon2 小时前
使用Spring Security进行登录认证
java·前端·spring
excel2 小时前
🚀 从零开始:如何从 GPTsAPI.net 申请 API Key 并打造自己的 AI 服务
前端
期待のcode3 小时前
@RequestBody的伪表单提交场景
java·前端·vue.js·后端
栀秋6663 小时前
防抖 vs 节流:从百度搜索到京东电商,看前端性能优化的“节奏哲学”
前端·javascript
一颗烂土豆3 小时前
vfit.js v2.0.0 发布:精简、语义化与核心重构 🎉
前端·vue.js·响应式设计
有意义3 小时前
深入防抖与节流:从闭包原理到性能优化实战
前端·javascript·面试
可观测性用观测云4 小时前
网站/接口可用性拨测最佳实践
前端
2503_928411564 小时前
12.26 小程序问题和解决
前端·javascript·微信小程序·小程序
灼华_4 小时前
超详细 Vue CLI 移动端预览插件实战:支持本地/TPGZ/NPM/Git 多场景使用(小白零基础入门)
前端