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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)% v; K* H! s5 d6 P

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

5 R9 z- s% {# @0 l' N

/ J4 c6 C. U, R$ ]$ H

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

- V3 m" z$ @, Z7 P3 [

安装nppr包

/ {2 u: ^' A2 o+ A* ~( b7 y

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

9 r! [+ o) E1 j0 A0 F% j

#下载nppr包

/ x* r0 v% x b- Y- J, P

#install.packages(remotes)

$ D- o- }. a, m+ P" p5 N

remotes::install_github(chaoxv/nppr)

% `6 n% D* ~' b" {8 P: X1 u

#加载相关R包

9 J, ]2 C& k# ?3 `- N

library(nppr)

5 Y$ h$ k+ @, Z, X, |

library(RCurl)

; M( Y, o9 e4 v! F& [

library(XML)

2 L* [, S, r0 Z, s

library(R.utils)

U( W, V! D2 Y" ~& ~9 z' Z9 O* n+ I

library(tidyverse)

E4 E& M) G& ]; f6 o+ v- Y

library(lubridate)

1 L0 t5 j6 J p9 d: d( V" W: |7 _! a7 a

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

& f+ a' {: o( ~: v$ U. x

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

( Y5 E% P) {$ i9 l

6 y8 h: K: f! p% o: G7 H

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

z# ~2 r6 x* c# e& @; _9 B1 H& ^

#创建工作路径

! o1 a: e* V! X0 _

yourfolder <- F:/R/nppr/vgpm

. _/ H, c' B9 l* J

dir.create(yourfolder)

- S5 {) f* u% I# T; l$ W5 t

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

3 A& A5 N u( ]0 |. t) n9 b

get_npp_vgpm(

0 l: _6 R7 w( [( A. G

file.path = yourfolder,

* H9 h5 s' t, B* ]& |1 Y' Y

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

" ^! o) v( ~9 E& K' j& R

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

+ H$ W. p3 u, t9 N

satellite = MODIS, #选择卫星

/ \7 g$ z7 |# }3 T

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

+ y3 \, }1 Y4 [+ e: Z: }

maxdate = 2016-03-15

, s, ~+ K) R5 T2 V5 g' P$ F7 |

)

$ w3 U+ i% C4 S/ a7 F

* f. V) p) _- \, f o

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

9 _0 i; I& j9 J2 }

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

3 J. c5 u4 G9 |

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

) _3 B8 Q0 h* }5 U6 Q6 T9 B

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

3 Q7 q; |6 p \& L) E, }

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

! F2 U+ e, M6 Z+ y

vgpm <- read_hdf(file.path = yourfile)

5 x& W2 \7 E) B& z6 J+ M* E# Y

head(vgpm)

2 c: r. T: u. M- j0 c1 f+ O) p: y

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

8 E8 k1 ~; I( r: G" \

+ U+ F! P& p: K. Y& ] O

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

7 J: c$ G! c/ x# u; `; s

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

9 R- k7 d, F* M- P8 F9 @8 S

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

$ m$ e# W _ G# n3 H

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

) B/ L! k9 }; z9 {

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

0 ?% K- y# ?$ ^% a5 x3 g+ P: R) a4 G7 V

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

# Q( e' \" M% y+ s

mydat <- data.frame(

- l/ P) X% w* K) o! |

lon = c(120, 112, 116),

: T9 ?$ j* h' n; _& e, R& q

lat = c(17, 15, 18),

: J6 `, Z4 Z0 k4 y' G

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

, P' E/ F: @$ r! w ~" w# H) J

)

" S( O; ]" ^: L) i

match_df(mydat, file.path = yourfolder)

- _2 e/ V* g8 d: R) Q( `) ?) q$ _

绘制遥感地图

6 D/ X# ?" i7 g e' k% B

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

1 }3 k6 _0 N, M# u2 F& b* O w

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

# Z3 O: u) L0 o) ~

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

- d3 N+ a; K; s1 v3 M% t

library(viridis)

5 h& r5 e1 C0 U4 t j4 V+ z

library(ggplot2)

# @2 ?! G2 P5 J/ p

ggplot()+

9 T4 Y* [8 J1 l* A/ q9 v2 b

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

; P0 s# r! h+ |/ N

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

7 y/ ^+ h) ~; x4 e+ k5 g

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

0 z+ w9 b3 h, s8 r0 E' I* z" ^

- b9 H3 [1 z2 n% }/ R

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

0 |% k7 |/ Y G3 G0 a9 ~. c

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

: z0 f; C) i: M5 a: R

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

/ b5 ]6 S* p. j7 w, n

; r. V8 z: H- x. k4 e

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

8 X6 _- ^: x& u2 `

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

3 L$ ? m( V0 |% f" C0 ?

dat <- read.delim(data.txt)

) w5 a- G2 I6 J9 U. n1 ?

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

4 w% h5 m& ?! {1 c% f

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

: o C5 f1 [ ]" |8 m) Q

dir.create(yourfolder)

4 W* T0 p/ A. F% \) b# w9 n6 f

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

( {' I* R' c8 C$ g! A

for (i in Date) {

0 V, c1 b6 v$ H- f) {

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

: Y$ ?3 x v2 L8 {1 C

dir.create(yourfolder)

2 f* x1 x4 T9 J

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

& y$ `/ h; y6 [* {; c, l0 q j8 S

yourfile <- dir(yourfolder)

. |/ b6 o: m" b4 X( `) x

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

6 [' S/ S8 u& E: J

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

9 R: Y0 K5 C/ d" N

}

+ M/ U u* j! F. J, I4 u, _

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

3 U5 G1 i/ G$ a, y

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

9 P. z+ B- [8 B, o9 g

Date <- dat[i,Date]

1 ? `' s4 O7 ~8 t5 |" C$ ~9 \

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

9 w" {- g, n+ G

hdf <- read.delim(yourfile)

$ x! u: ^: X" w- l3 A- x

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

/ \* B, B5 r- r

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 A7 l) y. A9 s! N: G

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

' r# [! y8 S2 A* E

}

5 g# |. H- n. i( M6 e

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

% X; F3 |: P% {, {# z

& J. J) x5 z" |9 {8 n2 C4 l

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

- L5 o' t$ P9 \# k6 A 5 b- d' v% s7 C$ Q. B 6 |0 C' p8 Y% C7 K- p7 ~0 J8 ~! b& J9 K7 B+ Z ' C9 E+ ]! E0 M+ E- o2 [3 ]
回复

举报 使用道具

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