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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) ( X( f' m) h" N* Z

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

2 y% @: s9 t2 O7 }$ j

6 N/ l8 E/ y8 A& ]0 N

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

# s" X$ x9 T8 M4 p' f

安装nppr包

" P0 M; f/ S: r5 ]! [4 a8 ~! v

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

0 I' [5 @) [, }: O5 y4 d$ ^: Y

#下载nppr包

, T W- p0 I% h; E

#install.packages(remotes)

- `. S) a; U9 s8 {. b3 h) H

remotes::install_github(chaoxv/nppr)

; P( ?2 k9 ]5 \8 t% `% C5 u

#加载相关R包

+ O/ ^. \( d4 a3 X/ ]2 j

library(nppr)

3 @* {5 L$ s- `- J& w6 Z

library(RCurl)

8 d/ X7 {% y+ X4 n' g

library(XML)

0 [$ I% @) Y4 W& t" D O t

library(R.utils)

. |! v# T! p- P' q7 `

library(tidyverse)

1 Q: s) a9 g3 E3 r# h2 P) J

library(lubridate)

% ~9 \8 c. I" W' [" E( m4 U

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

0 w/ w! P& a$ ^, |

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

1 c6 \+ P" L4 k4 H2 T" v- u

9 ]1 s) G+ ]+ R3 q

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

5 ]6 J+ h U& i5 h+ H' a- y" e2 f

#创建工作路径

$ ?) D0 j' E3 |4 J4 N; Y/ h0 V4 N

yourfolder <- F:/R/nppr/vgpm

: | Z5 V* m+ Z/ f

dir.create(yourfolder)

1 f$ R8 n, d! x" g6 C

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

/ a: N5 C k/ w1 L- L2 S

get_npp_vgpm(

( H7 |# _5 \9 o7 f7 a! F6 O0 K

file.path = yourfolder,

3 D# S8 K5 s3 p

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

: R1 b) H6 @% l* G& i, F0 y- G9 x

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

4 U2 j+ l$ U) F

satellite = MODIS, #选择卫星

+ N6 z( `! u+ C ~6 J

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

& G1 Q3 @) |. E; g; R' r5 E, j

maxdate = 2016-03-15

8 T- R! t; a) \4 l# Z

)

# G9 o; v* e% L c* j

' V8 S! _# n6 h+ f3 A, ]

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

; F( V; B, b5 L5 O @% Z

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

, F6 Q4 {' R, U8 b- e

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

5 K. c& L8 u) Y+ U

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

$ ]! G6 L- @( Z

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

& T8 y+ v! g$ u( o) y

vgpm <- read_hdf(file.path = yourfile)

$ v: y U; D( _% S/ A. [: v6 E( {2 P

head(vgpm)

' b9 R% I ~( }8 A

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

. @. K6 y4 e c9 Y V: L: \1 R

$ T2 u1 k; [" e7 l% x( _. S! T

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

w/ w U. i7 \* y

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

; T C% b' q. q8 d1 a

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

+ f: ]$ m6 e* I% a% y

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

: g- Q9 D r. h% M

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

& d& O' S; |) }- m+ v" `

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

! Y2 ?7 q( T5 d( B5 l9 D) h

mydat <- data.frame(

. `6 e8 ]' D' ]. a' N/ H

lon = c(120, 112, 116),

* ^2 P% W3 w- Q1 k

lat = c(17, 15, 18),

, f1 w! s3 w( r; J% p

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

) @. r5 M" {) j, k4 n7 _) P

)

+ ^3 ]5 `# _/ ]0 ~* S5 u

match_df(mydat, file.path = yourfolder)

( L, H8 E& X4 }& c0 s

绘制遥感地图

5 \/ e7 q* j& U

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

! k6 U. ~8 G, O0 V1 c

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

0 T( ~" q, e. ]! K3 e% l& w5 X

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

" s4 D5 |: U ^! ^8 N/ j5 I

library(viridis)

. T" I- F! I. A! R" j: Y" V

library(ggplot2)

& D* G* Q U$ n; K& R

ggplot()+

3 S6 g! c: p$ J2 Z' L9 z% f/ S

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

# D, D2 i" C9 v' @; m6 t8 I

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

( j. @! ~: _# g

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

; A) Y0 K0 j" N8 ?' A7 `& g

1 E/ F7 z m0 f& l# X# M: X6 Z

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

4 f/ X0 n( _9 R& L, c: E$ X

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

. X6 E) r4 b2 j

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

+ \' @* o+ ` g9 ]

I7 R/ z4 k y8 o6 ]

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

1 c1 J( w( d, {, |0 V( ]$ C2 @9 c

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

. P+ H% h; [' O% ?7 c' U9 |

dat <- read.delim(data.txt)

* m3 h0 P9 ]8 V( \

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

# I( D0 ~1 d( `$ B, ?; t

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

) N1 I3 v. o! f

dir.create(yourfolder)

& O7 u2 f7 m, j

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

+ ~8 O& a( `! w3 [2 o# j- z

for (i in Date) {

6 W9 q/ R! P; C6 ]5 w% X) A

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

' v5 L9 |# Q1 ]8 I8 ?

dir.create(yourfolder)

2 o* E* C7 B0 K

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

$ ~ `, k! s2 v9 V

yourfile <- dir(yourfolder)

! f; A) s" |) v4 J! H& F: t

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

% M6 r2 T7 {" G3 ^

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

; P& t: q3 u/ V; L! \

}

- Y J: j1 U! V# N) N; x- t" M0 i

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

; f1 S T& M* k5 L4 l7 `: |

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

; h. @# F7 A6 \9 M

Date <- dat[i,Date]

3 s) z6 i8 H; e& b6 L& n

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

: Z }5 n) g5 s$ f' f

hdf <- read.delim(yourfile)

( \1 e7 n2 k9 Z E2 S) {" M

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

6 w4 C3 K6 U1 T2 a6 v, u

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

* j. b" ?. y( T6 a

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

! n* [/ C5 n, w, q5 @

}

8 M/ |6 `' X f/ p3 \* }" o

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

- F% F/ d- P0 `3 x0 I

0 h: v K, p9 X9 B

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

8 [( \; D# b1 q/ @ 7 D; p& o+ h# C: o1 z% @ 4 i' b9 k& T9 C. S- Z4 v$ f+ A1 m9 f: Y m+ U7 V) c& b 0 K/ s9 C, m9 D9 X
回复

举报 使用道具

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