使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)
6 H0 ^1 l% c$ |( O% _6 u8 x Ocean Productivity(http://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。
8 q: i! ^5 G9 M0 y" v7 x9 d0 Y. A' t  ; W0 d! Y" K7 O* X) L( ?; w- Z
本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。
0 W6 F& D9 c! O1 `$ X: K! d 安装nppr包
! ^- O2 v+ \6 N9 n/ u) \- ]) F 可在github(https://github.com/chaoxv/nppr)获取nppr包。 - \3 B6 C o6 O* L
#下载nppr包 7 G3 l8 ^1 k3 b0 a
#install.packages(remotes)
3 @) _0 h! K- \. d2 @( E remotes::install_github(chaoxv/nppr) ; |2 P! h; j) W+ e+ ~( { p
#加载相关R包
+ [. N. j# o+ X3 \& _' r library(nppr) ) O) l4 K E" H8 o. y0 G
library(RCurl) . U: g7 r y4 o0 A+ ~- `& @3 E
library(XML)
1 s" H! `! H6 X, J C: j8 {' \2 f library(R.utils) " B0 e _3 m: ~- J6 V/ |* y7 B
library(tidyverse)
: d/ f- i& _& c1 F0 O library(lubridate) $ j9 q0 t1 r6 H& W7 \. D, a; }1 Z
使用nppr包下载海洋遥感数据
+ q& m5 D" `; Y: O nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。
1 e% X4 r$ s& {8 p  1 }, S( N7 y' ~; s9 R
以下以获取海洋NPP遥感数据为例作个演示。
! l- h2 A8 O; F* K' z: q j #创建工作路径
+ \7 `1 e) a0 C# V7 r yourfolder <- F:/R/nppr/vgpm
! T& ^/ f' E! `7 ^ dir.create(yourfolder) . Y3 [1 E8 y4 f+ z
#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm ' N7 W3 u# h, y( I- G# C
get_npp_vgpm( 3 n( p. H* o4 d K9 z
file.path = yourfolder,
+ I: U9 q! y* F) N! v( e/ e; K grid.size = low, #指定low或high可更改空间分辨率
6 }! }/ C+ i l$ }; J& e: S time.span = monthly, #monthly代表月平均,dayly代表8天平均
% L* s/ u w: Z satellite = MODIS, #选择卫星 / x. d4 m( g# Q6 T' Y: `$ d9 P* x5 `
mindate = 2016-01-15, #指定时间范围以下载遥感 ' H) D# |5 S v
maxdate = 2016-03-15 ) ?3 ]# V1 z8 j2 @: Y' v) [2 s
) ; z& F# C& c5 x- b

9 n5 `6 q2 o& L" Z2 |. m 在这个示例中,我们使用nppr包下载了来自Ocean Productivity(http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.m.chl.m.sst.php)的基于VGPM算法反演的全球海洋2016年1月至3月的月平均NPP数据。
& \# z( k* z2 u' O- e2 v8 n 使用nppr包进行遥感数据格式转换 $ @8 }6 E; C* d% E$ a7 x
如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。
8 h0 ]1 i. C2 ^: C5 l! X3 V, C+ I4 K #将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换
" W# {/ Q# `: Z- M- \! L yourfile <- paste0(yourfolder, /201603.hdf)
2 }4 m4 D j4 v! \* A0 a- m vgpm <- read_hdf(file.path = yourfile)
" {% V9 Y! q' [5 h9 ~ head(vgpm) 1 Z/ P8 O' @0 L) R/ b2 A' ~' W
write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE) ! ? y5 l6 u! d4 \; n
 3 ]' g1 H( P( Q+ B7 G5 _# W) L$ K
转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPP(var,单位mg C m-2 d-1)。 # @' Y* L! n) C6 ~
使用nppr包匹配目标经纬度的遥感数据 3 J) Y; K8 g" O9 P
默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。
' W6 ?( [6 J$ u s4 f& l4 S" T9 B, _ #获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP " v0 g6 ]" e9 e% T" d
match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01)
# O6 q% w7 O( n9 } #或者同时指定多个数据,不再多说 5 D; E6 p$ [& y; {" Q& c# b& I
mydat <- data.frame(
& O% S' | j+ I: R lon = c(120, 112, 116),
* B# X8 t1 U6 b1 T lat = c(17, 15, 18),
9 m/ h1 X4 ?+ d( y# f" ?! h+ q! H1 O date = c(2016-03-04, 2016-03-07, 2016-02-04)
1 a) p6 p) f( {" d: v' M ) ' X k" x5 T# m4 E W
match_df(mydat, file.path = yourfolder)
* z; c* R. v. |* u 绘制遥感地图
2 Y9 Z" T4 ?/ ]9 a0 S- v5 |, S* Y nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。
; J" _; `9 m, Z# s1 ~/ M #上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式 4 v) Q* ]7 Q1 P
#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP
8 m" {& @3 H5 u/ l library(viridis) x3 w3 l" |* \& f$ ~ Z
library(ggplot2) 6 L' o) s* ^ W+ C- [; x, y
ggplot()+ # Q% \' O$ z( Y7 B' D5 |
geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+
% j8 f3 C+ F+ g! |; D scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+ & g, K& I9 W+ {9 R- v
labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*))) ) ?, M( _$ z! c, B4 X
 2 C5 W. l! j. ^ _" m# [$ ~. h
根据时间和经纬度列表匹配遥感数据的批处理
) o" Y* x4 n9 i/ v7 x1 I 实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......)
4 M4 n6 T, B) j$ U1 c' @ 将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。
- H, g* O$ j. _9 P, @2 c  0 E* U- B8 [( D9 b$ {+ o, ^( V
随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SST、PAR、Chla或NPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。 - i2 o% W3 b. @' K
##如下以匹配SST数据为例做个演示
! n. o% j- T. k dat <- read.delim(data.txt)
7 V, c9 |- U: k# P9 K1 M Date <- unique(dat$Date) #获取日期 1 s- m' ?( {0 r8 R! x' M
yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据 3 q, @2 X! q$ ]" F
dir.create(yourfolder) , _& Q. E0 {! z' e; B7 ~
#通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例)
0 E# a: a" r$ N: q for (i in Date) {
6 P$ S. u: j5 u! J: n yourfolder <- paste(getwd(), SST, i, sep = /) & R! c& l" a. B
dir.create(yourfolder) / R: P% I5 f# b+ ?: u1 X8 L0 n
get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i)
5 I8 M0 l* N8 x9 k yourfile <- dir(yourfolder) / H" x9 w7 c$ x" m
hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /)) $ c6 Q" O; G6 q# s
write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE) * x1 L% @& e; a' V: ]2 c _8 |8 p/ o
}
7 W2 ~, X) \0 T0 b* g #再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均)
# `9 F- A: K s, k1 O h [2 f for (i in 1:nrow(dat)) {
* Q# T: @9 c- C: @$ T+ y( t/ y Date <- dat[i,Date] 4 N4 ?5 ?2 j4 j
yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = ) % A# Y* X; U# N" E" q: d
hdf <- read.delim(yourfile) E5 H( [. f& r, A9 ?
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), ] % p4 O1 P. @6 {( X- r- m5 ?5 T
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), ]
" |2 H0 o0 B/ x/ a/ M9 A dat[i,SST] <- mean(hdf$var) $ M' b* t K: _+ ^; x$ u
}
. ?9 Q% I, C: V write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE) W- \1 J5 d8 u0 t

) e/ Q6 s% T) S+ h& | r3 Z 输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。
! l! C' C1 g8 a) W) Z x4 e3 ~
9 R) V5 L4 D2 x9 |+ G4 M" L8 j7 Q. [! i# ^
* `2 U, k% a3 V$ \8 C2 ]
) h1 X. a2 a0 h! u& O |