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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)3 U! M9 y/ {; @. q# v

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

6 w: y( x3 s; v5 ^# l

/ ?& Q& w8 N W: V) X. S

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

& m4 I D' I I- ~& O; o. X

安装nppr包

0 K! { v6 Q3 G6 o2 |

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

# F0 K1 B5 w8 P. y. o- ~

#下载nppr包

9 ~; A$ }1 {! k' f2 q5 b

#install.packages(remotes)

# T" e3 Z; l; J% V

remotes::install_github(chaoxv/nppr)

; g( ?) ?. q' w4 O1 g

#加载相关R包

) j/ X1 z5 f/ i+ G* h& j; x

library(nppr)

5 W; M# {8 ^* f5 H* X3 u. V

library(RCurl)

5 C8 u% l/ v( g

library(XML)

- W' v5 {* s9 A+ Z# _

library(R.utils)

3 T1 ?+ X% K" W* ]

library(tidyverse)

' a* q M# z- X) v9 `

library(lubridate)

' b' v2 \* c d& p

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

3 u& x. G' n# U' U

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

' F% S1 o3 G6 V

2 c1 N+ V/ ]9 c: y$ C

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

6 G; D- }0 b0 J+ [9 ?

#创建工作路径

; i' K" Z8 [; g. z, [' z

yourfolder <- F:/R/nppr/vgpm

2 i! U2 q, ^+ p+ R' ^6 D

dir.create(yourfolder)

/ Z; z; B- i% w

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

) l; d2 p# A5 z3 Z, l2 e

get_npp_vgpm(

1 i0 @( |3 P' N8 |) F

file.path = yourfolder,

! I4 Q" X* ^: R" p

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

3 {& l* t' |/ O7 E6 U; g& N+ p) A6 w

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

" T) e4 R, s8 e7 |% G

satellite = MODIS, #选择卫星

R; X3 ?9 \, R, p6 [& ^

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

* Y# T2 d1 P: q6 i, B

maxdate = 2016-03-15

; h9 m: z7 Y, e5 L5 i* M# o* A

)

! T- T+ m, j* q4 q$ J6 ]

3 ? r' A2 ]& W8 M: E0 F

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

( I9 P' i$ G, d" e- b6 n0 U9 Y

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

' C& K7 @' h2 [' b! R" E

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

7 A* `( o7 A# w9 D: e! }- p% V

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

6 \6 A, t `, q; A/ b% e5 S1 @

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

7 n) | U$ _/ u+ s" P7 Q

vgpm <- read_hdf(file.path = yourfile)

# D3 a9 q* O/ i

head(vgpm)

9 [& V) q4 ~8 e) T: }7 J

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

$ y+ c- x" U- }% W2 R9 D h

9 U! K! [4 j" O; d& U1 _1 F

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

: _% Y! c5 u' y1 n" _

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

: R5 s9 }' Y; M1 I8 R

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

" ~- G z: L9 g7 _

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

. H# x8 E% ?# \. r6 ?

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

% Z6 W# [( q0 l/ g

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

6 v% W& l0 A9 M2 l4 _

mydat <- data.frame(

& P1 B6 Q9 u$ h6 J3 R8 T

lon = c(120, 112, 116),

/ ^3 Q$ T. V6 D" e4 U7 f1 e1 r: N

lat = c(17, 15, 18),

/ F! D5 Y, t" L4 x

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

- }. m% o4 n7 L1 F4 U V3 l. r

)

9 Y. s( f6 J; j3 N* J

match_df(mydat, file.path = yourfolder)

: r7 t' o8 l U. `4 ?/ f1 s

绘制遥感地图

0 ~3 u: F0 _5 L+ `- U

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

6 P {/ I) I/ I4 c% j

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

2 S. m9 O L4 V9 E% q: k

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

% ]; {$ C/ z7 J. ` R! y4 h7 _

library(viridis)

6 ]* @$ f" h4 p/ X; M. E2 K

library(ggplot2)

. M% Z* |' l. k2 s' M

ggplot()+

' Y! @5 C* g6 }# Z* |

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

% V7 X) A, r, F9 x6 _- @& j: M- Z

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

, s! f; _ F. D( r& N1 C% Y

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

% k: f) r+ P9 E5 k5 y/ ~4 p$ v( Q

$ k, w0 {$ S/ x1 y

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

+ e8 `/ K% o7 ^) K: D6 w/ P; n( B

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

' [+ w" r( H; k3 \" C: }

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

e# @9 d% P9 [- t( M

% P& F% X; b1 H0 c9 g

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

& y0 x y# s/ T! O3 g$ B2 o5 K S

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

9 R n& U) s; c) w5 `4 l# B

dat <- read.delim(data.txt)

$ }7 K2 W% H* g4 C: A& e

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

+ f2 T) W5 a2 f4 J2 l, w" S, L

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

/ d' e9 k$ @% s. A! I

dir.create(yourfolder)

- k% k; K+ B# X' p& j& X

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

" H8 t/ W, {, ~" q% B! N

for (i in Date) {

4 G" {) V7 q9 p5 {: R

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

( a$ i, c1 k- A+ n# L. |) W H

dir.create(yourfolder)

) g) R2 O- L G

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

- }" K0 L0 ]3 |; L% }& B

yourfile <- dir(yourfolder)

1 b6 D2 d9 R8 y6 l0 `& K% Z2 l

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

& \3 F+ x4 Y Z* D5 L

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

" t( ]$ R+ x. ?

}

3 r+ P5 j' N! A, I' V' D5 j

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

* P8 H3 ?4 p7 \ h0 G

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

+ I- x4 i, A9 O( A

Date <- dat[i,Date]

$ }% Y! f, f9 ]& s

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

4 p5 t u! I' Z6 q

hdf <- read.delim(yourfile)

: l& M$ O( V0 o' F( m S) E0 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), ]

- X9 @3 P7 Q* t& K+ 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), ]

0 E7 O9 ], A+ V/ z

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

& U1 \" Z. F! H3 d* m" Y8 W

}

2 W7 y1 N* t8 j6 J0 F

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

, r# C* P1 U, j+ ^- \+ i- @+ M; |

" F; J, x7 T0 v e1 O) }

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

! @5 O' h3 X) A 7 S' {( G5 |+ F M1 X4 X7 g0 l" i, ^# s6 F7 Z% W" L / j0 X+ r+ j2 ~- n8 x$ l1 L3 o1 G " Y3 A) m& a( G0 J( g z
回复

举报 使用道具

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