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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)* a" P- Y" K+ [* h7 Z- w

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

4 b) L$ v, p, D3 G' J

: G) k5 E6 y; e" V

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

; f! r8 S n8 ]

安装nppr包

! f9 T# a5 X! ^8 h/ ]& @

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

: W/ G9 | [# y$ K* `: k9 `# _

#下载nppr包

7 r, Z% N. v6 z6 `

#install.packages(remotes)

& _. m7 K5 b5 G. F! i3 V' }

remotes::install_github(chaoxv/nppr)

' m/ v' j$ g* I

#加载相关R包

) W3 m' S% b% C i' f

library(nppr)

8 q Y+ [* h6 G, h9 I+ `# {, d

library(RCurl)

9 a0 Z6 B- g! y4 T- _* x5 {- c

library(XML)

2 y1 U& G& U6 ]9 I

library(R.utils)

4 g* R+ _& j M* ~ v- B

library(tidyverse)

7 J. b( w' _! P1 g$ r0 |0 ?

library(lubridate)

+ L. R8 e9 z5 H% @1 I' A

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

/ c: ]% r' ?" D" k

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

, D: g5 I) }& A5 M8 r

/ F6 p( q: l# V- Y9 f0 a

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

1 y7 {$ e+ X1 a) t* @

#创建工作路径

3 D; v5 T' d! K3 n4 s

yourfolder <- F:/R/nppr/vgpm

+ @9 T2 v4 t2 }# M

dir.create(yourfolder)

7 z& c' J8 I \+ r* X; W" ~

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

1 m0 O6 c. L! g4 Q

get_npp_vgpm(

/ ]4 S2 X6 R7 ~' A) v! v( l

file.path = yourfolder,

) T! K* @( n9 J$ K w1 p, |

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

$ p, i3 Z1 }+ A

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

4 m/ c4 L/ @& [

satellite = MODIS, #选择卫星

% ~) z% o) M+ g: ^4 [

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

r: J9 H2 L0 M/ ^ f5 |+ b

maxdate = 2016-03-15

) _/ \# ]- T) R

)

, K( l# u# m; q

! Y* T9 Y6 Q3 l1 W* k

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

% g8 b9 G* ~' c4 } \1 ^% @

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

& }1 V- M8 Q/ { l- G E+ K

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

# L3 z7 f8 H" M

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

1 |8 g" ?8 Z5 h9 m* P' \

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

* d% p$ Y+ Y& U' U. ^

vgpm <- read_hdf(file.path = yourfile)

$ x% w6 Q$ X: H9 c, c( z" Y

head(vgpm)

; q1 m9 W+ w. J# U: E7 p' b' `

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

2 l" X0 A/ E/ A5 J4 N/ w7 `" l$ U

0 m0 h8 [4 d- `! a

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

0 G2 E. R* K# M& ~! s

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

, L5 x5 z. J; H! U1 w

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

5 S, D" [8 C S( C, ?

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

0 W c' Z) c! v0 m5 r, f- J

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

" f' O) I, t8 g v9 D# s

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

q: Z% ^# s/ k! r/ R& r8 N0 m# W

mydat <- data.frame(

3 C0 k5 e+ F3 S6 g& k

lon = c(120, 112, 116),

, ]8 \: A) Q1 ?& ^+ K9 x/ s

lat = c(17, 15, 18),

. M' X" T( o- ]! b: F) a1 b

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

' G" S+ F5 V$ y% C* e

)

8 V- r7 N8 v M O, U

match_df(mydat, file.path = yourfolder)

' I" \6 i* `5 f# K, X* z

绘制遥感地图

0 F+ i$ N# |/ b

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

+ a" Q: w g3 o% W1 l) n

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

' y4 d% L v" M' w- O1 `

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

" D8 r, K5 Z+ O1 H

library(viridis)

2 m7 B9 b' X1 p

library(ggplot2)

, e K. V7 q; O% ?8 w1 \0 H

ggplot()+

9 Z" \; O8 T% P9 T( P

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

$ r, m0 ~; m7 J& `1 ^' N- O

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

; Z% C% E5 j! H( W1 A

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

" J! u+ ]) z3 G8 C" x

/ T/ h" x6 F, R+ ~, n. x4 Y& w

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

6 c/ I/ A4 S' S" Z

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

, N% v) ]/ J# K" z) E+ p$ |& `3 ]' ^

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

2 i A9 Q9 S1 m4 o+ e/ x K9 x3 [

& q: v% w. j, a* `0 N

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

. K# F2 a. P% J* S7 Y

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

6 j1 W" ]9 t# e5 X: n* N

dat <- read.delim(data.txt)

4 P( J' c; V3 r9 T+ L

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

?0 z- b! |6 n6 `/ E

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

5 C% O8 P+ Z( F# ?% z8 _. E. C8 {6 H

dir.create(yourfolder)

. r: ~5 I3 ?; Y6 A M- X

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

- |9 x& H4 c3 y, \+ y

for (i in Date) {

* I' B# F- x/ _4 F% ^ O3 P" u

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

+ j' N3 U" I7 D& W

dir.create(yourfolder)

- Q7 P% q, W% u% c

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

- W5 T2 Z: {# C. j

yourfile <- dir(yourfolder)

, m! ]: e1 [- S( ?6 v" E

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

' `; a Y& B6 Q. F

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

- c$ z8 P# T/ K3 M& s4 B% s

}

" ]- A2 D7 Z5 o9 ~8 d& _

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

# H2 X5 o8 K8 Z

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

" J5 S9 {9 u c

Date <- dat[i,Date]

: n6 M6 E( {* E! ] w ^

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

* Q/ c$ P! F) n5 g* f7 D4 C8 q4 m/ ]

hdf <- read.delim(yourfile)

0 z8 M* A6 r( N4 e: 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), ]

! g9 Q/ a# E' 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), ]

+ D. Q6 _& d9 G0 u7 |$ i

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

& A5 K: X! X2 e1 d& \5 s

}

" |& Q- ?& l* G) U& R

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

% y! z: l9 `" t& c& x, Z) V

. M7 V, a4 O6 g) }9 f

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

1 Z, P1 t. f6 F/ c $ j1 j8 W- Z6 K, h$ r% i% ]% O: z0 M3 \$ d/ D# A5 }3 R3 _ + n5 \1 T, d8 i2 G * G) ?/ C3 H5 [2 d
回复

举报 使用道具

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