使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) - 海洋遥感数据处理

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) * J! g- b W1 o( R+ b0 o k) t

Ocean Productivityhttp://sites.science.oregonstate.edu/ocean.productivity/index.php)是一个众所周知的海洋生产力数据库,我们经常从中下载相关的遥感数据来用于分析。

$ j/ C. R, M9 |# D

- O, t1 B4 R' n2 ?5 L

本篇介绍师兄的一个R包,nppr包(https://github.com/chaoxv/nppr)。该包提供了便捷的函数,可以用来下载和处理Ocean Productivity的海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素aChl a)、净初级生产力(NPP)等遥感数据。

% n, s! t* G C7 f% X) Z' ]

安装nppr包

( w3 u5 s" `9 o

可在githubhttps://github.com/chaoxv/nppr)获取nppr包。

' y a, L, V1 Z6 i

#下载nppr包

8 o( j1 Y- f; m- Q! h( P6 s* r

#install.packages(remotes)

6 V- C9 N& g/ w" w

remotes::install_github(chaoxv/nppr)

% f9 g/ ?2 y) c- S8 F( {7 ?

#加载相关R包

7 `% `8 h s: c; ~% I/ _

library(nppr)

( k. k3 R" j f( c- J& Y

library(RCurl)

# z+ I) d8 }9 A3 h

library(XML)

: j0 d! [5 g: Z" d+ I- G9 y9 B3 t: w1 k

library(R.utils)

0 T) M! |2 ?! r5 s/ S

library(tidyverse)

7 y- H- l' d/ P8 i$ q

library(lubridate)

. [( }1 v& I m0 F- H' I8 o

使用nppr包下载海洋遥感数据

3 i5 H4 |/ X" y0 r+ |

nppr包内常用函数如下所示,get_*等函数可分别用于下载Ocean Productivity海洋表面温度(SST)、光合有效辐射(PAR)、叶绿素aChl a)、净初级生产力(NPP)等遥感数据。

. W! U. p) z+ B c. Q) A+ I$ J- K6 ?

( B6 i+ U/ k+ P' l5 W7 t

以下以获取海洋NPP遥感数据为例作个演示。

/ k( L6 ?1 \- _9 a9 q1 k& [& T

#创建工作路径

6 C; z* E) T! O

yourfolder <- F:/R/nppr/vgpm

' D" Y2 s+ C6 V0 G

dir.create(yourfolder)

# W7 v! [/ d+ t) V

#以VGPM(NPP的一种遥感算法)为例做个演示,详情?get_npp_vgpm

! R5 [; g& v$ t3 v' U3 |$ p- Y

get_npp_vgpm(

% ?/ A/ q! b% t' w. Q2 Z

file.path = yourfolder,

' z& m$ T( C% M' ?

grid.size = low, #指定low或high可更改空间分辨率

7 x% t) B% y$ z2 T3 S* j" c& S/ q

time.span = monthly, #monthly代表月平均,dayly代表8天平均

: Y3 f# s1 z2 q7 C; D# F ~

satellite = MODIS, #选择卫星

! V x- n: z$ v) v3 i/ a

mindate = 2016-01-15, #指定时间范围以下载遥感

* a* H0 M- S: a3 b- n

maxdate = 2016-03-15

& D! d0 V9 i# z9 w- L: ^7 e6 Q$ A

)

6 Q1 b6 R0 |; Y# b

* ~. P6 e9 S3 D

在这个示例中,我们使用nppr包下载了来自Ocean Productivityhttp://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.m.chl.m.sst.php)的基于VGPM算法反演的全球海洋20161月至3月的月平均NPP数据。

/ A' ]" ]/ S) g1 }9 v1 ?9 Z0 b

使用nppr包进行遥感数据格式转换

* Q, g0 K& _+ T; D" ]/ [, R4 t s' f

如上所述,下载后的遥感数据以hdf格式存储。nppr包提供了便捷的方法,可将hdf格式转为常见的数据框格式,便于我们后续操作。

- p' U5 y3 q6 `) P6 S

#将hdf文件转为常见的数据框格式,例如将上述下载的2016年3月的月平均NPP数据做个转换

7 w; e! a$ t. Z6 c% b' H8 o

yourfile <- paste0(yourfolder, /201603.hdf)

' t: M3 j8 e2 ~# U9 h0 B

vgpm <- read_hdf(file.path = yourfile)

. h; C& @% x x1 ], G! H0 ?9 e

head(vgpm)

. J+ W. u% c$ n& r: Z6 Y

write.table(vgpm, vgpm.201603.txt, sep = \t, row.names = FALSE, quote = FALSE)

* k1 T- G. U4 j( N8 T2 T) g

0 \2 R: E3 ~, m8 R3 \ G( y

转换后的数据框包括三列,分别是经度(lon)、纬度(lat)以及当前日期内该经纬度海区的NPPvar,单位mg C m-2 d-1)。

# k+ R0 O4 V# D2 `. z& B! @- \

使用nppr包匹配目标经纬度的遥感数据

/ D- ] _' V9 o" {' C1 t# X

默认情况下,下载的遥感数据是全球海洋的。nppr包同样提供了相关函数,便于我们从中提取特定区域的遥感数据,如下所示。

6 ~; M, R3 {4 e& R: f' |- J9 w

#获取指定日期和经纬度的遥感,例如在上述2016年3月的月平均NPP数据中提取120°E、20°N的NPP

3 w3 v8 p( o0 K5 P$ \8 N9 Z

match_sig(file.path = yourfolder, lon = 120, lat = 20, date = 2016-03-01)

/ _6 W' H5 [! }9 P" P3 _, f6 J) J

#或者同时指定多个数据,不再多说

5 x% b2 t2 g2 c# m' F+ M

mydat <- data.frame(

' |! |6 e6 h4 W3 g p7 U

lon = c(120, 112, 116),

4 w! h2 j2 p+ `" r, v

lat = c(17, 15, 18),

5 n# M0 I {4 n) A9 s: ^

date = c(2016-03-04, 2016-03-07, 2016-02-04)

( @5 H7 @- h& h/ z; }+ C$ {9 g

)

3 x' e( V2 z* ?& f" @% M/ H

match_df(mydat, file.path = yourfolder)

# |9 W8 K3 x" R7 t( z! d: X+ Z

绘制遥感地图

; d2 O) ?/ R# [( Y" m/ [: c

nppr包的函数geom_oce()可以用来绘制地图,例如我们作图展示来自遥感反演的NPP分布。

- K; @* o9 u' X- o) @

#上述已经将下载的2016年3月的月平均NPP数据转换为数据框格式

* p' ~$ x; y! S" d

#我们仍以该数据为例作图,展示中国南海2016年3月的月平均NPP

+ S! K! r3 }; N7 Z p" j

library(viridis)

5 r3 h9 P+ U& M* Z

library(ggplot2)

/ I" A9 Q6 N4 i1 E9 ]. i0 D

ggplot()+

" d+ _) z( {8 W+ u4 ]. U

geom_oce(vgpm, aes(x = lon, y = lat, fill = var), lonlim = c(100, 120), latlim = c(7, 25))+

, `8 T, N2 T' t5 }- U4 F$ y

scale_fill_viridis(option = D, direction = -1,breaks = seq(50, 1050, 100), limits = c(50, 1050))+

* p5 c$ y: a0 {# r2 A5 u7 d2 h2 u

labs(x = Longitude, y = Latitude, fill = expression(NPP*~(*mg~C~m^-2~d^-1*)))

6 H0 h4 N3 ]& W* e/ `" u

w6 p( k( {# V3 z N% H" _2 F# F

根据时间和经纬度列表匹配遥感数据的批处理

6 J1 u( _3 w8 ]3 L1 I' Z1 g+ j) g7 ?

实际情况中,经常需要对来自不同时间不同经纬度的大量站位匹配遥感,以下提供了一个批处理(不过这是自己先前瞎写的,然后一直偷懒一直用,俺也不知道写的对不对......写在这里仅为方便自己复制粘贴,大家慎用......

9 Q0 V, c6 ?$ M* {& T" B% {2 T

将待匹配的站位的经纬度、日期信息整合在一个文档中,如下所示的这样(本示例命名为“data.txt”)。

; ^) ^2 P. ~9 Y q1 o% k" R$ K

. A2 ~8 C+ M& ?8 t: r2 _: |

随后在R中读取该文件,设置一个循环,依次读取日期信息以下载当前日期的遥感(如月平均或8天平均的SSTPARChlaNPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以0.1°为网格进行匹配,并将网格内的数据平均)。

. r4 ?8 l0 P; P) h6 c

##如下以匹配SST数据为例做个演示

* V- F/ u! Z T1 \: ^4 W

dat <- read.delim(data.txt)

' b: y' u; ?8 B2 x

Date <- unique(dat$Date) #获取日期

2 n# ] ^+ z- I/ t" e

yourfolder <- paste0(getwd(), /, SST) #在当前工作路径下创建新路径以存放遥感数据

- \! }8 j; u7 W

dir.create(yourfolder)

" B! i" e1 D5 O# p' O

#通过循环依次获取各日期下的遥感(本示例以下载8天平均SST为例)

& Z: K$ F( Y& t5 j& g0 A) j: ]: a8 z

for (i in Date) {

9 h$ ?; C) i6 s3 V

yourfolder <- paste(getwd(), SST, i, sep = /)

! w0 u9 z5 f7 i! K( G

dir.create(yourfolder)

9 y/ }: r. N* o7 b

get_sst(file.path = yourfolder, grid.size = low, time.span = dayly, satellite = MODIS, mindate = i, maxdate = i)

" {" R9 K1 _3 D0 ~) w. O$ A

yourfile <- dir(yourfolder)

/ M( K7 Z9 y5 m! s) d: c

hdf <- read_hdf(file.path = paste(yourfolder, yourfile, sep = /))

# I4 W E/ `# I# |% r& T

write.table(hdf, paste(yourfolder, /, i, .xls, sep = ), sep = \t, row.names = FALSE, quote = FALSE)

l4 q }$ b4 }; I, l) L* A/ i7 k

}

8 j" ?4 f+ j h3 j' ^

#再根据列表中各站位的经纬度匹配当前日期的遥感(本示例计算0.1°网格内的平均)

9 H1 J3 c& t1 J _ B' N" h

for (i in 1:nrow(dat)) {

\) J! v+ x0 F& D

Date <- dat[i,Date]

9 i; s" e7 d% d% t% U) F

yourfile <- paste(getwd(), /, SST, /, Date, /, Date, .xls, sep = )

. q0 j" r6 v$ L6 g

hdf <- read.delim(yourfile)

+ U6 ]1 J4 m. [. 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), ]

3 A% \2 [( c: q3 w# b( E& e 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), ]

1 I: R# P6 H; \4 ]

dat[i,SST] <- mean(hdf$var)

3 L3 a, _+ s& O7 n6 r- M$ C9 n

}

: p- B0 s8 `3 N! t# `) Q6 U/ B( i. y* |

write.table(dat, SST+0.1.xls, sep =\t, quote = FALSE, row.names = FALSE)

( q! F2 n3 I1 y e% E* ^% H) o' l6 y

0 D. }( r5 m1 j* J& N3 d

输出列表的最后一列添加了匹配的遥感数据(本示例匹配了SST)。

3 R0 f5 O$ T: |) P5 j# }9 X * _0 p( d8 _: {+ _( @7 b1 D% w7 A+ C2 J; F1 \% M: V% K; N 6 H4 L, t* ]6 e / K( A# \( Y' g' V4 f
回复

举报 使用道具

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
黑泽逢世
活跃在2024-11-16
快速回复 返回顶部 返回列表