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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)$ Y; G p' S @4 k

Ocean Productivityhttp://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)、叶绿素aChl a)、净初级生产力(NPP)等遥感数据。

# s! ^/ P1 {2 d# h; r; c- L

安装nppr包

+ O- n* A$ c. _2 @! }1 {

可在githubhttps://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)、叶绿素aChl 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 Productivityhttp://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.m.chl.m.sst.php)的基于VGPM算法反演的全球海洋20161月至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)以及当前日期内该经纬度海区的NPPvar,单位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天平均的SSTPARChlaNPP等)。并再根据各站位的经纬度,从中匹配该站位附近的数据(比方说以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
回复

举报 使用道具

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