使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) / }. m- N7 {2 U% L
Ocean Productivity(http://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。 # ?& v# A3 Z" M8 f
 " K/ n) ?! L6 m) h& f
本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。 ( K' S* M- q# J6 c. I1 T% u" J
安装nppr包 9 A q* j+ e9 Y1 l5 [) x _5 ]+ A
可在github(https://github.com/chaoxv/nppr)获取nppr包。
+ _2 q; z6 c# V, ` #下载nppr包
0 [9 s! C0 C4 I/ F4 | #install.packages(remotes)
$ m( b1 O" G( g" |5 G* P; o6 Q# w remotes::install_github(chaoxv/nppr)
* u8 K. ^3 }7 P8 ]7 u! Y' W #加载相关R包 6 i" ]; n7 s4 p3 }' L. l0 K
library(nppr)
7 J8 K( o5 f7 ]2 x. o i library(RCurl)
; E/ ]3 m: K- O8 {8 i0 O2 m) h library(XML) $ p/ V2 @) i- ^& a( H# A
library(R.utils) 5 B+ s! o4 R5 V% U9 ]. G
library(tidyverse) Z8 R2 F/ H3 F4 f7 s
library(lubridate)
, }9 G) F3 \% }( w; s+ N6 v 使用nppr包下载海洋遥感数据
6 ?# ~+ ]/ e7 ]% x nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。 1 W& ~# E+ J0 K9 A
 " z% i( r) U2 ?8 p1 @& r" u
以下以获取海洋NPP遥感数据为例作个演示。 * u5 G8 P% F. b# ^3 `
#创建工作路径 ' |! ~ J! \; H8 k2 W8 U2 M
yourfolder <- F:/R/nppr/vgpm 1 u% ?7 n: r* \4 s7 _" w( h
dir.create(yourfolder) m9 U6 v. J( [1 N, B
#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm 9 G8 [: S1 s5 W
get_npp_vgpm(
5 c8 h1 ~, Z0 J* D file.path = yourfolder, : J/ d8 A; Z. M) X. h$ N8 T6 Z
grid.size = low, #指定low或high可更改空间分辨率
, a- z9 g7 D1 J7 ^ u, O- O time.span = monthly, #monthly代表月平均,dayly代表8天平均
6 t# K4 @% W! A& ^$ z satellite = MODIS, #选择卫星
- i$ |4 ^& R' b& D- Y* t% f9 P mindate = 2016-01-15, #指定时间范围以下载遥感 e# e0 O+ ^, x1 G% p# X6 P
maxdate = 2016-03-15
% c% f+ d) ?" [ )
) Y' \- s" h: c 
5 [( p" p) y, B: Z' z5 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数据。
/ R! W1 i. D- x4 x9 O3 u 使用nppr包进行遥感数据格式转换
0 }2 G/ {6 \. S* t& s% l 如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。
! T* X5 E, }6 v& K6 z3 l #将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换 # r/ ?% z% a3 R) ?! d: c$ r n/ v
yourfile <- paste0(yourfolder, /201603.hdf) 3 ^# i, d z- U1 f: x; V2 I% v
vgpm <- read_hdf(file.path = yourfile) 6 G/ @* @9 s Z6 w
head(vgpm)
2 T/ [" L6 Q, f" @ write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE) 8 U$ q% ~, V6 Y' A E

" l- v r6 R) w& F) T4 p: \# r 转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPP(var,单位mg C m-2 d-1)。
9 [9 j* _; X4 H& y/ ^ 使用nppr包匹配目标经纬度的遥感数据
! V; ?1 E1 I3 \+ } 默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。
) u) w3 _4 N! j; B #获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP , ~* `: R# A/ U9 h' @" L$ U8 z
match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01) 7 Z" O$ |' y r2 U2 w$ l
#或者同时指定多个数据,不再多说
: ^7 c) ?; F1 i5 d P7 { mydat <- data.frame( " } F" V! C1 T2 t9 |, a/ t
lon = c(120, 112, 116),
! B4 z5 ~; U1 n, P lat = c(17, 15, 18),
8 a( [, J5 t) U0 E ^ date = c(2016-03-04, 2016-03-07, 2016-02-04) 3 `1 s) j# U6 a
) " ^8 J# t+ ]+ b
match_df(mydat, file.path = yourfolder)
) `' T s/ \ Y. x9 J* Z 绘制遥感地图
9 E& {' u \2 y! o nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。
! h/ y3 C7 B" M+ u- y1 x: G #上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式 . ]6 [8 @" m$ v- a4 J) Y, l
#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP
6 N- s. w9 O A! B- `& R; H" F library(viridis) * o" o$ m3 W' k J6 T9 p+ B( ?/ `
library(ggplot2)
# g+ k# H" J' D7 d' u3 s ggplot()+ * n8 |, W( V9 h1 A
geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+ 9 V/ d) K; \" u' a6 ~0 J
scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+ ; _% B2 Q( \; |9 b% _2 w
labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*)))
! E+ Z% A, n6 r5 q  3 S: {6 w% A3 U) ^8 }; o
根据时间和经纬度列表匹配遥感数据的批处理
; j- ?1 A, a/ O/ F 实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......) 1 V5 x5 C2 C7 d( w" w
将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。 4 d% p6 B' A4 N: o+ C
 0 i! w8 f' w: s6 h: ]- V2 {
随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SST、PAR、Chla或NPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。
" p6 K# K$ Z# t C: \+ ^- S ##如下以匹配SST数据为例做个演示
8 n2 t3 T1 V/ N7 r dat <- read.delim(data.txt) 4 E3 Y# y% R4 L# K
Date <- unique(dat$Date) #获取日期
$ i/ z" Z7 ?5 S yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据 9 j3 `% ]+ e6 r" |% W* k- ]0 w9 x4 k
dir.create(yourfolder) 8 n* i0 _+ H4 e- R+ D: [
#通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例) ' r5 ^. C0 K: q" ^1 r$ y/ T
for (i in Date) {
; v$ ^& k$ s$ _% B+ Y+ G yourfolder <- paste(getwd(), SST, i, sep = /)
3 U, C, r& u* m4 ]% p. P dir.create(yourfolder) . `! B) \2 b8 m
get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i) / y3 v4 s+ s1 k2 Z
yourfile <- dir(yourfolder) ; u( c3 S9 ~' j U9 T0 M
hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /))
. U j+ @6 s5 U U& } write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE) 1 t: P: `0 s# s f" X3 M& K4 b
}
4 Z+ Y3 s9 b8 M r2 e #再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均) I. y, ] n' ^, W# L. g* E; `
for (i in 1:nrow(dat)) { / H8 }5 `" Q) Q# O- Z
Date <- dat[i,Date] 6 M7 A5 |/ |3 B/ r3 A* M+ t
yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = ) # ~4 [7 G. h1 W, u
hdf <- read.delim(yourfile)
' m$ ^1 `8 J" v3 Q' m o 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), ] ' y# [# `( Y" e5 W! \
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), ] ! } _( U3 `& G+ b6 O1 s
dat[i,SST] <- mean(hdf$var)
/ K4 l, q9 Y P6 x }
1 B# s( D% P( L4 { write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE) 2 e* @. }4 d9 R! q& L( H* U5 j, C

9 g3 o% [) C8 o: A" f 输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。
4 }1 T+ O9 J& @! |. G& V4 o# i3 F# q7 R% N& ]& j3 U
$ c3 p! E9 R, P! _4 i2 l
0 a. O2 z6 z K, L1 D& j. u" h0 |) i# [7 |; z6 a
|