收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)- B1 h5 b3 c( h

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

3 w9 e, y r8 ~! {+ O

3 W5 P s) Y. x# q: J0 y- v! S6 [/ D

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

m, j2 M# C* R9 t

安装nppr包

2 h; Q( g, B7 q2 Y' \

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

0 Z! l/ B6 w' b# G' O6 M

#下载nppr包

% p9 }3 p n6 K$ V( h

#install.packages(remotes)

T$ j8 V' z; `9 \

remotes::install_github(chaoxv/nppr)

; B, m0 x/ y4 i1 L0 V& L' x

#加载相关R包

; D! i4 x3 @ u: [! b

library(nppr)

8 {% z* n: r: U1 C3 m# T

library(RCurl)

7 |) \0 f& u8 O' `* f

library(XML)

8 Z# w# `+ ~3 ^5 j# }$ I2 @0 I

library(R.utils)

# o! [# G7 v" y, K' r3 z

library(tidyverse)

8 \# r' _6 T4 T; A9 `% O: q

library(lubridate)

7 Z" ^$ Y+ C- t' H% ]& E( N

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

- K1 Q% g" Y- l9 S, f6 o9 y* F

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

$ t/ D p! ^" M7 s* }* m5 Q

" A% L7 ~5 N5 k% a$ n

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

( W6 u( D" v) H6 b; \( E. ^ z5 J, r

#创建工作路径

* t# m$ }5 m; c# m% q

yourfolder <- F:/R/nppr/vgpm

# b* m9 U. d# s, Q' x, Z7 z

dir.create(yourfolder)

! M/ ^; j5 B8 [: ?

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

% K6 w7 p6 w1 I6 i

get_npp_vgpm(

( L8 v2 J+ F/ Q* n

file.path = yourfolder,

v: j# d4 w; ~: J v1 [1 p

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

A: _: V5 l% |

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

" z! H H) ?. M# D6 [0 o

satellite = MODIS, #选择卫星

5 i) M0 U+ D7 p( P; @2 a8 o

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

' H7 h: \$ {) a. D! m, a' v

maxdate = 2016-03-15

4 u5 F8 M5 q% W( Z: d0 h6 `

)

/ ~4 X5 x: J4 l8 c, p! p. G2 ?+ b/ }

- j) h) i/ v% n @& I- A2 U4 p+ M! T

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

( a. C7 M1 s, }" s8 a( i

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

8 k8 v8 _- p9 Z

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

7 B3 I7 H4 ~/ a P4 S) Q

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

0 R7 V+ I! }8 j/ D; c

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

( K* K: D/ o( M- P% b u1 `+ O

vgpm <- read_hdf(file.path = yourfile)

4 H6 y) b7 v) l% X7 E- L2 u: i

head(vgpm)

( O% t5 a& B) |8 M/ C5 }5 \5 l

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

8 C9 `1 _( j% Y: Y2 ?; W4 |6 f

% P; v! Y4 ~: E. N

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

. `# p" a: @( n- \1 M

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

1 T9 Y$ _( c v6 {2 V# r

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

) k( l; \! ]! P2 s" C

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

; }6 X( H% |2 w, W- d7 A

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

, e% W: W0 _2 ^0 d5 u8 S& C' Z6 V2 m

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

6 f% k0 ?) G" {+ a. @

mydat <- data.frame(

/ r; U) G# f' O- D* N& D6 p5 W

lon = c(120, 112, 116),

. P: s' |9 p' [ G4 M4 s, F

lat = c(17, 15, 18),

2 E0 F3 m- F6 U1 j" F& x: O

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

2 b' g$ V1 t# [5 n& a1 b4 b

)

& l7 X! G7 q/ w( l

match_df(mydat, file.path = yourfolder)

1 U. s" X& }- {% ^ w8 v+ L

绘制遥感地图

% a5 H. `+ z+ x( C( U( [( d

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

8 D, l! n/ } F4 K: k8 N! G2 f

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

8 ~: Y6 i) A6 t( i9 }. b4 {/ m

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

. y* v6 o/ r" P7 `5 P2 |

library(viridis)

1 Z( f3 D6 p0 U

library(ggplot2)

. V6 j: z% K$ ]' {8 O

ggplot()+

( t9 g8 H D5 ?% Z6 d0 P# n

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

( S9 n+ [+ X ~5 j" ~

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

. N1 I P3 v, |4 d8 _( u. |) }& h, K

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

/ s! D6 @4 u' e% L' T; T

' G6 \4 }2 ]0 r; ?- v$ M; d& f3 d& D

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

( \) o1 s& y* D- \& Q

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

7 Q' T) X' R9 G0 T

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

$ f8 \* M# @' t

; u! f* a0 d( w- c0 ^$ B! C

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

7 V! t+ r3 V+ A

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

& r6 D, h2 B) k

dat <- read.delim(data.txt)

- f9 _8 G* n6 y/ y, Y

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

$ J0 P$ ?- ]/ h* e3 Q

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

" e1 x3 n! @( V, A) A! ^

dir.create(yourfolder)

9 b& X, `6 d, n+ b" o: ]1 Z: m# s

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

?# h8 z* c' P

for (i in Date) {

) u1 ~4 u1 {& a2 o! H

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

- }. G/ Y/ G* C& _& `6 O

dir.create(yourfolder)

: ^5 R2 r) R5 W3 f/ s

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

2 C6 O+ t. D% p9 N- [% v# C

yourfile <- dir(yourfolder)

# }2 w* Y8 w7 S

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

! e7 C6 o% h' |& v. \

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

$ I/ @/ ~+ | Z8 i8 \

}

1 ?, M3 J% \/ V% g& ~

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

/ b [; M! R# y: t( M

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

; P V: z: w: q& H" r% r

Date <- dat[i,Date]

2 V. j' K0 c: y# ]1 _

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

9 f; H1 ]( Q6 A% K. G# U

hdf <- read.delim(yourfile)

5 e: y& v5 b# @

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), ]

# D- o) X8 M3 w; Z6 q

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), ]

9 h( _$ H! T0 W: X, d0 T

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

6 W+ J2 b( _$ D8 d N

}

) u+ W' S* ?3 Y% h

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

4 z% h0 H0 c4 f

* \: H. ~, i8 i) h( I

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

3 x1 ?% ?% x4 J3 g 1 B3 l& p, N: d5 J0 n' a* @ 5 W( L& t% i% I' D. d; k+ A, h! j9 Z% C) l & _( C8 A0 g7 i
回复

举报 使用道具

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