使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)$ Y; G p' S @4 k
Ocean Productivity(http://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。 4 N. S5 O3 _- D' ?$ E7 l, |
- v( Z' [0 E/ `1 ~, j: h1 ] 本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。
# s! ^/ P1 {2 d# h; r; c- L 安装nppr包
+ O- n* A$ c. _2 @! }1 { 可在github(https://github.com/chaoxv/nppr)获取nppr包。
4 @5 I$ N: R) Y, j #下载nppr包
3 K, @; `5 @! f #install.packages(remotes) 6 G* z! I3 {+ Y
remotes::install_github(chaoxv/nppr)
* G( O' L+ H& n4 }' N" ]( _ #加载相关R包 1 C. O0 S; Z& e% N
library(nppr) 1 B4 Q6 `! q/ d) V& v8 f' A, L
library(RCurl)
9 ] ]8 k4 o2 @- \0 k7 n' J4 S/ V: K; D5 @ library(XML)
3 j' r* X/ c. P library(R.utils)
* H+ ]/ ?8 x. g$ J6 N8 H, | library(tidyverse) 2 o u* y T( S; R
library(lubridate) - ~8 l; d( r0 z: p) D
使用nppr包下载海洋遥感数据 / y0 Z* p* V3 Z# g* @) V0 O
nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素a(Chl a)、净初级生产力(NPP)等遥感数据。 4 w3 h1 C) ^( B# N, ^7 q' f
8 z9 \; p" u. _7 `9 E% u
以下以获取海洋NPP遥感数据为例作个演示。
/ z; D' q4 O# _% R/ j #创建工作路径
) W4 Y n( G8 D; H% E yourfolder <- F:/R/nppr/vgpm
' m; M) S6 d5 L, W7 Z F8 z dir.create(yourfolder) 2 V( s7 x1 p6 ~, J/ u
#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm ) P$ I7 Q+ A% \* g* g8 Q7 r
get_npp_vgpm(
4 F8 M9 c8 {, T/ ] A file.path = yourfolder,
) q) L& V8 @/ ~9 `. s2 i' F, D* C grid.size = low, #指定low或high可更改空间分辨率 ' O# n" ]9 N- ~& |
time.span = monthly, #monthly代表月平均,dayly代表8天平均
# \; n0 z, a5 I satellite = MODIS, #选择卫星 ( ~; ~: T2 T* h: a! y. t
mindate = 2016-01-15, #指定时间范围以下载遥感 2 I& x( J. e( o7 J
maxdate = 2016-03-15 : z5 C' b' v* ^' b& X, s& j
)
1 X' _& k$ ]7 X$ }( U ( Q7 w2 X+ d) L+ c( M( p- 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数据。 # B3 i0 s$ ?# |: k5 \ d
使用nppr包进行遥感数据格式转换
; Q$ T' Z& T2 n2 A% Z( i 如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。 : K- ?5 \: b$ S l! A1 x8 _1 T. V q
#将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换 ' r) _- |9 a! M% B5 k
yourfile <- paste0(yourfolder, /201603.hdf) 8 V7 G" H6 [, {2 n* A$ O* a' M6 E; A
vgpm <- read_hdf(file.path = yourfile) ! _6 U1 ]0 h5 n4 n) d1 f% |2 z r
head(vgpm)
( G# h. f& G% H. A6 j write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE)
* r3 }# D# Q. t% k! s* U 9 Z: V! o0 e% C r. X
转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPP(var,单位mg C m-2 d-1)。
6 @% V: k* I5 K8 z 使用nppr包匹配目标经纬度的遥感数据 , [# `( _9 r% ^4 \; u+ h) x
默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。
0 J( n0 O; @: ^4 e5 v #获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP
, [5 v, S+ O5 N% j6 |* h match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01) 0 }7 X q+ |1 b: F6 K
#或者同时指定多个数据,不再多说
" q ~! M6 P; T. w5 V ] mydat <- data.frame( " ] W: a8 R6 [1 b) B6 @( j. ]
lon = c(120, 112, 116), 0 g: s- |) P! |* @
lat = c(17, 15, 18),
( v/ h$ W! J( X& E6 f& x! U date = c(2016-03-04, 2016-03-07, 2016-02-04)
; T- g, _6 W5 r$ o )
3 h) n J/ g! x match_df(mydat, file.path = yourfolder) . E6 |% r; u5 x. I
绘制遥感地图 0 u1 R% |3 q: I! u8 Z- Y
nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。 # V6 g$ D' k5 O4 l' G, A0 H! U
#上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式 ) C; O6 ]6 f1 P: h+ f2 J
#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP
c# O3 T* H+ ?, u& A library(viridis)
: }3 Q6 q! ~3 W6 ?# K3 m library(ggplot2)
I0 `- P- V W5 N f ggplot()+ 5 q! J% W, J: u* q
geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+ # F4 D5 u, H" Z( m4 W
scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+ ) a. b. t3 L1 A/ {$ D, s0 x) J
labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*)))
; f9 @6 @/ V" n7 J8 B) s9 M. ~ ( T) N: m) v3 y- l0 y' P6 w, d' E
根据时间和经纬度列表匹配遥感数据的批处理
7 U6 O# S8 u7 h 实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......) ' I& d2 \' [+ R- {
将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。
1 E! @8 ]; J# U* o5 z! M( T # o) H0 A; u) d& s. I2 X/ @- m
随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SST、PAR、Chla或NPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。 ; L- c# r- G; Q1 d& K9 ^1 i
##如下以匹配SST数据为例做个演示 $ O; M! q3 r9 s
dat <- read.delim(data.txt)
2 q0 h; n0 Q* ~; o1 n. W B Date <- unique(dat$Date) #获取日期 7 y) t& b1 |$ F A$ F& K$ V
yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据
& e/ J! ?3 N$ r! o dir.create(yourfolder) ; u$ W! B' I4 C' M! w$ }8 ?9 d0 O' E
#通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例) / L$ J! O6 |1 i
for (i in Date) {
6 y3 L5 @: M2 ~6 @% e7 g6 u6 B yourfolder <- paste(getwd(), SST, i, sep = /) 5 j5 q' l7 o5 L$ n" z
dir.create(yourfolder) : @8 ~+ ]$ C- w) _
get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i)
- y1 w7 m b5 F2 X$ ]$ d yourfile <- dir(yourfolder)
0 R3 n! }9 B8 x# q. ~6 ` R9 a$ [ d hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /))
5 _9 b# y9 z2 [. v write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE)
9 n" f" F0 I& d. u5 x }
- @; U- @1 L9 N6 h1 a #再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均)
9 s0 }9 }- a8 |/ \5 R& t' B, f for (i in 1:nrow(dat)) { / P* I8 S0 c# X
Date <- dat[i,Date]
* [6 d" n% _0 [1 A. G* T" I! H- K yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = ) : J( J+ F3 p* G, J2 d- p% Y$ J
hdf <- read.delim(yourfile) * V* g) v% [, r3 Z+ n3 Y
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), ] " H' z6 Y( Q% |) \" f
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), ]
3 M( `2 l* e0 u$ L dat[i,SST] <- mean(hdf$var) 3 u; m- [0 K$ i. h8 c/ w' ]% b' h
} ( A/ c% k- i, w) B2 I
write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE) * n* b$ H( V3 m- |/ B
! [7 @, j' p1 B 输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。
h& C) D* O: ?& w s; U8 _. {$ _ x
: T: v" H0 N# o: O% C+ N0 ~5 H" _3 ?0 b1 U7 a! F
& |; L7 ^) r' ^+ l. ^, l
# n6 Q5 Q/ C1 U | k |