使用 R 进行辐射校正

Posted

技术标签:

【中文标题】使用 R 进行辐射校正【英文标题】:Radiometric corrections with R 【发布时间】:2021-11-30 21:38:04 【问题描述】:

我正在尝试通过 R / RStoolbox 将 Landsat 8 文件转换为反射率

我正在使用带有以下代码的脚本:

metaData  <- readMeta("LC08_L1TP_183033_20210623_20210630_02_T1_MTL.txt")
lsat <- stackMeta("LC08_L1TP_183033_20210623_20210630_02_T1_MTL.txt")
lsat_sref <- radCor(lsat, metaData, method = "dos")

我遇到了这个错误:

Error in CRS(paste0(c("+proj=", "+zone=", "+units=m +datum="), pars, collapse = " ")) :
  No spaces permitted in PROJ4 argument-value pairs: +proj= +zone= +units=m +datum=

你能帮帮我吗?

【问题讨论】:

你好,看那里:gis.stackexchange.com/questions/390084/… 非常感谢曼罗。我已经看过这个页面了。但这对我没有帮助。添加 raw=T 适用于 readMeta 函数,但不适用于 staskMeta 函数。所以我不知道如何通过。你有其他想法吗? metaData 不,不。我从未使用过这个库。但我认为,如果你在那里问:gis.stackexchange.com - 你得到一些答案的机会已经长大了。 【参考方案1】:

问题在于您的第二行代码。您需要按如下方式更改它,它应该可以工作:

lsat &lt;- stackMeta(metaData)

请在下面找到一个小代表来向您展示它是如何工作的:

REPREX

library(RStoolbox)

mtlFile  <- system.file("external/landsat/LT52240631988227CUB02_MTL.txt", package="RStoolbox")
metaData <- readMeta(mtlFile)
lsat <- stackMeta(metaData)
lsat_sref <- radCor(lsat, metaData, method = "dos")

lsat_sref
#> class      : RasterStack 
#> dimensions : 310, 287, 88970, 7  (nrow, ncol, ncell, nlayers)
#> resolution : 30, 30  (x, y)
#> extent     : 619395, 628005, -419505, -410205  (xmin, xmax, ymin, ymax)
#> crs        : +proj=utm +zone=22 +datum=WGS84 +units=m +no_defs 
#> names      :       B1_sre,       B2_sre,       B3_sre,       B4_sre,       B5_sre,        B6_bt,       B7_sre 
#> min values :   0.01327889,   0.00000000,   0.00000000,   0.00000000,   0.00000000, 293.37508120,   0.00000000 
#> max values :    0.2028536,    0.1935375,    0.2243498,    0.4356817,    0.3393489,  299.8284592,    0.2617160

由reprex package 创建于 2021-10-12 (v2.0.1)

编辑

summary()的输出

summary(metaData)
#> Scene:      LT52240631988227CUB02 
#> Satellite:  LANDSAT5 
#> Sensor:     TM 
#> Date:       1988-08-14 
#> Path/Row:   224/63 
#> Projection: +proj=utm +zone=22 +datum=WGS84 +units=m +no_defs
#> 
#> Data:
#>                              FILES QUANTITY CATEGORY
#> B1_dn LT52240631988227CUB02_B1.TIF       dn    image
#> B2_dn LT52240631988227CUB02_B2.TIF       dn    image
#> B3_dn LT52240631988227CUB02_B3.TIF       dn    image
#> B4_dn LT52240631988227CUB02_B4.TIF       dn    image
#> B5_dn LT52240631988227CUB02_B5.TIF       dn    image
#> B6_dn LT52240631988227CUB02_B6.TIF       dn    image
#> B7_dn LT52240631988227CUB02_B7.TIF       dn    image
#> 
#> Available calibration parameters (gain and offset):
#>  dn -> radiance (toa)
#>  dn -> brightness temperature (toa)

由reprex package (v2.0.1) 于 2021 年 10 月 12 日创建

编辑 2

我想我发现了你的问题。从网站https://earthexplorer.usgs.gov/ 下载时,除了 .mtl 元数据文件之外,您通常还会获得总共 12 个辐射波段(即 B1-B11,和一个“专用评估质量波段”-即 Bqa)。所有这些文件必须在同一个文件夹中,并且您不得删除其中任何一个(其中一些用于辐射校正)。换句话说,包RSToolbox 需要这些不同的文件。

如果你这样做,一切都会正常。

这是我下载的 landsat 8 图像的示例(不是代表),所有代码都有效:

library(RStoolbox)
metaData <- readMeta("DATA_09/Landsat8/Landsat8_RAW/LC08_L1TP_016030_20160927_20170220_01_T1_MTL.txt")

# NB : Please, note the presence of all the bands (B1-B11 + Band qa):

summary(metaData)
#> Scene:      LC80160302016271LGN01 
#> Satellite:  LANDSAT8 
#> Sensor:     OLI_TIRS 
#> Date:       2016-09-27 
#> Path/Row:   16/30 
#> Projection: +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs

#> Data:
#>                                                   FILES QUANTITY CATEGORY
#> B1_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B1.TIF       dn    image
#> B2_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B2.TIF       dn    image
#> B3_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B3.TIF       dn    image
#> B4_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B4.TIF       dn    image
#> B5_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B5.TIF       dn    image
#> B6_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B6.TIF       dn    image
#> B7_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B7.TIF       dn    image
#> B9_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B9.TIF       dn    image
#> B10_dn LC08_L1TP_016030_20160927_20170220_01_T1_B10.TIF       dn    image
#> B11_dn LC08_L1TP_016030_20160927_20170220_01_T1_B11.TIF       dn    image
#> B8_dn   LC08_L1TP_016030_20160927_20170220_01_T1_B8.TIF       dn      pan
#> QA_dn  LC08_L1TP_016030_20160927_20170220_01_T1_BQA.TIF       dn       qa
#>
#> Available calibration parameters (gain and offset):
#>  dn -> radiance (toa)
#>  dn -> reflectance (toa)
#>  dn -> brightness temperature (toa)

lsat <- stackMeta(metaData)
lsat
#> class      : RasterStack 
#> dimensions : 504, 541, 272664, 10  (nrow, ncol, ncell, nlayers)
#> resolution : 30, 30  (x, y)
#> extent     : 318195, 334425, 4737735, 4752855  (xmin, xmax, ymin, ymax)
#> crs        : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs 
#> names      : B1_dn, B2_dn, B3_dn, B4_dn, B5_dn, B6_dn, B7_dn, B9_dn, B10_dn, #> B11_dn 
#> min values :  8492,  7617,  6777,  6026,  5290,  5185,  5142,  4995,  22328,  #> 20666 
#> max values : 19081, 19935, 21595, 22716, 27590, 38013, 39165,  5105,  30111,  #> 27137 


lsat_sref <- radCor(lsat, metaData, method = "dos")
lsat_sref
#> class      : RasterStack 
#> dimensions : 504, 541, 272664, 10  (nrow, ncol, ncell, nlayers)
#> resolution : 30, 30  (x, y)
#> extent     : 318195, 334425, 4737735, 4752855  (xmin, xmax, ymin, ymax)
#> crs        : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs 
#> names      :       B1_sre,       B2_sre,       B3_sre,       B4_sre,        B5_sre,       B6_sre,       B7_sre,       B9_sre,       B10_bt,       B11_bt 
#> min values : 1.078127e-01, 7.822588e-02, 5.389152e-02, 3.082883e-02, 8.681202e-03, 5.291948e-03, 3.968224e-03, 0.000000e+00, 2.847589e+02, 2.830717e+02 
#> max values : 4.347280e-01, 4.464235e-01, 5.032560e-01, 5.323340e-01, 6.762622e-01, 9.449113e-01, 9.547490e-01, 3.183901e-03, 3.039071e+02, 3.018956e+02 

【讨论】:

嗨@Olivier Theureaux,如果我的回答解决了您的问题,请将其标记为已接受,以便其他用户更容易找到正确的答案。如果您不这样做,请写出问题所在。 感谢爱。不幸的是,它没有用。我有一个新错误 # Erreur dans file.exists(file) : argument 'file' wrong 好的。那是另一个问题。您收到的错误消息意味着文件“LC08_L1TP_183033_20210623_20210630_02_T1_MTL.txt”不可访问。有两种可能性:文件名在您的代码中包含错误,或者该文件不在您的工作目录中。在后一种情况下,您必须使用命令setwd() 设置工作目录(在括号中指明包含要读取的文件的文件夹的完整路径) C:/documents/mydirectory 放置斜杠(即“/”)而不是反斜杠(即“\”)。让我知道它是否有效。 元数据 这很好

以上是关于使用 R 进行辐射校正的主要内容,如果未能解决你的问题,请参考以下文章

R语言-FDR校正的原理

gdal学习笔记利用python 的gdal,以及相关库进行遥感图像处理(影像裁剪,辐射定标,大气校正,异常值去除)——以基于landsat8数据提取NDVI为例

大疆精灵4多光谱无人机P4M影像辐射定标方法

大疆精灵4多光谱无人机P4M影像辐射定标方法

大疆精灵4多光谱无人机P4M影像辐射定标方法

大疆精灵4多光谱无人机P4M影像辐射定标方法