基于JGW元数据对DJI单张无人机影像地理配准并导出GeoTIFF
为DJI无人机JPG影像添加地理参考并保存为GeoTIFF
问题背景
我有一张DJI无人机拍摄的JPG格式影像,使用R语言terra包读取后信息如下:
library(terra) single.image <- stack("https://github.com/Leprechault/trash/raw/main/DJI_0274.JPG") plotRGB(single.image, r = 3, g = 2, b = 1, stretch = "lin") # class : RasterStack # dimensions : 3648, 4864, 17743872, 3 (nrow, ncol, ncell, nlayers) # resolution : 1, 1 (x, y) # extent : 0, 4864, 0, 3648 (xmin, xmax, ymin, ymax) # crs : NA # names : DJI_0274_1, DJI_0274_2, DJI_0274_3
同时我有对应的JGW格式元数据文件,读取代码及内容如下:
single.image.mtd <- read.table("https://github.com/Leprechault/trash/raw/main/DJI_0274.jgw", header = FALSE, skip=1) single.image.mtd # V1 # 1 -3.532000e-07 # 2 2.600000e-09 # 3 3.100000e-09 # 4 2.976000e-07 # 5 -5.170865e+01 # 6 -1.973617e+01
该元数据各值对应的含义为:
# X-cell size(X方向像元大小) # rotation(X方向旋转参数,通常为0) # rotation(Y方向旋转参数,通常为0) # Y-cell size(Y方向像元大小,通常为负值) # Upper left X(影像左上角X坐标) # Upper left Y(影像左上角Y坐标)
请问是否可以利用上述元数据为该影像添加地理参考,并将其保存为GeoTIFF格式?
解决方案:可以实现
以下是完整的R语言操作步骤:
1. 读取影像并转为terra标准格式
推荐使用terra包的rast()函数读取影像,替代旧版raster包的stack():
library(terra) # 读取JPG影像为SpatRaster对象 single.image <- rast("https://github.com/Leprechault/trash/raw/main/DJI_0274.JPG") # 预览影像(可选) plotRGB(single.image, r = 3, g = 2, b = 1, stretch = "lin")
2. 提取JGW元数据参数
从已读取的元数据中提取地理参考所需的6个核心参数:
# 提取元数据中的数值 params <- single.image.mtd$V1 x_res <- params[1] # X方向像元大小 rot_x <- params[2] # X方向旋转参数 rot_y <- params[3] # Y方向旋转参数 y_res <- params[4] # Y方向像元大小 ul_x <- params[5] # 左上角X坐标 ul_y <- params[6] # 左上角Y坐标
3. 设置地理参考(仿射变换+坐标系)
DJI无人机影像的GPS数据通常采用WGS84经纬度坐标系(EPSG:4326),结合JGW参数完成地理参考设置:
# 构建仿射变换参数矩阵(对应公式:x' = a*x + b*y + c;y' = d*x + e*y + f) trans_matrix <- c(x_res, rot_x, rot_y, y_res, ul_x, ul_y) # 为影像设置地理变换规则 single.image_geo <- setGeo(single.image, trans_matrix) # 绑定WGS84坐标系 crs(single.image_geo) <- "EPSG:4326"
4. 验证地理参考信息
执行代码查看影像属性,确认地理参考参数已正确加载:
# 输出带地理参考的影像详细信息 single.image_geo
5. 保存为GeoTIFF格式
使用writeRaster()函数完成格式转换与保存:
# 保存影像,设置overwrite=TRUE可覆盖已有文件 writeRaster(single.image_geo, filename = "DJI_0274_geo.tif", format = "GTiff", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

