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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)/ }. m- N7 {2 U% L

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

# ?& v# A3 Z" M8 f

" K/ n) ?! L6 m) h& f

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

( K' S* M- q# J6 c. I1 T% u" J

安装nppr包

9 A q* j+ e9 Y1 l5 [) x _5 ]+ A

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

+ _2 q; z6 c# V, `

#下载nppr包

0 [9 s! C0 C4 I/ F4 |

#install.packages(remotes)

$ m( b1 O" G( g" |5 G* P; o6 Q# w

remotes::install_github(chaoxv/nppr)

* u8 K. ^3 }7 P8 ]7 u! Y' W

#加载相关R包

6 i" ]; n7 s4 p3 }' L. l0 K

library(nppr)

7 J8 K( o5 f7 ]2 x. o i

library(RCurl)

; E/ ]3 m: K- O8 {8 i0 O2 m) h

library(XML)

$ p/ V2 @) i- ^& a( H# A

library(R.utils)

5 B+ s! o4 R5 V% U9 ]. G

library(tidyverse)

Z8 R2 F/ H3 F4 f7 s

library(lubridate)

, }9 G) F3 \% }( w; s+ N6 v

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

6 ?# ~+ ]/ e7 ]% x

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

1 W& ~# E+ J0 K9 A

" z% i( r) U2 ?8 p1 @& r" u

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

* u5 G8 P% F. b# ^3 `

#创建工作路径

' |! ~ J! \; H8 k2 W8 U2 M

yourfolder <- F:/R/nppr/vgpm

1 u% ?7 n: r* \4 s7 _" w( h

dir.create(yourfolder)

m9 U6 v. J( [1 N, B

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

9 G8 [: S1 s5 W

get_npp_vgpm(

5 c8 h1 ~, Z0 J* D

file.path = yourfolder,

: J/ d8 A; Z. M) X. h$ N8 T6 Z

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

, a- z9 g7 D1 J7 ^ u, O- O

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

6 t# K4 @% W! A& ^$ z

satellite = MODIS, #选择卫星

- i$ |4 ^& R' b& D- Y* t% f9 P

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

e# e0 O+ ^, x1 G% p# X6 P

maxdate = 2016-03-15

% c% f+ d) ?" [

)

) Y' \- s" h: c

5 [( p" p) y, B: Z' z5 M

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

/ R! W1 i. D- x4 x9 O3 u

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

0 }2 G/ {6 \. S* t& s% l

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

! T* X5 E, }6 v& K6 z3 l

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

# r/ ?% z% a3 R) ?! d: c$ r n/ v

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

3 ^# i, d z- U1 f: x; V2 I% v

vgpm <- read_hdf(file.path = yourfile)

6 G/ @* @9 s Z6 w

head(vgpm)

2 T/ [" L6 Q, f" @

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

8 U$ q% ~, V6 Y' A E

" l- v r6 R) w& F) T4 p: \# r

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

9 [9 j* _; X4 H& y/ ^

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

! V; ?1 E1 I3 \+ }

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

) u) w3 _4 N! j; B

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

, ~* `: R# A/ U9 h' @" L$ U8 z

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

7 Z" O$ |' y r2 U2 w$ l

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

: ^7 c) ?; F1 i5 d P7 {

mydat <- data.frame(

" } F" V! C1 T2 t9 |, a/ t

lon = c(120, 112, 116),

! B4 z5 ~; U1 n, P

lat = c(17, 15, 18),

8 a( [, J5 t) U0 E ^

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

3 `1 s) j# U6 a

)

" ^8 J# t+ ]+ b

match_df(mydat, file.path = yourfolder)

) `' T s/ \ Y. x9 J* Z

绘制遥感地图

9 E& {' u \2 y! o

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

! h/ y3 C7 B" M+ u- y1 x: G

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

. ]6 [8 @" m$ v- a4 J) Y, l

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

6 N- s. w9 O A! B- `& R; H" F

library(viridis)

* o" o$ m3 W' k J6 T9 p+ B( ?/ `

library(ggplot2)

# g+ k# H" J' D7 d' u3 s

ggplot()+

* n8 |, W( V9 h1 A

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

9 V/ d) K; \" u' a6 ~0 J

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

; _% B2 Q( \; |9 b% _2 w

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

! E+ Z% A, n6 r5 q

3 S: {6 w% A3 U) ^8 }; o

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

; j- ?1 A, a/ O/ F

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

1 V5 x5 C2 C7 d( w" w

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

4 d% p6 B' A4 N: o+ C

0 i! w8 f' w: s6 h: ]- V2 {

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

" p6 K# K$ Z# t C: \+ ^- S

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

8 n2 t3 T1 V/ N7 r

dat <- read.delim(data.txt)

4 E3 Y# y% R4 L# K

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

$ i/ z" Z7 ?5 S

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

9 j3 `% ]+ e6 r" |% W* k- ]0 w9 x4 k

dir.create(yourfolder)

8 n* i0 _+ H4 e- R+ D: [

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

' r5 ^. C0 K: q" ^1 r$ y/ T

for (i in Date) {

; v$ ^& k$ s$ _% B+ Y+ G

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

3 U, C, r& u* m4 ]% p. P

dir.create(yourfolder)

. `! B) \2 b8 m

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

/ y3 v4 s+ s1 k2 Z

yourfile <- dir(yourfolder)

; u( c3 S9 ~' j U9 T0 M

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

. U j+ @6 s5 U U& }

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

1 t: P: `0 s# s f" X3 M& K4 b

}

4 Z+ Y3 s9 b8 M r2 e

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

I. y, ] n' ^, W# L. g* E; `

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

/ H8 }5 `" Q) Q# O- Z

Date <- dat[i,Date]

6 M7 A5 |/ |3 B/ r3 A* M+ t

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

# ~4 [7 G. h1 W, u

hdf <- read.delim(yourfile)

' m$ ^1 `8 J" v3 Q' m o

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

' y# [# `( Y" e5 W! \

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

! } _( U3 `& G+ b6 O1 s

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

/ K4 l, q9 Y P6 x

}

1 B# s( D% P( L4 {

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

2 e* @. }4 d9 R! q& L( H* U5 j, C

9 g3 o% [) C8 o: A" f

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

4 }1 T+ O9 J& @! |. G& V4 o# i3 F# q7 R% N& ]& j3 U $ c3 p! E9 R, P! _4 i2 l 0 a. O2 z6 z K, L1 D& j. u" h0 |) i# [7 |; z6 a
回复

举报 使用道具

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