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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP) 8 Q( Z% e& _' ~; s$ _/ L: ?) l

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

, u; p$ P+ c& ^1 A( v# @# a0 P2 d

* m; M9 x3 q! w9 X5 h

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

: T3 _) r- s7 D, }: s! m' |

安装nppr包

0 V4 Y( o$ o1 X9 O+ K

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

- E+ {, N- _: w4 _8 W' |

#下载nppr包

; `0 ]; ?( T- a" D7 J- J2 u

#install.packages(remotes)

% h! e& s5 x8 p0 E% N5 m P% N- p, H

remotes::install_github(chaoxv/nppr)

' Q: l$ w" Q8 `/ H

#加载相关R包

: m, E, S) z6 H; ^

library(nppr)

0 u/ W5 @0 ?) x' j. n) J7 Y

library(RCurl)

) k" w! B, [! ^, [

library(XML)

" j% o3 v, ^( _: E5 M

library(R.utils)

6 g5 x- c! B U! R0 r3 u

library(tidyverse)

c6 l7 I7 d7 T& }

library(lubridate)

: \' H. ?, F5 w$ Q) s5 d, C1 T! Q7 `

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

0 n% h6 m# _+ p1 {0 D

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

$ j1 S. }. V0 a* n9 c/ ?

7 G, X3 _( I2 u

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

, V2 D( U# F0 ^

#创建工作路径

' [5 c1 i9 J1 o6 b; I

yourfolder <- F:/R/nppr/vgpm

- q/ T$ l6 Y3 O( k ?

dir.create(yourfolder)

! b% o# W5 m) b7 E6 Z- O g/ U

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

* P. T3 O+ i' m0 j$ W' m) i" Y; H% M

get_npp_vgpm(

! G' u) g$ b6 U5 K2 i+ w

file.path = yourfolder,

$ E* _( @+ w% N9 S! Q' I8 \! L8 O

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

7 k8 [! K& d g" y- ~- ~

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

/ P. C; q& C1 O! @' e& _" a

satellite = MODIS, #选择卫星

# ]$ l+ x. c* \* u! |1 ^5 D, R

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

6 P# o3 }0 p8 A# w' C2 r

maxdate = 2016-03-15

, G* r' o( E" h/ Z5 A/ B* V- b- U {5 J4 |

)

( W5 X' n1 w% R( g: }; u H

) O) r* i. A u# k+ A

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

* J- p9 I3 u3 Z! o7 Q+ n* K+ L

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

7 _( X4 X* |0 {3 ?' H) r1 v2 W2 J

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

& h' T, L) r U8 C! O3 h- g1 u' o

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

/ w+ ~8 q0 f" ^# F+ j+ C! U

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

/ j& l4 K* U, u9 U" n2 R# z, T

vgpm <- read_hdf(file.path = yourfile)

# l3 z/ y, w5 Y. D1 A( O! k

head(vgpm)

3 _2 ^0 m# V$ V

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

! ?5 E8 I: T. v& T2 g H8 E; ]

5 P: K7 m8 o5 s v4 u

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

9 ]+ F7 Y3 p6 W M# b1 p) i

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

# X! F! A; H7 J) w

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

3 o/ F2 R* d% r( N. V# b! H

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

, N& n9 b! n" g4 [4 W7 l& l/ G

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

. W4 v9 l j3 ]) Z+ F F2 \0 p5 _

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

: w2 _3 z1 _% q9 k' b: i2 I

mydat <- data.frame(

# a3 |% E' D* F2 R7 U- `# l

lon = c(120, 112, 116),

# c- X& p; L' h9 L# x9 S, X

lat = c(17, 15, 18),

. c" j: v( Q, R

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

# o: N" B1 \: b: m! r* X& k* }

)

4 ~5 }2 ~; {' V# r4 z+ \% `

match_df(mydat, file.path = yourfolder)

4 O* I) d8 B1 _0 Z5 _1 b+ v

绘制遥感地图

/ F% j$ j4 A+ g8 Q9 n

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

4 J( E6 }' j7 d; ]! p

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

5 a# `7 m" N9 ~/ e9 }. V6 I

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

; ?. p5 n5 o ?7 x0 c7 K8 H

library(viridis)

7 W( N2 z. [4 [6 y( s# [5 v3 `

library(ggplot2)

; F6 ^# W" l1 A* A

ggplot()+

% `# U# p. i& y3 E* t T3 v) Q' X

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

1 P1 R* S L: a, k& b4 H/ |5 C

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

+ \2 v2 S; u# p% D* q2 o2 _: f& D/ P& Y

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

& J( C4 [/ ?3 [9 Q! ~* Z7 R }. @4 q

: n% Y8 W; J/ H, T. _* U# B

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

7 Q$ A8 i% o0 ~- v

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

, o' R4 t1 |" F

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

; Q6 s6 d# l$ c- S

0 T6 Z4 M) K# |5 `$ D

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

' p- ]; B. p: i* E1 \7 m* e, u

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

@$ N8 G% E$ l1 ]& Q

dat <- read.delim(data.txt)

4 G0 i) G- e) ]

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

% `) Q+ g+ s) P* W1 N

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

8 m! D0 z% f( h, O& i5 i

dir.create(yourfolder)

3 W3 h, G; N; z

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

& U# g) z9 r) K4 `) `

for (i in Date) {

, A% G4 \6 B0 o

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

5 }9 ~, M4 I4 K U

dir.create(yourfolder)

& c/ p9 \ R# r/ d) W% r

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

' Z. ?0 U8 F. K7 z9 I9 r

yourfile <- dir(yourfolder)

% x5 T' H4 i$ a2 T0 ?

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

/ ~# h2 f% s- e5 E9 C4 y% ]. j6 A

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

3 I6 X# d" p" ? }

}

. R: L! K; s) o, \5 z

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

7 \- a7 ]8 k. [# T

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

/ E2 c6 u* k+ Y: @

Date <- dat[i,Date]

M3 x. |9 m- t8 x1 I$ \" _

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

- B9 R/ ^5 `% p

hdf <- read.delim(yourfile)

/ t3 b8 ^! ^2 V

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

! t& e3 U( N& V l

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

3 Q4 u ~% q/ ~+ D) \( [8 \

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

$ d9 Z* G$ v, ]: M2 u

}

! F. i0 ]0 [ c" S! v2 h8 B: B* Z3 {) k! E

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

! V2 v8 P5 d+ Z* {1 @2 q

8 w$ |$ s% M7 x4 B# m+ F5 _

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

) h( l3 l2 h9 l; o% t9 t . q9 \! B# `$ y$ Q k5 X( M. t# s0 W5 i7 ?. {( j ; Z. D2 r( Y: l7 D3 L/ Z! @3 |. y. M7 Y. T; K& v% M# t
回复

举报 使用道具

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