如何使用R语言terra包为栅格赋予正确的投影与范围?
问题:Terra读取TIFF时无法获取正确坐标系、分辨率与范围
尝试用R的terra包读取TIFF文件时,出现如下问题:
hh <- rast("imagery_HH.tif") #> Warning message: #> [rast] unknown extent hh #> class : SpatRaster #> dimensions : 8371, 8946, 1 (nrow, ncol, nlyr) #> resolution : 1, 1 (x, y) #> extent : 0, 8946, 0, 8371 (xmin, xmax, ymin, ymax) #> coord. ref. : #> source : imagery_HH.tif #> name : imagery_HH
使用terra::describe()查看文件信息,发现包含EPSG:4326的CRS定义与GCP(地面控制点)相关内容:
# terra::describe("imagery_HH.tif")输出片段 [4] "Size is 8946, 8371" [5] "GCP Projection = " [6] "GEOGCRS[\"WGS 84\"," [7] " DATUM[\"World Geodetic System 1984\"," [8] " ELLIPSOID[\"WGS 84\",6378137,298.257223563," [9] " LENGTHUNIT[\"metre\",1]]]," [10] " PRIMEM[\"Greenwich\",0," [11] " ANGLEUNIT[\"degree\",0.0174532925199433]]," [12] " CS[ellipsoidal,2]," [13] " AXIS[\"geodetic latitude (Lat)\",north," [14] " ORDER[1]," [15] " ANGLEUNIT[\"degree\",0.0174532925199433]]," [16] " AXIS[\"geodetic longitude (Lon)\",east," [17] " ORDER[2]," [18] " ANGLEUNIT[\"degree\",0.0174532925199433]]," [19] " USAGE[" [20] " SCOPE[\"Horizontal component of 3D system.\"]]," [21] " AREA[\"World.\"]]," [22] " BBOX[-90,-180,90,180]]," [23] " ID[\"EPSG\",4326]]" [24] "Data axis to CRS axis mapping: 2,1"
QGIS可正常识别该文件的EPSG:4326坐标系,但terra读取后缺失CRS、分辨率与范围均不正确,如何解决?
解决方案
该问题的核心是:你的TIFF文件未使用常规**地理变换(GeoTransform)参数定义坐标,而是通过地面控制点(GCP)**关联像素与地理坐标。rast()默认不会自动应用GCP,需手动处理:
方法1:使用rectify()纠正栅格
# 读取原始栅格 hh_raw <- rast("imagery_HH.tif") # 获取文件中的GCP信息 gcp_data <- gcp("imagery_HH.tif") # 为栅格指定目标CRS(从describe结果可知是EPSG:4326) crs(hh_raw) <- "EPSG:4326" # 将GCP绑定到栅格 hh_raw <- setGCP(hh_raw, gcp_data) # 基于GCP纠正栅格,生成带正确地理信息的新栅格 hh_corrected <- rectify(hh_raw, crs = "EPSG:4326") # 查看纠正后的结果 hh_corrected
方法2:使用project()直接投影
hh <- rast("imagery_HH.tif") # 获取GCP数据 gcp_df <- gcp("imagery_HH.tif") # 基于GCP将栅格投影到目标CRS hh_proj <- project(hh, "EPSG:4326", GCP = gcp_df)
执行上述任一方法后,栅格将具备正确的EPSG:4326坐标系、对应分辨率与真实地理范围。
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

