从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 测试是否能显示