使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) - B1 h5 b3 c( h
Ocean Productivity(http://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。 3 w9 e, y r8 ~! {+ O

3 W5 P s) Y. x# q: J0 y- v! S6 [/ D 本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。
m, j2 M# C* R9 t 安装nppr包
2 h; Q( g, B7 q2 Y' \ 可在github(https://github.com/chaoxv/nppr)获取nppr包。
0 Z! l/ B6 w' b# G' O6 M #下载nppr包
% p9 }3 p n6 K$ V( h #install.packages(remotes) T$ j8 V' z; `9 \
remotes::install_github(chaoxv/nppr)
; B, m0 x/ y4 i1 L0 V& L' x #加载相关R包 ; D! i4 x3 @ u: [! b
library(nppr)
8 {% z* n: r: U1 C3 m# T library(RCurl)
7 |) \0 f& u8 O' `* f library(XML)
8 Z# w# `+ ~3 ^5 j# }$ I2 @0 I library(R.utils) # o! [# G7 v" y, K' r3 z
library(tidyverse)
8 \# r' _6 T4 T; A9 `% O: q library(lubridate)
7 Z" ^$ Y+ C- t' H% ]& E( N 使用nppr包下载海洋遥感数据 - K1 Q% g" Y- l9 S, f6 o9 y* F
nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。 $ t/ D p! ^" M7 s* }* m5 Q

" A% L7 ~5 N5 k% a$ n 以下以获取海洋NPP遥感数据为例作个演示。
( W6 u( D" v) H6 b; \( E. ^ z5 J, r #创建工作路径 * t# m$ }5 m; c# m% q
yourfolder <- F:/R/nppr/vgpm
# b* m9 U. d# s, Q' x, Z7 z dir.create(yourfolder) ! M/ ^; j5 B8 [: ?
#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm
% K6 w7 p6 w1 I6 i get_npp_vgpm(
( L8 v2 J+ F/ Q* n file.path = yourfolder, v: j# d4 w; ~: J v1 [1 p
grid.size = low, #指定low或high可更改空间分辨率 A: _: V5 l% |
time.span = monthly, #monthly代表月平均,dayly代表8天平均
" z! H H) ?. M# D6 [0 o satellite = MODIS, #选择卫星
5 i) M0 U+ D7 p( P; @2 a8 o mindate = 2016-01-15, #指定时间范围以下载遥感
' H7 h: \$ {) a. D! m, a' v maxdate = 2016-03-15 4 u5 F8 M5 q% W( Z: d0 h6 `
) / ~4 X5 x: J4 l8 c, p! p. G2 ?+ b/ }
 - j) h) i/ v% n @& I- A2 U4 p+ M! T
在这个示例中,我们使用nppr包下载了来自Ocean Productivity(http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.m.chl.m.sst.php)的基于VGPM算法反演的全球海洋2016年1月至3月的月平均NPP数据。 ( a. C7 M1 s, }" s8 a( i
使用nppr包进行遥感数据格式转换
8 k8 v8 _- p9 Z 如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。
7 B3 I7 H4 ~/ a P4 S) Q #将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换 0 R7 V+ I! }8 j/ D; c
yourfile <- paste0(yourfolder, /201603.hdf)
( K* K: D/ o( M- P% b u1 `+ O vgpm <- read_hdf(file.path = yourfile) 4 H6 y) b7 v) l% X7 E- L2 u: i
head(vgpm) ( O% t5 a& B) |8 M/ C5 }5 \5 l
write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE) 8 C9 `1 _( j% Y: Y2 ?; W4 |6 f

% P; v! Y4 ~: E. N 转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPP(var,单位mg C m-2 d-1)。 . `# p" a: @( n- \1 M
使用nppr包匹配目标经纬度的遥感数据 1 T9 Y$ _( c v6 {2 V# r
默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。 ) k( l; \! ]! P2 s" C
#获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP
; }6 X( H% |2 w, W- d7 A match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01) , e% W: W0 _2 ^0 d5 u8 S& C' Z6 V2 m
#或者同时指定多个数据,不再多说 6 f% k0 ?) G" {+ a. @
mydat <- data.frame( / r; U) G# f' O- D* N& D6 p5 W
lon = c(120, 112, 116), . P: s' |9 p' [ G4 M4 s, F
lat = c(17, 15, 18), 2 E0 F3 m- F6 U1 j" F& x: O
date = c(2016-03-04, 2016-03-07, 2016-02-04)
2 b' g$ V1 t# [5 n& a1 b4 b ) & l7 X! G7 q/ w( l
match_df(mydat, file.path = yourfolder)
1 U. s" X& }- {% ^ w8 v+ L 绘制遥感地图 % a5 H. `+ z+ x( C( U( [( d
nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。
8 D, l! n/ } F4 K: k8 N! G2 f #上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式 8 ~: Y6 i) A6 t( i9 }. b4 {/ m
#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP . y* v6 o/ r" P7 `5 P2 |
library(viridis) 1 Z( f3 D6 p0 U
library(ggplot2)
. V6 j: z% K$ ]' {8 O ggplot()+ ( t9 g8 H D5 ?% Z6 d0 P# n
geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+
( S9 n+ [+ X ~5 j" ~ scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+
. N1 I P3 v, |4 d8 _( u. |) }& h, K labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*)))
/ s! D6 @4 u' e% L' T; T 
' G6 \4 }2 ]0 r; ?- v$ M; d& f3 d& D 根据时间和经纬度列表匹配遥感数据的批处理 ( \) o1 s& y* D- \& Q
实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......) 7 Q' T) X' R9 G0 T
将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。 $ f8 \* M# @' t

; u! f* a0 d( w- c0 ^$ B! C 随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SST、PAR、Chla或NPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。 7 V! t+ r3 V+ A
##如下以匹配SST数据为例做个演示
& r6 D, h2 B) k dat <- read.delim(data.txt)
- f9 _8 G* n6 y/ y, Y Date <- unique(dat$Date) #获取日期
$ J0 P$ ?- ]/ h* e3 Q yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据
" e1 x3 n! @( V, A) A! ^ dir.create(yourfolder) 9 b& X, `6 d, n+ b" o: ]1 Z: m# s
#通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例) ?# h8 z* c' P
for (i in Date) { ) u1 ~4 u1 {& a2 o! H
yourfolder <- paste(getwd(), SST, i, sep = /) - }. G/ Y/ G* C& _& `6 O
dir.create(yourfolder)
: ^5 R2 r) R5 W3 f/ s get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i) 2 C6 O+ t. D% p9 N- [% v# C
yourfile <- dir(yourfolder) # }2 w* Y8 w7 S
hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /)) ! e7 C6 o% h' |& v. \
write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE) $ I/ @/ ~+ | Z8 i8 \
}
1 ?, M3 J% \/ V% g& ~ #再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均)
/ b [; M! R# y: t( M for (i in 1:nrow(dat)) {
; P V: z: w: q& H" r% r Date <- dat[i,Date]
2 V. j' K0 c: y# ]1 _ yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = )
9 f; H1 ]( Q6 A% K. G# U hdf <- read.delim(yourfile)
5 e: y& v5 b# @ hdf <- hdf[which(round(hdf$lon, 2) < round(dat[i,Longitude], 2)+0.1 & round(hdf$lat, 2) < round(dat[i,Latitude], 2)+0.1), ]
# D- o) X8 M3 w; Z6 q hdf <- hdf[which(round(hdf$lon, 2) > round(dat[i,Longitude], 2)-0.1 & round(hdf$lat, 2) > round(dat[i,Latitude], 2)-0.1), ] 9 h( _$ H! T0 W: X, d0 T
dat[i,SST] <- mean(hdf$var) 6 W+ J2 b( _$ D8 d N
}
) u+ W' S* ?3 Y% h write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE)
4 z% h0 H0 c4 f  * \: H. ~, i8 i) h( I
输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。 3 x1 ?% ?% x4 J3 g
1 B3 l& p, N: d5 J0 n' a* @
5 W( L& t% i% I' D. d; k+ A, h! j9 Z% C) l
& _( C8 A0 g7 i |