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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)$ D. V9 r$ t# s2 p& L# a

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

! C6 Y: p2 {* B. V

% h- z" Q4 ]4 F# B5 k) W

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

5 d M6 L0 n& X( G

安装nppr包

- }* f% y5 P! P( P7 n% }) _; B

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

4 B( [9 f" s' x

#下载nppr包

5 [& S" k4 ?7 g5 F

#install.packages(remotes)

1 a0 F/ }' W$ q# o( H8 g

remotes::install_github(chaoxv/nppr)

, \# j* [# u5 v' S* G) c( {

#加载相关R包

( x% M( T( }0 I4 _ B3 ~8 N1 H

library(nppr)

! v& s+ X e. K, {: y1 L* r

library(RCurl)

# m7 l/ h* p, v

library(XML)

) I5 ]* B( `, v; X' I: o2 w0 y

library(R.utils)

% u7 s' n. \2 k0 ]

library(tidyverse)

5 x: N( z$ {4 y6 F

library(lubridate)

% V9 ~( u7 }) ^1 N8 C6 Q) {

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

' \+ u9 s) x7 p! ?- W- j# [

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

" j: c1 H2 J) E: [" W

! q2 w6 e( L7 C+ b* K3 o

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

, @' V( Q5 g( S& t/ R; r( e* u4 n. F* M

#创建工作路径

7 \2 W2 \7 j4 a- [! B

yourfolder <- F:/R/nppr/vgpm

# D5 P4 h' C9 y' w: X# U# p' x

dir.create(yourfolder)

% G% l2 L5 u4 {/ [) ]$ ?

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

% d2 ], j9 T8 P! {6 p: m' J

get_npp_vgpm(

4 `4 |" p+ x& i% d; e8 X9 w: I" w

file.path = yourfolder,

0 f/ r V& N; ~& u/ B

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

; T6 m# s4 Q8 r* I0 ^2 B8 c

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

' O# t, w$ |9 K% [) q O

satellite = MODIS, #选择卫星

9 L2 t- S9 Y4 ?1 @3 y

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

5 w3 N3 ~1 {, Y

maxdate = 2016-03-15

) \: B [7 z' v/ b* l: p

)

7 T$ L, m( v1 t- x5 }" `* |+ G

- \% O( J$ i: w! S' k

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

5 l) O) k" V9 F z1 G3 [; P0 f0 u

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

, Z# f2 n2 I Z; o# a! k$ P9 o* g

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

: P% s W( ]( J& m `, J' e

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

8 R5 c* k7 u* Z

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

# z2 Y: O% \& y$ B- ^1 Y

vgpm <- read_hdf(file.path = yourfile)

# w% e* t0 L7 \; ?) x: H

head(vgpm)

8 {! C/ E2 i2 { Z

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

& b6 D+ q( W- {) w. o7 j% s

* y7 j; l3 a1 ?2 D+ Y0 r& g

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

7 Z- l! v1 k! ?8 x6 c

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

: l2 r4 K4 N T+ y( z( \+ R

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

5 h/ N! q+ Q: ?, q/ O

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

' e7 C4 I1 R o6 e, S

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

$ L) m1 u5 }* A) {. ?) T1 ]

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

8 y/ R9 s, [, N3 l

mydat <- data.frame(

1 g" E/ `; ~/ O3 w9 s2 j

lon = c(120, 112, 116),

- I- |2 G/ B8 Q7 `# |) @0 R

lat = c(17, 15, 18),

4 M; Y w5 W& ?. I/ M

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

* _% n Q( c n4 F! e$ M2 g

)

9 x9 W8 r3 Q* Q2 J) ~

match_df(mydat, file.path = yourfolder)

. L; E& @; L0 D( J# B% n

绘制遥感地图

1 B0 v* J- O, J2 \

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

( V( M" D) M* k2 {& D

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

3 \7 o4 v& d5 T6 |

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

1 l; O7 B: R" l

library(viridis)

' O- ?# K: q2 A

library(ggplot2)

3 G! O+ _1 c: G: @* e& Z0 Q2 ]" A# K

ggplot()+

" q3 \- x, ~. y. X$ d: I

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

! e$ e4 i7 ` h

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

, U; f9 r W9 x. k+ ?

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

8 H+ R1 w; V0 l+ j

. m; e1 i' P6 s. U: g6 y( ^

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

- g/ o L' I0 P* T0 d: K

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

- \8 b- R _" D: }: D& [

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

1 a' f5 M, A+ x8 b" j, J

) O- `9 j3 @2 B. d

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

1 ?0 [+ D. h" h! w) G4 o; G0 ^

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

: ^" y& b8 L' s. Q1 d, t- C

dat <- read.delim(data.txt)

" D' y3 b$ n, ~4 w) S6 O! G4 ^8 C# ?- q

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

- @3 H. [8 q6 \9 g1 l+ ], Q& i. A

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

! { G m& n1 v Z( m

dir.create(yourfolder)

' F' R4 y! u0 l( m$ O6 J4 k [7 o

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

4 r( b( Q2 o) {* x4 O' q) `3 R

for (i in Date) {

4 b' v5 N+ y0 [. D3 P! \- N

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

. ~$ H _! e9 p0 m# p1 M+ b

dir.create(yourfolder)

) n* B4 X) J5 l/ Y, u4 ^

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

2 o. ]8 c$ `6 E" K8 G7 G

yourfile <- dir(yourfolder)

# I" T9 Y) E- n/ l% ~

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

" z7 @% R8 V7 H! Y: D1 V

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

) B. t4 O6 T9 F' V

}

* D$ c+ s4 W+ h# H; p$ B

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

( x- @' l, ?3 D) ~% a, Y( p

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

8 h( O+ K/ ~6 S: y

Date <- dat[i,Date]

6 l; }9 Q; s% V4 U1 M

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

: C; V& k+ z1 l2 C

hdf <- read.delim(yourfile)

" n" r! m# x0 p/ [

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& l. V$ E# S% K& h

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

# m" y9 C! l; F5 g

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

2 g! e+ U0 a5 N) O% I: M% R

}

/ s8 F {+ \% t- c

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

4 v! \& `1 r" S$ V

$ I/ H& d) ~% u! A

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

) a" o! I3 K1 f3 J3 R" U) D! r 6 O8 K, {4 R$ g+ ^. q$ ^3 M$ v4 x5 t! h- d' q 4 K) M( h( z5 \# p 8 F1 M, N5 w3 Z) T/ j/ M
回复

举报 使用道具

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