阅读 184

编程 | gee逐期导出研究区NDVI(基于Landsat)

0.背景

做遥感,绕不过去NDVI。如何快速、便捷的获取一个研究区该年度的每一期NDVI? 是通过USGS下载原始数据?试试GEE,批量导出研究区的每一期NDVI。

1.数据筛选

首先,在GEE中导入自己需要的矢量边界ROI,这个ROI可以上传shp或者自己在gee中勾画。随后选择卫星数据类型、时间。 本文选择了2021年之后,覆盖了研究区域的所有Landsat8影像。

Map.addLayer(ROI) Map.centerObject(ROI,9) //筛选数据 var roi_collection =landsat.filter(ee.Filter.date('2021-01-01','2021-12-31'))                             .filter(ee.Filter.bounds(ROI)) print(roi_collection) 复制代码

2.NDVI的计算函数

这一部分包括波段的选取,以及NDVI的计算。 如果NDVI,可以在bands参数里面修改。

//需要导出的波段 var bands=["B1","B2","B3","B4","B5","B6","B7","B8","B9","NDVI"] //或者只选择NDVI var bands=["NDVI"] 复制代码

接下来是针对collection中的每一张影像进行计算NDVI

//NDVI计算函数 var get_NDVI = function(image) {         image=image.clip(ROI);         var NDVI=image.normalizedDifference(['B4','B5']).rename(['NDVI']);         image=image.addBands(NDVI)         return image.select(bands)       }; //针对影像集中的每一张影像裁剪ROI区域、计算NDVI、导出相应波段 var NDVI_Collection = ee.ImageCollection(roi_collection)           .map(get_NDVI); print(NDVI_Collection) 复制代码

3.引入批量导出函数

var batch = require('users/fitoprincipe/geetools:batch') 复制代码

这个函数来自于github的一名大神,他针对gee批量导出做了一个整理,并且做成了API,我们可以直接调用。

该批量导出的具体代码如下所示:

Download.ImageCollection.toDrive = function(collection, folder, options) {          var defaults = {       scale: 1000,       maxPixels: 1e13,       type: 'float',       region: null,       name: '{id}',       crs: null,       dateFormat: 'yyyy-MM-dd',       async: false     }     var opt = tools.get_options(defaults, options)     var colList = collection.toList(collection.size());          var wrap = function(n, img) {       var geom = opt.region || img.geometry()       var region = getRegion(geom)       var imtype = IMAGE_TYPES(img, opt.type)       var description = helpers.string.formatTask(n)       var params = {         image: imtype,         description: description,         folder: folder,         fileNamePrefix: n,         region: region,         scale: opt.scale,         maxPixels: opt.maxPixels       }       if (opt.crs) {         params.crs = opt.crs       }       Export.image.toDrive(params)     }          var i = 0     while (i >= 0) {       try {         var img = ee.Image(colList.get(i));         var n = tools.image.makeName(img, opt.name, opt.dateFormat).getInfo()         wrap(n, img)         i++       } catch (err) {         var msg = err.message         if (msg.slice(0, 36) === 'List.get: List index must be between') {           break         } else {           print(msg)           break         }       }     }   } 复制代码

4.设置导出函数

主要是设置影像分辨率以及导出区域。

//导出影像 batch.Download.ImageCollection.toDrive(NDVI_Collection, 'Landsat_NDVI', {   scale: 30,   region: ROI }) 复制代码

5.完整代码展示

Map.addLayer(ROI) Map.centerObject(ROI,9) //筛选数据 var roi_collection =landsat.filter(ee.Filter.date('2021-01-01','2021-12-31')) .filter(ee.Filter.bounds(ROI)) print(roi_collection) //需要导出的波段 var bands=["NDVI"] //NDVI计算函数 var get_NDVI = function(image) {         image=image.clip(ROI);         var NDVI=image.normalizedDifference(['B5','B4']).rename(['NDVI']);         image=image.addBands(NDVI)         return image.select(bands)       }; //针对影像集中的每一张影像裁剪ROI区域、计算NDVI、导出相应波段 var NDVI_Collection = ee.ImageCollection(roi_collection)           .map(get_NDVI); print(NDVI_Collection) //引入批量导出函数 var batch = require('users/fitoprincipe/geetools:batch') //导出影像 batch.Download.ImageCollection.toDrive(NDVI_Collection, 'Landsat_NDVI', {   scale: 30,   region: ROI }) //查看大体效果 var NDVI_IMAGE=NDVI_Collection.mosaic() print(NDVI_IMAGE) Map.addLayer(NDVI_IMAGE) 复制代码

6.下载

比如我们使用的是四川省_资阳市_乐至县的行政区域,可以通过gee先看看大体效果(非单期)。

//查看大体效果 var NDVI_IMAGE=NDVI_Collection.mosaic() print(NDVI_IMAGE) Map.addLayer(NDVI_IMAGE) 复制代码

之后是针对每一期影像进行下载,点击Run,直接下载影像。 需要注意,为了每一期影像名字保持和原始影像相同。下载的影像是按照ROI区域进行了裁剪,并没有按研究区进行镶嵌。


作者:锐多宝
链接:https://juejin.cn/post/7016013698628059172

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐