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

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

[复制链接]
使用nppr包下载和处理海洋遥感数据(SST、Chla、PAR、NPP)# L: G. X9 p* q& y- p! }0 |4 x3 m6 q1 f

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

6 I' a# j6 G! X% v* {9 h5 K" ]* o

" ~# x: H9 K! S

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

& L1 n3 m# g! H2 w

安装nppr包

: u3 \! I1 e0 ^

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

! N- ?" X( W5 n x

#下载nppr包

; U9 n) T& o! W6 }

#install.packages(remotes)

- w% L+ w! p6 s8 q6 A$ Y! R# _

remotes::install_github(chaoxv/nppr)

$ X4 P* q0 d4 q: V; o$ |) f( ?" x

#加载相关R包

9 E! K$ U7 ~/ l: k8 h: ]3 S$ }

library(nppr)

\0 ^ X3 S, a% ^

library(RCurl)

$ `' o$ b8 M& P7 U: M8 {1 |+ |/ k

library(XML)

8 |. @0 e9 W3 G

library(R.utils)

4 b/ ^( p4 W& p2 i3 w9 E" k* w0 c' L

library(tidyverse)

+ g/ y+ \# W1 g) X

library(lubridate)

; D J" q3 _( M, L

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

' k" q: Q0 g2 s8 m5 U' g: ^

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

5 a% m! [2 j# U! x5 {

. o4 m, e' Q e7 s2 f

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

3 n/ U, g2 [" d, W+ b1 H# s

#创建工作路径

- R- \1 F, d( U* A

yourfolder <- F:/R/nppr/vgpm

' P5 d6 M# M3 r, ]8 W$ }% ]7 p

dir.create(yourfolder)

) j5 M1 t% f& D8 j$ |

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

; L0 a. d) |2 ~; @7 Z# @- _

get_npp_vgpm(

% ~: p9 p7 W0 H3 q* q2 O7 i

file.path = yourfolder,

8 `; f. e3 _. |% U0 `

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

7 m$ s! j' x9 K! S2 N- X! S( t

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

" U" O0 H \9 V- ^' n8 \

satellite = MODIS, #选择卫星

9 Y( u6 s: w3 g4 g7 K

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

9 ?3 B7 v- t* k0 }0 d7 X

maxdate = 2016-03-15

" c- e6 q- R6 O% Y- X% Q0 U7 S

)

" q8 c# ^2 g% I8 d) K' }; |

) H2 w7 Q8 @ U, Q# r* C& j

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

5 Y& Y2 B' K3 U) s( [: a1 J+ {4 ]

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

! ] d+ X9 X7 r) x

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

8 [" G! j+ u2 D/ [4 |0 Q

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

" r8 ^( S, c g7 D

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

3 y4 h/ } L; ?3 [; y0 ~

vgpm <- read_hdf(file.path = yourfile)

# O B4 E5 G3 [5 G7 u) O! }9 t' J

head(vgpm)

; n1 r& i; a: O

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

: V2 Q8 k; F, v$ M( V5 }

; y$ @" I5 D \( ^% \1 w) c

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

1 }" p O2 f; u+ Y

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

+ f+ u: r" v1 `) T0 j6 n' @9 |

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

* _3 `8 { R/ i2 y' T O

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

+ T* u$ x1 `5 i

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

u' b0 R( m0 K! m: N6 j

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

1 {& t! q. s# l9 L6 i' m( l: b: Z

mydat <- data.frame(

! c; z) K# Q/ ?5 z

lon = c(120, 112, 116),

8 [9 j6 l2 `/ L) ~9 Q: v

lat = c(17, 15, 18),

( }( [3 E8 i7 w" O; y0 n- C

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

8 h1 l2 a$ J2 s+ k. Y! L0 H! s' Y

)

`' G" H t/ I; w0 m' o# L

match_df(mydat, file.path = yourfolder)

- A, }) g" k! J6 h7 L

绘制遥感地图

8 ~- O9 z& Z6 j( {) E

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

# n" x5 Q" O/ l3 W% d

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

/ K: W) \- ~7 N/ k% a

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

& y! v) z# d: V8 Q' |

library(viridis)

5 r$ N: F' @3 M3 y; @

library(ggplot2)

8 h: r: [ q3 ]/ s+ c

ggplot()+

& v# s& I' {' ?- B4 g

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

3 H& e* d3 I s9 C1 I

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

3 C" e( y1 ~) Q8 F

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

# T! c: @7 k! V) K% N

" M8 R! E( q' n* L

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

9 H5 z; @9 W/ \$ y9 }# n b) K9 I! r

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

! ?0 F3 y0 ^: S) Q* ], N9 j

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

; B2 j: ^, |6 x- I

1 w# q% k" o" y) o- L

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

+ x) C9 `- Q f4 o: \3 o5 i4 C

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

0 r3 W. X1 \/ g f) O3 V

dat <- read.delim(data.txt)

7 ^9 _1 k7 \% y

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

5 U0 H, Q$ k" _7 n+ y

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

+ u: s2 E6 N, M) Y

dir.create(yourfolder)

* i( S4 E+ B6 p# `

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

: {, N+ O. E# P/ W8 \; c5 P

for (i in Date) {

( Q, K1 Z' R* m; c7 A+ O! R$ f9 H

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

# P0 V2 `1 b! V3 A2 P, E

dir.create(yourfolder)

7 @6 r; f4 Z% b e' }4 x

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

" F: U) {& m' x7 T/ E1 F4 Z, p& x

yourfile <- dir(yourfolder)

; S+ @' C$ M$ Q, P8 P. N

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

/ p) I* B0 o) [! O* [5 G

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

( G' H% C8 J6 Z i( m8 a2 O

}

/ q" \6 o8 n0 ?; i, w8 i

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

6 g' k5 [, y0 g) B7 \

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

# s$ Z- J' Y# Y( G8 N4 O

Date <- dat[i,Date]

5 r1 S* L# r- |6 Y7 d

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

. R$ M' R" R( W' Q

hdf <- read.delim(yourfile)

- S! k+ H0 H/ l8 X2 f" a

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 e- E; @( @) g J; E1 t% z

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, I/ \( f. n6 P" G

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

0 ]7 k( R* f8 a+ T' ], E3 t

}

, |. \% j- b" n& X) L G

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

6 f R# n8 a" s

1 d, l: {: b, r: M% e/ S2 H

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

9 X0 f: Y- ?" ` _ : k" W+ F6 }! `" C. a4 e: M( X% r, P $ i3 `8 R E& C$ L. N $ V. `/ h+ d3 t) ]) R/ j/ ], F: E
回复

举报 使用道具

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