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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)7 y8 x) i1 `: {- O

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

5 X9 k7 k3 }$ c# }0 }' m$ y4 |4 Q9 D; ~

& e$ H" L o3 n2 L) k

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

( q$ `: f! r0 |/ O& j0 j& V

安装nppr包

% k0 T {- ?! `1 z0 H

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

1 j4 [0 g+ L: ~2 a

#下载nppr包

3 @! Y" [- M5 ]- s4 `

#install.packages(remotes)

. @0 l2 w' p* e- _1 p4 Y9 O

remotes::install_github(chaoxv/nppr)

3 x2 ?" D, p- [5 ^5 H8 F

#加载相关R包

# a! r) Z4 F' v/ C& L& E

library(nppr)

+ \1 J# V$ J H. J/ F

library(RCurl)

, E9 \8 E1 d- ?) M2 `( q4 J& Y5 j# Z+ x

library(XML)

1 X! V) u) a) O* _& x

library(R.utils)

$ o' X' i& i) L; r% S3 ^' ^+ a

library(tidyverse)

$ F4 Q# R1 B$ ~

library(lubridate)

8 Y0 r; z: U( K7 ?3 T3 Q# y

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

. n% S+ u5 @4 t7 R# G3 Y9 Z

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

2 u g) ]% W* t0 c9 K

- |" O1 y& G+ _2 l3 U

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

+ k! p# @5 j: h1 x8 c

#创建工作路径

7 ?9 Z2 V1 S- b! ]( r

yourfolder <- F:/R/nppr/vgpm

# `6 [7 t% {# D/ Z W+ K* O

dir.create(yourfolder)

; }0 D, J% K) }* Z$ D$ H _

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

7 }0 o3 @! n/ o4 F$ ?

get_npp_vgpm(

4 y& f+ G# J" T. Q4 L# Y( Y

file.path = yourfolder,

, E* E/ ~& A4 A! Y5 P

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

, a: v3 f( ~( U D

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

3 f0 N# B. s8 A1 W1 j0 {, W

satellite = MODIS, #选择卫星

' r, t( v8 m4 V! P7 A& t

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

0 Z# e" S5 z8 e: W

maxdate = 2016-03-15

& k) ?; \+ E& U9 a3 D9 _5 I

)

8 G. I" D. U [+ b1 n0 S8 C+ s$ I5 E

! `5 ]% W! _ X" Q

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

: A* k z7 w- a r( f8 r: y

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

E. a# K# Y% J2 c" K* o

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

% u, h9 Y* g1 ]( M& i6 F8 x

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

# U" V( A: g0 o }2 ~

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

# ]+ Z+ A" a4 e

vgpm <- read_hdf(file.path = yourfile)

* |" @4 l" H) H

head(vgpm)

9 x2 O! ^% f: s( j- e, Q

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

- \5 @. Y% G6 d$ b# S0 L6 I- @

' f ? `7 E V, I* p, p- g8 I

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

0 X, P6 K2 f6 @/ J9 W) [ x

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

/ r$ L7 m! e- C0 }* Z: i4 ^1 N9 i* g

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

D" b4 {2 [% s4 [* x

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

# P( K/ B1 \& X2 A

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

4 M# N9 t7 ?' v' L5 Y

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

- G; g6 ?: W0 W! k" h' A) j

mydat <- data.frame(

6 o+ I3 {* c. g, K' C. ^

lon = c(120, 112, 116),

4 F$ b2 U7 n9 @, X( I6 q. q

lat = c(17, 15, 18),

8 f* b( D! l4 }6 O/ Z2 M! I3 F: _

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

" v7 } y9 k3 q9 L: }( G, J1 j

)

& r$ w& V0 |' T& C3 N6 Q

match_df(mydat, file.path = yourfolder)

" @) a; D6 ]" N5 P2 \& |; M9 K

绘制遥感地图

/ c& R! O; A1 n1 t! l, u

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

# r+ b2 h3 C. x6 m

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

( g& C" g6 R0 L) A8 o! f

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

+ N8 M. w+ v0 I! J! E2 X

library(viridis)

: N3 ?* U6 _+ e# j& S

library(ggplot2)

! u* Y$ `* C) V7 O: p" O W

ggplot()+

A* v, h8 k* n* l' [+ Q

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

2 [3 Z S+ E6 F# F

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

9 X7 f% l& \) _2 M+ S2 L

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

& B9 x: H8 W3 Q. I

" r/ I3 w; \ s- I5 ?8 ]: j

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

5 z# P& r: [) }. \ E: q

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

1 z% Q7 `# e! i0 ^2 M( p

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

( Y1 [; @" p' `& c

% k4 |& k S% c

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

" ]5 ^6 P5 B3 w# t# R: ]/ t# h

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

) G9 n4 C1 z0 n- w

dat <- read.delim(data.txt)

; x' U! N( _0 [

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

% L1 z6 q5 X; J) k( E

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

" Z/ z; {0 I/ W# R

dir.create(yourfolder)

; }/ L+ Z5 v0 I& n: T

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

2 \, E/ E# U- J' b9 r" \, H1 h7 V

for (i in Date) {

$ A3 }4 e% c3 C; U& O

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

( u2 r7 J+ _& F: t3 z3 W# T

dir.create(yourfolder)

1 x/ K. j4 f) o, }$ Z6 p% T

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

& p2 }' ~+ {# }5 y

yourfile <- dir(yourfolder)

# E, p& T) T$ y4 A; T8 c8 ]+ ^

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

& w8 t4 ?/ F# p1 q6 Z6 Y7 q

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

" j! O/ C0 n2 Y0 X; y

}

8 r1 J+ V3 l# C6 K

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

' t* q7 R" _0 v6 |

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

( [1 n# V6 p ]8 F/ k' Y

Date <- dat[i,Date]

/ l% g6 }' H8 y6 R7 E& y

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

* c G6 F; W* Z. q7 E, [2 p

hdf <- read.delim(yourfile)

W# s# ^7 S+ n( P( _ I0 a( _% v

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

; J9 W$ Z! m8 g4 V) \

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

4 A# t: }7 l5 Z9 @

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

7 y4 K' l) m0 X( O9 ?# `; K5 f$ A

}

( N2 p) e# S3 H

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

- L: v% j5 [! H5 R$ G8 H9 k

" {4 O) J! c% h8 X

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

- m- J7 z" W1 W/ V q ' h6 O' b8 o# z. t! T. b ! H2 G8 \1 s, f4 o9 Y" k# O' e- a6 A9 ? 0 r% l' K5 b- m3 f5 x; U0 s
回复

举报 使用道具

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