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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) - H9 U. Z# u+ l0 W

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

) l0 |- z; J1 S* C& J9 }/ ]; [

/ `& ^! }; f& @! z% P0 P

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

; ~5 R5 F0 m% b

安装nppr包

. _" W! g: F( `: U

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

! u1 R& i) i \ y: |7 `' u

#下载nppr包

2 k+ I& j/ r) Z+ h& O' H

#install.packages(remotes)

! F% S9 E: \$ A+ R

remotes::install_github(chaoxv/nppr)

+ x- I1 B& K3 t6 g7 {5 G9 ]) o3 L L

#加载相关R包

/ m8 Z9 q. [3 e& w9 B2 q

library(nppr)

8 t8 P+ z" u4 @1 i6 {* g

library(RCurl)

% s: j! V: n) S5 U f8 R4 X# q2 y$ D

library(XML)

; g' A$ h% e0 b( m1 l7 e

library(R.utils)

. U3 i1 v; h5 x- F! f q+ W

library(tidyverse)

/ _% C) s, |; n& u2 a

library(lubridate)

/ y( K! l) @0 e

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

4 B7 e! D( v( D# s1 `7 O8 d

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

! P& y0 O4 m2 \7 |% l

+ c4 c" L$ t8 M# x+ `

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

5 h4 V0 G3 L2 v" q) Y! `# s" A4 F

#创建工作路径

7 |- V6 h" W9 ]- [

yourfolder <- F:/R/nppr/vgpm

- m7 K3 [) U* p4 _! X3 S7 U

dir.create(yourfolder)

6 W$ `! W: ^) \0 t9 [+ B! A

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

2 F; E# J8 [9 J0 ~9 S! l

get_npp_vgpm(

: `- X4 ?6 ?" U& z

file.path = yourfolder,

! w5 T% }, S0 W/ P/ v; k

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

0 ^/ C+ A: H: y+ Q0 H5 m

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

% a% F7 j& P( d- a7 _! t3 N

satellite = MODIS, #选择卫星

- M% Y, }3 y* K( f K9 Z

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

: D* c6 F9 k; i7 g7 o/ Z0 M

maxdate = 2016-03-15

( J5 P1 m- ~& g

)

) @- y' J/ { H. U) z- ~" X

0 M' g1 g1 z7 P& w( a I

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

9 { J _2 A, ~3 ?( t& Z1 U6 T, K

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

8 \6 h) |& C4 c

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

4 Q9 U2 e. M8 Q6 e

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

$ d" X, P9 V! m9 ~- d3 C' @6 I

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

& b7 L( y3 F) B$ u- L

vgpm <- read_hdf(file.path = yourfile)

. C0 t6 g Y( |5 _0 [

head(vgpm)

* ~* c: f3 b# d2 i8 X

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

9 W* N5 r( q& b1 Y' z

9 _1 e+ v% q+ T6 [4 z. a& k

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

1 o. E: z' L) T; q

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

* R. [7 L* p/ A

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

8 }3 B/ f3 V4 D- T

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

* L0 T" B$ A- a6 ^

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

: g: F% G; B0 P4 Z$ ?

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

/ j7 e# s* \6 M& m0 ?% J

mydat <- data.frame(

6 P( J6 \, d5 O$ \" e; g

lon = c(120, 112, 116),

/ H3 ?1 k/ U: ?, X- h

lat = c(17, 15, 18),

' R* M0 v5 C+ s5 v( a# q

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

; n. e3 `4 T5 X

)

/ S" a; v7 D' d1 [- X+ X2 n

match_df(mydat, file.path = yourfolder)

R D% K% a: I$ X# K1 h

绘制遥感地图

+ Y% b" O& I- O5 F$ _

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

' {5 w0 U b+ s' g1 i0 R

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

* H+ N% V: e% [2 }" x, u) G3 w

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

# l( A/ d/ E# u% O: r

library(viridis)

3 F8 Q+ i* h+ N/ k8 K* b

library(ggplot2)

1 ]4 s1 z/ g; t& i

ggplot()+

. d: l1 l; q" G; a$ A! n0 M! {0 a

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

6 J) w* ^0 X8 j

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

2 _; ~: m: S+ {; Z

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

" p7 \' @/ ` ?# o# n/ G1 h# m

, @6 P( K1 P3 \0 L; G% q! A

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

3 f' \+ s6 t; E* u7 R% \

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

1 f+ K; X& {. W

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

* J8 T v) Z9 b7 Y0 z

- r( y E0 \$ e3 g

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

2 A5 W! h- O, Q, {7 A

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

, J$ F/ U8 I" Z1 J/ T4 p% t

dat <- read.delim(data.txt)

v! }) J8 p! z$ w+ ?9 R" ~- A

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

" A! s$ o: `. p. U. Q

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

! {- S9 r7 t8 r: u$ O. v O

dir.create(yourfolder)

0 w6 u3 a. w+ V! s4 [9 y

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

$ i/ K; v% `3 {. O! C

for (i in Date) {

~$ {& F$ I1 U0 y9 J! Z$ A

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

+ R9 V' j( B/ b) i/ L; [+ l& Y

dir.create(yourfolder)

9 ~( ]+ H( d3 _6 W

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

* ^6 @, U* } G, ]9 q4 \% O

yourfile <- dir(yourfolder)

; N9 K# N0 {8 I& [, t. P, }

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

/ \7 R! b* Q/ j R0 Y

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

4 T* ~/ \, R, y% L/ F

}

: e& P# [" h6 M9 k) k9 ?9 v0 ?7 Z

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

5 Q# r8 R0 F7 Z0 i

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

8 }- Y' ?, O' x' N6 y+ ]

Date <- dat[i,Date]

, r2 }% ]3 z, a( a9 f. b0 [: C4 r; h

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

! I! X; \3 H5 [. @7 G

hdf <- read.delim(yourfile)

8 ?# G/ p& y$ d( n( V& s

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

& w/ s; F+ y8 [* d: g5 q4 _2 i

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

% K# @3 H' O( c' ?$ b0 v& Y

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

' l8 ~! e8 x3 {# p% G8 O

}

: m3 X/ m o j" w. w' J

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

. z; @3 E: T( `7 q! v

- Q5 O* i: n, J2 s: O8 J

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

4 E5 V3 V: M2 D: |! e6 x ) ]( y; ]. C" s( S( ]; b+ n/ s+ Y, Z+ M; R, }5 h' E / x4 D; s9 I) i 9 @: R1 M/ ]9 M7 R2 R' W6 A
回复

举报 使用道具

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