如何绕开rectify()从jpg+jgw文件对直接获取栅格边界多边形?
从JPG+JGW文件对快速获取栅格边界多边形(绕开rectify())
当前使用terra包处理JPG+JGW文件对时,通过rectify()再转多边形的方式在批量处理时速度极慢,测试已证实rectify()是性能瓶颈。可以通过直接读取地理变换参数计算栅格角点的方式绕开rectify(),快速生成边界多边形:
解决方案代码
library(terra) # 导入带地理参考的JPG(不执行rectify) r <- rast("DJI_0371.jpg") # 提取JGW文件中的地理变换参数 geo_trans <- crs(r, describe = TRUE)$geotransform x_origin <- geo_trans[1] y_origin <- geo_trans[2] x_res <- geo_trans[3] y_skew <- geo_trans[4] x_skew <- geo_trans[5] y_res <- geo_trans[6] # 获取栅格的行列数 n_cols <- ncol(r) n_rows <- nrow(r) # 计算栅格四个角点的坐标(按左上→右上→右下→左下→左上的顺序闭合) corner_coords <- matrix( c( x_origin, y_origin, x_origin + n_cols * x_res + n_cols * x_skew, y_origin + n_cols * y_skew + n_cols * y_res, x_origin + n_cols * x_res + n_rows * y_skew, y_origin + n_rows * y_skew + n_rows * y_res, x_origin + n_rows * y_skew, y_origin + n_rows * y_res, x_origin, y_origin ), ncol = 2, byrow = TRUE ) # 将坐标转换为terra多边形对象 boundary_poly <- vect(corner_coords, type = "polygons", crs = crs(r))
原理说明
JGW文件本质是存储了栅格的地理变换参数(包含原点坐标、分辨率、旋转/倾斜参数),通过这些参数可以直接计算出栅格四个角点的地理坐标,无需对栅格数据进行重采样(rectify()的核心操作),因此能大幅提升批量处理的速度。
性能对比
该方法的执行时间几乎与rast()导入文件的时间一致,远低于原流程(rectify()+as.polygons())的耗时,完全适配批量处理场景。
内容的提问来源于stack exchange,提问作者user2955884
相关产品推荐
相关产品推荐

