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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) 6 H0 ^1 l% c$ |( O% _6 u8 x

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

8 q: i! ^5 G9 M0 y" v7 x9 d0 Y. A' t

; W0 d! Y" K7 O* X) L( ?; w- Z

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

0 W6 F& D9 c! O1 `$ X: K! d

安装nppr包

! ^- O2 v+ \6 N9 n/ u) \- ]) F

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

- \3 B6 C o6 O* L

#下载nppr包

7 G3 l8 ^1 k3 b0 a

#install.packages(remotes)

3 @) _0 h! K- \. d2 @( E

remotes::install_github(chaoxv/nppr)

; |2 P! h; j) W+ e+ ~( { p

#加载相关R包

+ [. N. j# o+ X3 \& _' r

library(nppr)

) O) l4 K E" H8 o. y0 G

library(RCurl)

. U: g7 r y4 o0 A+ ~- `& @3 E

library(XML)

1 s" H! `! H6 X, J C: j8 {' \2 f

library(R.utils)

" B0 e _3 m: ~- J6 V/ |* y7 B

library(tidyverse)

: d/ f- i& _& c1 F0 O

library(lubridate)

$ j9 q0 t1 r6 H& W7 \. D, a; }1 Z

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

+ q& m5 D" `; Y: O

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

1 e% X4 r$ s& {8 p

1 }, S( N7 y' ~; s9 R

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

! l- h2 A8 O; F* K' z: q j

#创建工作路径

+ \7 `1 e) a0 C# V7 r

yourfolder <- F:/R/nppr/vgpm

! T& ^/ f' E! `7 ^

dir.create(yourfolder)

. Y3 [1 E8 y4 f+ z

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

' N7 W3 u# h, y( I- G# C

get_npp_vgpm(

3 n( p. H* o4 d K9 z

file.path = yourfolder,

+ I: U9 q! y* F) N! v( e/ e; K

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

6 }! }/ C+ i l$ }; J& e: S

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

% L* s/ u w: Z

satellite = MODIS, #选择卫星

/ x. d4 m( g# Q6 T' Y: `$ d9 P* x5 `

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

' H) D# |5 S v

maxdate = 2016-03-15

) ?3 ]# V1 z8 j2 @: Y' v) [2 s

)

; z& F# C& c5 x- b

9 n5 `6 q2 o& L" Z2 |. m

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

& \# z( k* z2 u' O- e2 v8 n

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

$ @8 }6 E; C* d% E$ a7 x

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

8 h0 ]1 i. C2 ^: C5 l! X3 V, C+ I4 K

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

" W# {/ Q# `: Z- M- \! L

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

2 }4 m4 D j4 v! \* A0 a- m

vgpm <- read_hdf(file.path = yourfile)

" {% V9 Y! q' [5 h9 ~

head(vgpm)

1 Z/ P8 O' @0 L) R/ b2 A' ~' W

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

! ? y5 l6 u! d4 \; n

3 ]' g1 H( P( Q+ B7 G5 _# W) L$ K

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

# @' Y* L! n) C6 ~

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

3 J) Y; K8 g" O9 P

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

' W6 ?( [6 J$ u s4 f& l4 S" T9 B, _

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

" v0 g6 ]" e9 e% T" d

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

# O6 q% w7 O( n9 }

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

5 D; E6 p$ [& y; {" Q& c# b& I

mydat <- data.frame(

& O% S' | j+ I: R

lon = c(120, 112, 116),

* B# X8 t1 U6 b1 T

lat = c(17, 15, 18),

9 m/ h1 X4 ?+ d( y# f" ?! h+ q! H1 O

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

1 a) p6 p) f( {" d: v' M

)

' X k" x5 T# m4 E W

match_df(mydat, file.path = yourfolder)

* z; c* R. v. |* u

绘制遥感地图

2 Y9 Z" T4 ?/ ]9 a0 S- v5 |, S* Y

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

; J" _; `9 m, Z# s1 ~/ M

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

4 v) Q* ]7 Q1 P

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

8 m" {& @3 H5 u/ l

library(viridis)

x3 w3 l" |* \& f$ ~ Z

library(ggplot2)

6 L' o) s* ^ W+ C- [; x, y

ggplot()+

# Q% \' O$ z( Y7 B' D5 |

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

% j8 f3 C+ F+ g! |; D

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

& g, K& I9 W+ {9 R- v

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

) ?, M( _$ z! c, B4 X

2 C5 W. l! j. ^ _" m# [$ ~. h

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

) o" Y* x4 n9 i/ v7 x1 I

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

4 M4 n6 T, B) j$ U1 c' @

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

- H, g* O$ j. _9 P, @2 c

0 E* U- B8 [( D9 b$ {+ o, ^( V

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

- i2 o% W3 b. @' K

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

! n. o% j- T. k

dat <- read.delim(data.txt)

7 V, c9 |- U: k# P9 K1 M

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

1 s- m' ?( {0 r8 R! x' M

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

3 q, @2 X! q$ ]" F

dir.create(yourfolder)

, _& Q. E0 {! z' e; B7 ~

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

0 E# a: a" r$ N: q

for (i in Date) {

6 P$ S. u: j5 u! J: n

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

& R! c& l" a. B

dir.create(yourfolder)

/ R: P% I5 f# b+ ?: u1 X8 L0 n

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

5 I8 M0 l* N8 x9 k

yourfile <- dir(yourfolder)

/ H" x9 w7 c$ x" m

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

$ c6 Q" O; G6 q# s

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

* x1 L% @& e; a' V: ]2 c _8 |8 p/ o

}

7 W2 ~, X) \0 T0 b* g

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

# `9 F- A: K s, k1 O h [2 f

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

* Q# T: @9 c- C: @$ T+ y( t/ y

Date <- dat[i,Date]

4 N4 ?5 ?2 j4 j

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

% A# Y* X; U# N" E" q: d

hdf <- read.delim(yourfile)

E5 H( [. f& r, A9 ?

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

% p4 O1 P. @6 {( X- r- m5 ?5 T

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

" |2 H0 o0 B/ x/ a/ M9 A

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

$ M' b* t K: _+ ^; x$ u

}

. ?9 Q% I, C: V

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

W- \1 J5 d8 u0 t

) e/ Q6 s% T) S+ h& | r3 Z

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

! l! C' C1 g8 a) W) Z x4 e3 ~ 9 R) V5 L4 D2 x9 |+ G4 M" L8 j7 Q. [! i# ^ * `2 U, k% a3 V$ \8 C2 ] ) h1 X. a2 a0 h! u& O
回复

举报 使用道具

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