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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP). ` i" H3 Q8 h6 j" j

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

& V& z8 o. a# Q) \

0 n, [% }) f6 H5 |& r; d

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

% P+ k4 h7 o; C- q

安装nppr包

. M. N& F- m; _6 I

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

/ _7 P: }# ^ t4 y# w4 N5 y% k

#下载nppr包

1 P7 ]# X& C i9 J' J' {4 N4 Y

#install.packages(remotes)

% W9 i5 q$ o: R9 u" E* q. i6 e8 b

remotes::install_github(chaoxv/nppr)

+ Q( z. a- O8 f( A' d

#加载相关R包

, s o, [& b! W( ?" d/ Q8 B* y( m

library(nppr)

# M9 s- D& b4 w. [

library(RCurl)

% `- X% n9 `) S3 j' g

library(XML)

2 ]2 ?; y! m( ]

library(R.utils)

% x. q, W7 X% ~8 a- f* E

library(tidyverse)

7 J! z9 w/ L) @5 {

library(lubridate)

) d# T- _4 m) ~

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

' ]! E& Y8 J7 J, j# ?

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

5 [) {% b. s# d* w. |

: K' f) @ A. i

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

9 N9 \3 {# Q3 y ~7 u7 C% S

#创建工作路径

, W+ g' N0 D+ a$ K8 @: Q3 M) ]( b" J

yourfolder <- F:/R/nppr/vgpm

4 t0 }" l+ I* F* A7 p

dir.create(yourfolder)

0 H7 S4 ^! y p$ ~

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

3 l1 Q6 G1 E8 y2 b7 O Q" s

get_npp_vgpm(

& W" K' U; L! u! T4 f6 I% i

file.path = yourfolder,

+ V" F \* q: Y4 \& ^+ i

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

' f+ T7 R. P8 C/ h" @. G

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

0 i, Y1 `, |* a" W& T5 [

satellite = MODIS, #选择卫星

+ O3 h/ ~8 M4 Y# P6 y

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

7 J8 n/ f0 r; w0 P, E7 |1 H

maxdate = 2016-03-15

& b. I, k7 v& T" S) D

)

, {; _/ `* r( I3 a$ e& S

! I) S: \1 ]. z; l+ ?

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

# C8 S9 Z& I( P9 d) K; b0 V8 h2 W! E4 w; g

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

8 x2 U R9 n6 W; _1 ?

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

5 r5 |) |" W' V, ]) f. C

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

& u. B4 X6 F: U; ?0 Q" f2 y

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

. e6 }* ~3 u4 j% m9 l2 I3 L

vgpm <- read_hdf(file.path = yourfile)

5 Z! i6 I3 `. J6 F2 c# o7 e

head(vgpm)

9 s5 @3 D. L( H" w- j; p$ i+ O

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

}4 _% T+ j, q; @

9 X# }- ?, ]+ M2 D. a

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

+ z0 f2 M( r% T- v% n9 w

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

* f2 P! j. D9 @

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

5 `* a4 e1 i, G& K! p, O c

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

7 E2 T% T0 K' O

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

5 o/ L+ R) {% P. o& w

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

9 }, Y: X; j& `- e: A9 r5 _

mydat <- data.frame(

/ [% ?: v1 R0 [& A2 |

lon = c(120, 112, 116),

. ]! r3 k& Y6 u/ f1 p( ?

lat = c(17, 15, 18),

5 ]% L' j' ~, i# V9 l1 H

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

! i+ d) K+ b- D: E# P

)

0 W! d1 J, u- q" R) U* m

match_df(mydat, file.path = yourfolder)

4 o( {% ~0 y; Y" D. ~2 z' E! ?

绘制遥感地图

4 Z& U% Y [2 i

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

/ H9 ?, |( F: O' u: O

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

" D/ Z- l( H F) H: w

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

& |- C& r, C0 B9 h

library(viridis)

& E' b* d$ E+ ]# S

library(ggplot2)

1 Z" w0 T$ Z9 r2 v5 s

ggplot()+

* e; X/ c. Q- O. g; e

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

, K# n: `1 x" Y3 m9 F, X0 `

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

! A! d1 q$ U5 i3 X5 v9 |

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

}$ Y: Z3 b' s! p8 h3 w4 O9 r. K, G: m

5 q; }) @3 z4 f2 p6 p

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

/ X5 }4 G6 k- i# w d

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

7 L: w( a F. N' l' T, O

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

3 u+ N ^6 c9 Q

! K: y6 \7 G1 R5 e1 D5 @4 c

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

. d* b4 o& K* j) Q9 v- q. }

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

, w3 a7 ?1 ]( x: P

dat <- read.delim(data.txt)

3 @& q( S8 x# {$ V ^" b

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

" c7 u% U t) t

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

3 J- z" T; b) F' x% o3 w

dir.create(yourfolder)

! h* y0 T& m( J; o, ~. M J: S' ^

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

( U% N# }! t9 c6 U( z# Y' M7 x

for (i in Date) {

# c3 V/ d+ U6 }

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

) |+ C9 f4 e! B8 y

dir.create(yourfolder)

) Z0 x2 k8 m5 I& V! r

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

" y) A0 P- @' x

yourfile <- dir(yourfolder)

9 U; P1 ^$ p; [; K- _3 l! K

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

/ d- ]. h! t1 e- f/ s$ ]8 D7 l

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

( j6 S$ `) d0 V$ k

}

$ p8 |8 T' P$ s) t+ h. o& Y

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

* s7 F& V4 f+ ]& W9 L4 b( p/ o

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

4 X5 e1 U( E3 [" u+ T$ w5 _1 u

Date <- dat[i,Date]

4 P1 M* q8 i/ x& x

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

& O( l- ]$ {6 o7 o1 g" \6 }( q. E& w

hdf <- read.delim(yourfile)

8 ~5 I/ z: x7 C& c0 c

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 i( c" X1 B8 i& U" X7 A3 g

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

$ ^0 Z5 z6 F# l7 i# o9 s) P8 C

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

* r7 X- B8 r+ @- w) ?: Y

}

8 n3 e2 `) N/ D6 t" I$ I6 W

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

6 d; b6 f# H. l0 |/ [

5 G/ w# A; R- e( y/ {- P

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

& I% V- L5 Y' d1 E8 a: h# g! B2 C i& w( w7 w : ^8 e4 H) @/ V$ k R; V. e 4 D' M/ R2 E( ], T+ N" W& m, J * }7 U6 i& p2 Y& H$ ^0 L: m" C& J' V( p
回复

举报 使用道具

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