使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) ( z O' O9 m; a, G
Ocean Productivity(http://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。
9 K0 S. K& R, }0 ]  / X4 Y: `3 K/ }& i1 T0 F
本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。 + u! z+ l' A! M, n; y
安装nppr包
# e$ K7 T' H, `: ] 可在github(https://github.com/chaoxv/nppr)获取nppr包。
5 `+ C4 y; v: P0 B8 L6 ~" a #下载nppr包
: k- i6 ^. X" W* x) V/ k N #install.packages(remotes)
! k& c# Z* p5 S6 v1 W& Y remotes::install_github(chaoxv/nppr) & f( q# r3 S- o% C* m
#加载相关R包 0 V+ q6 `9 `0 ?! |$ _4 V4 d
library(nppr) $ B0 K, k0 _4 v+ q i1 O) M. g4 J2 f
library(RCurl) 4 P6 \, a' T( k3 o
library(XML) ?6 K, q8 Q$ ]8 [2 P& N+ m+ v0 z
library(R.utils)
8 A8 X7 }# J/ X8 a library(tidyverse)
8 d" h& U# m( k library(lubridate) " e4 ~4 T6 W% o) ^ h
使用nppr包下载海洋遥感数据
! {8 K/ n+ H8 S% j nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。
; T" m' A' c- i# L, G2 O; H6 a5 t  1 t9 g, }' `# m8 a' K
以下以获取海洋NPP遥感数据为例作个演示。
) `8 T# W: K8 T- S G- w #创建工作路径 5 g9 L& O T, v Z1 s0 P
yourfolder <- F:/R/nppr/vgpm
8 p) U6 v. C1 p5 D, L0 n dir.create(yourfolder) ; L4 m" F5 ?& e( A: O
#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm 2 `. |2 z9 D: c4 [' f9 j2 w
get_npp_vgpm( 3 ^3 m" }1 g6 s& ?3 _) M, I
file.path = yourfolder,
+ h! r# s4 P/ a3 @' y, f3 q grid.size = low, #指定low或high可更改空间分辨率 ) v1 ?& c& o- V& B
time.span = monthly, #monthly代表月平均,dayly代表8天平均
% s0 H$ \* k ]; e0 p) p" Z1 z* _& [2 U( u satellite = MODIS, #选择卫星 ! y! `' i: M& h- a U
mindate = 2016-01-15, #指定时间范围以下载遥感 ; x* q. r& B1 x/ U2 W
maxdate = 2016-03-15
5 O! ^+ O! K7 Y3 g1 A4 T ) 0 @" S) O+ N6 d& p8 T) [
 7 a- K3 H- R; t2 L
在这个示例中,我们使用nppr包下载了来自Ocean Productivity(http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.m.chl.m.sst.php)的基于VGPM算法反演的全球海洋2016年1月至3月的月平均NPP数据。 5 X# O# p0 D5 @+ f/ @& L7 i: o
使用nppr包进行遥感数据格式转换 ; l, D& C4 {) t4 F! c) k' m
如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。 / ~4 `; S' H9 [/ L2 `' Y4 D% U
#将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换
; X* D% W7 J9 ]2 o3 V$ f. j yourfile <- paste0(yourfolder, /201603.hdf) $ b; \# E1 W2 c
vgpm <- read_hdf(file.path = yourfile) 5 W+ {. l8 Z. r& k( j; |% W
head(vgpm) ) Q. X# \$ z9 ]9 q
write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE) 9 f0 F# n- z' e9 J5 e' w2 P0 s! b

$ X) y2 J$ O: P6 m$ |/ a- R 转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPP(var,单位mg C m-2 d-1)。
$ {; L2 M$ e% L, s3 g7 l6 s7 f) l: ?' Q 使用nppr包匹配目标经纬度的遥感数据 6 d, ^7 L9 x( s
默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。
* R6 K4 H' x7 J2 {! t #获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP " G1 a8 _+ i" j3 R7 i8 m
match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01)
* L; k) ]& p* N9 ` #或者同时指定多个数据,不再多说
0 v3 h9 v% E5 O+ s mydat <- data.frame( 3 \0 @* ^0 r! z& F
lon = c(120, 112, 116),
4 l7 s( d8 I8 {9 t# M lat = c(17, 15, 18), " F9 q- _0 _& s; H
date = c(2016-03-04, 2016-03-07, 2016-02-04) 2 ~; E% _! F6 q6 E) d6 i
)
. t/ F' L8 x1 D( V' R match_df(mydat, file.path = yourfolder)
) f2 P9 m+ q; C6 i3 J1 m# D 绘制遥感地图 # k/ E( p" q- g$ N
nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。 7 v9 u) e9 S: h- P# `; w
#上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式 8 t- ?" e& F) _( B- x2 g3 ~5 @2 h/ @
#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP 6 ?+ B( ]. d4 w, c
library(viridis)
9 @. B1 J# h- _: G4 Z- N! N6 ] library(ggplot2)
! n$ O* Q/ Z- i4 h0 N( E& P* f7 a ggplot()+ 5 x' p' P$ K4 n V
geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+ . ]6 D. y8 a- c% A& g5 j6 d* S
scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+
/ m9 G7 t* h( t' T. K& e$ P$ u" N' a labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*)))
7 V) x1 X$ a/ t5 R 
6 @# m' K9 t9 s- z4 k 根据时间和经纬度列表匹配遥感数据的批处理
: T- Q' {" t9 {: _# I4 }/ g/ t# v 实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......) 9 s- D' l- ~4 o8 W# o
将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。 ' c) R6 O( n% K- `4 _+ P

: W! ~( p' f9 f4 J; S 随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SST、PAR、Chla或NPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。
# J/ @; K( Y. s ##如下以匹配SST数据为例做个演示
( l- R& n3 J2 {8 d0 m dat <- read.delim(data.txt)
" m! L' {7 W. |) Y Date <- unique(dat$Date) #获取日期
m* q/ Y/ g4 @: H% U yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据
+ c+ I% Y5 G/ x' r0 G7 E dir.create(yourfolder)
+ A5 n+ _; l, f9 S4 U( i& s; C& P6 e1 _5 b #通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例) 3 [# p2 j9 }3 ^- b; m* q0 R
for (i in Date) {
& d9 Y/ k. G6 m8 @$ Z I! { yourfolder <- paste(getwd(), SST, i, sep = /) ' Q( Q$ B+ E8 ^) B
dir.create(yourfolder) . {8 @; D7 f3 o2 P7 G5 K1 w7 b
get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i) . T+ x5 `! {4 J. q0 p
yourfile <- dir(yourfolder)
7 u8 I0 Q, t2 x2 X2 V hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /))
' j E5 X# e; n write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE)
O& p% }; u, x0 F! h }
/ d H% p. |$ o) k0 b2 v, ^ #再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均)
& J, e) _* \* r q* u, y1 V2 p7 t for (i in 1:nrow(dat)) { 1 ~+ t' `# d F! @
Date <- dat[i,Date]
( K" L3 Q+ m) |# |! k yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = )
! \2 Z; R$ @( v2 b5 K hdf <- read.delim(yourfile) : z$ e0 g* t ]% D8 R( H
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), ] " w, E P" c9 N, C. _! {4 h5 d$ C" L
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), ] + s9 z1 Z2 a7 p5 I
dat[i,SST] <- mean(hdf$var) 3 u/ D1 T4 C/ X$ T7 A7 w
}
6 p* }9 j& E$ J) K write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE)
/ I% a d4 V& J. Z% x0 ] 
" q8 Y- V, D6 G" _4 c" @4 n a; k 输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。 * U: {7 K# N4 l* m% d# ^
" ^7 E1 R+ h+ q
5 K: a* O) p2 _/ a6 V5 r" G/ z: P6 E) d5 @; v
. z: H( `4 \, h: ~
|