目标:从每期影像中提取某一点的NDVI值
结果:在某一时段范围内,有多少期影像,最终就返回多少个点值,并以CSV文件存储
要注意的点:
-
去云函数部分,不同陆地卫星cloudShadowBitMask和cloudBitMask的定义是不同的,“<<的数值”需要根据cloud shadow和cloud来设置;
-
NDVI函数部分,为了数据存储方便、节省空间,nir和red存在一个尺度缩放和浮动误差,需要先对nir和red进行数值运算后,再运用到波段计算中;
参考:
-
Google Earth Engine(像元值提取) - 知乎 (zhihu.com),GEE学习笔记 (二):如何批量提取点的像元值? - 知乎 (zhihu.com),(2条消息) GEE学习笔记三 利用GEE获取矢量点处的NDVI值_gee ndvi_努力的噗噗的博客-CSDN博客
// 定义点,坐标,坐标系
var p1 = ee.Geometry.Point([100.4643,38.0473], "EPSG:4326")
// 将点集成列表,可以写入多个点
var pts = ee.FeatureCollection(ee.List([ee.Feature(p1).set('name','p1')]))
// 去云函数,以Landsat8为例
function maskL8sr(image){
// Bits 4 and 3 are cloud shadow and cloud, respectively.
var cloudShadowBitMask = (1 << 4);
var cloudsBitMask = (1 << 3);
// Get the pixel QA band.
var qa = image.select('QA_PIXEL');
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
return image.updateMask(mask);
}
// 定义NDVI计算函数,以Landsat8为例
function NDVI_LS(image){
var ndvi = image.expression(
"(nir-red)/(nir+red)",
{
"nir": image.select("SR_B5").multiply(0.0000275).add(-0.2),
"red": image.select("SR_B4").multiply(0.0000275).add(-0.2)
}).rename('NDVI');
return image.addBands(ndvi)
}
// 产生数据集
var dataset = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterDate('2013-01-01','2021-12-31')
.filterBounds(pts)
.map(maskL8sr)
.map(NDVI_LS)
.select('NDVI')
var ft = ee.FeatureCollection(ee.List([]))
var fill = function(img, ini) {
var inift = ee.FeatureCollection(ini)
var ft2 = img.sampleRegions({
collection:pts,
properties:ee.List(['name']),
scale:30
});
var date = img.date().format()
var ft3 = ft2.map(function(f){return f.set("date", date)})
return inift.merge(ft3)
}
// 迭代获取影像集中每一幅影像的值
var newft = ee.FeatureCollection(dataset.iterate(fill, ft))
// 结果输出
Export.table.toDrive({
collection: newft,
description: 'NDVI_L8',
fileFormat: 'CSV'
});