这是MODIS数据的简介和下载的最后一篇,下载方式的进阶版——基于MODIS Web Service的下载方式。
这篇是笔者课程上机实习内容之一,做些简要总结和整理。
事实上MODIS产品系列就如前面提到的,由于搭载在Terra星和Aqua星上,所以产品就包括了Terra星、Aqua星以及二者集成的产品。分别以MOD(Terra星)、MYD(Aqua星)、MCD(二者集成)作区分。具体的产品查询网站除了前面文章简单提到的之外,还可以查看官网。
https://lpdaac.usgs.gov/dataset_discovery/modis/modis_products_table/
当然这一次进阶版的下载方式是基于Web Service的。那么Web Service是什么呢?这边引用了课程ppt的一段话。
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
简单说,这是个方便你下载的插件。具体的下载地址就在下面了。官方提供了多种语言的客户端,包括Java,Perl,Python,Kepler,Matlab和R。本篇主要介绍Matlab和R的客户端如何下载MODIS数据。
先介绍Matlab的客户端,首先在官网下载Matlab的客户端。
客户端压缩包文件:
客户端在Matlab的部署非常简单。只需要拷贝到Matlab的工作目录即可。当然使用的时候要求位于如图的路径中。
接下来就可以愉快地使用了。当然,由于官方的镜像搬迁的问题,需要更新对应的镜像地址。
对应在Matlab客户端的modisClient.m文件中找到替换的镜像地址,保存后即可开始使用。
在Matlab中调用不含任何参数的modisClient,可以看到可供下载的MODIS产品列表。
modisClient()
用产品名称作为参数,则可以看到该产品下所有数据集。
modisClient('MOD15A2')
modisClient('MOD15A2','Lai_1km',36.833,116.567)
加上数据集名称(以1 km的叶面积指数数据为例)以及经纬度坐标。结果为对应的数据集(该数据8天为间隔)所在的时间范围。
在前面的基础上加上时间范围即可用客户端下载对应的MODIS数据。数据的下载格式是一个多元结构体。包括了数据、转换因子、对应时间序列和单位等等。这样我们就用Matlab下载到了对应的MODIS数据。
YC_LAI2009=modisClient('MOD15A2','Lai_1km',36.833,116.567,2009000,2009365)
接下来我们讲的是R语言的客户端及其下载方式。R语言的客户端有两种配置方法,一个是基础设置(基于SSOAP来进行),一个是高级设置(MODISTools包)。
笔者个人使用的是高级设置,基础设置没有配置过。只是对官方给出的例子做了下翻译,具体的demo如下:
##确定你安装了SSOAP包,否则先安装SSOAP,用install.packages("SSOAP")
##接着你就可以尝试用命令行的方式来下载裁切你想要的MODIS影像数据了
## 载入包
library(SSOAP)
## 获取SOAP服务
ornlMODIS = processWSDL("http://daac.ornl.gov/cgibin/MODIS/GLBVIZ_1_Glb_subset/MODIS_webservice.wsdl")
## 定义函数设置
ornlMODISFuncs = genSOAPClientInterface(operations=ornlMODIS@operations[[1]], def=ornlMODIS)
## 使用获取裁切影像的函数设定
result = ornlMODISFuncs@functions$getsubset(40.115,-110.025,
"MOD11A2","LST_Day_1km","A2001001","A2001025",1,1)
##打印结果
print(result)
基础设置R语言demo地址:
接下来用MODISTools包来做测试,GetProducts函数类似于Matlab的moidsClient():
GetProducts()
而对应的查看数据集的函数并不是在GetProdcuts函数中填入参数,而是使用GetBands函数。
GetBands("MOD15A2")
对应查看数据时间范围的函数为GetDates。
GetDates(36.833,116.567,"MOD15A2")
而类似于Matlab客户端下载数据的函数则为GetSubset和MODISSubsets。
YC_LAI2009<-GetSubset(36.833,116.567,"MOD15A2","Lai_1km","A2009001","A2009081",KmAboveBelow = 0,KmLeftRight = 0)
GetSubset函数较为简单。但笔者测试时,发现终止时间仅能到达第81天(LAI数据为8天合成产品)。目前尚不清楚具体原因,故最后使用MODISSubsets获取对应的数据。MODISSubsets必须先建立一个数据框作为经纬度(lat,long为字段名),时间限制范围(start.date,end.date为字段名)的数据。而函数中比较重要的参数还包括了Size和TimeSeriesLength,Size可以用默认值(经纬度位置所处瓦片数量,c(0,0)表示像元中心值),TimeSeriesLength表示时间序列长度,等于1代表从一年的开头到结尾。运行程序,会发现在工作目录下生成了一个.asc文件(即对应MODIS下载下来的数据)。
yclai2009<-data.frame(lat=36.833,long=116.567,start.date=2009,end.date=2009)
MODISSubsets(LoadDat = yclai2009,Products = "MOD15A2",Bands = "Lai_1km",Size = c(0,0),StartDate = T,TimeSeriesLength = 1)
最后对获取的LAI数据进行绘图可视化。
#Matlab中
Puredata=[YC_LAI2009.data(:,:)]
plot([0:(length(Puredata)-1)]*8+1,Puredata*YC_LAI2009.scale,'b-')
ylabel=(YC_LAI2009.units)
xlabel=('day of year')
title=('禹城站2009年LAI')
#R中
a<-read.table("Lat36.83300Lon116.56700Start2009-01-01End2009-12-31___MOD15A2.asc",sep = ",")
lai<-data.frame(day=seq(1,365,8),lai=a$V11*0.1)
plot(lai,type="l",pch=16,col="blue",xlab="day of year",ylab="LAI",main="禹城站2009年LAI")
Matlab绘图结果
R绘图结果
总的来说,Matlab和R的客户端下载各有优缺点,而基于MODIS Web Service的下载方式最大好处就是在于它的Subset功能,而不是需要先下载整景影像再处理。在做单点模型的时候是非常快捷的。当然客户端的其它函数还有很多,包括像质量控制。本文没有对数据进行质量控制。实际研究中这个是必须进行的步骤(也可以基于客户端的函数来进行,譬如R里面的QualityCheck函数,Matlab的modisClientGetQC等)。
此外地理所也开发了在线平台,研究人员只需填写所需参数即可下载。
http://159.226.110.142/carboncloud/datetool/toolmethod?url=onlinedo&pId=3