在GEE中实现提取特定点位的栅格值,这一功能有很大的用途,通常为地面站点或者地面采样点的位置,从特定的产品集中提取数据。例如:多光谱反射率,气象参数,植被指数等等。也介绍了像元二分模型计算植被盖度FVC的方法。(max:95%, min:5%)
下面是具体的思路解释,代码也有详细的注释,有点懒没有对代码拆分进行介绍。
该案例以欧亚大陆为ROI,进行部分点数据集的提取
//配色盘,可以自行定义,用于图层色阶的展示
var palettes = require('users/gena/packages:palettes');
var palette = palettes.misc.cubehelix[7];
// 定义了函数,这部分是批量化的时候需要改变的参数
var roi = region
var output_name = 'export result'
var point = samples
var start_time = '2018-07-15'
var end_time = '2018-08-15'
var features = ['Sample_ID','Latitude','Longitude','NDVI','EVI','LAI',
'b1','b2','b3','b4','b5','b6','b7', 'FVC']
/***************************************************************
1.定义样本点(经纬度信息)
***************************************************************/
// var roi = region
// var point = sample
Map.centerObject(point,4)
Map.addLayer(point,{color:'red'},'sample_point')
print(point)
/***************************************************************
2.制作数据集,从GEE中提取需要的产品集。(以MODIS为例进行介绍)
***************************************************************/
// 2.1 选择MODIS的植被指数产品——VIs
// var start_time = '2020-7-01'
// var end_time = '2020-08-31'
var collection_mod1 = ee.ImageCollection("MODIS/061/MOD13A2")
.filterBounds(roi)
.filterDate(start_time, end_time);
//select feature (NDVI,EVI)
var VIs = collection_mod1.select(["NDVI","EVI"]);
// 计算真实的数据值
var multiply = function(image){
// multply image
var img = image.multiply(0.0001);
return img.clip(roi)
};
VIs = VIs.map(multiply).mean();
// 加载图层看一下
Map.addLayer(VIs.select('NDVI'), {min:0, max:1, palette:palette}, 'NDVI');//.select('NDVI')
// 2.2提取MODIS的光谱数据___各波段的SR
function rmCloud(image) { // MODIS remove cloud
var qa = image.select('StateQA');
var cloudBitMask = 1 << 0-1;
var cirrusBitMask = 1 << 2;
var cirrusBitMask1 = 1 << 8-9;
var cirrusBitMask2 = 1 << 10;
var cirrusBitMask3 = 1 << 12;
var cirrusBitMask4 = 1 << 15;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0))
.and(qa.bitwiseAnd(cirrusBitMask1).eq(0))
.and(qa.bitwiseAnd(cirrusBitMask2).eq(0))
.and(qa.bitwiseAnd(cirrusBitMask3).eq(0))
.and(qa.bitwiseAnd(cirrusBitMask4).eq(0));
return image.updateMask(mask);
}
var SR_Col = ee.ImageCollection('MODIS/006/MOD09A1')
.filterBounds(roi)
.filterDate(start_time, end_time)
.map(rmCloud)
.select(['sur_refl_b01','sur_refl_b02','sur_refl_b03','sur_refl_b04','sur_refl_b05','sur_refl_b06','sur_refl_b07'],
['b1','b2','b3','b4','b5','b6','b7',])
var SR_Col = SR_Col.map(multiply).mean()
// print(SR_Col, 'SR_Col')
Map.addLayer(SR_Col.select('b7'), {min:0, max:1, palette:palette}, 'B7');//.select('b7')
// 2.3MODIS的叶面积指数___LAI
var LAI_Col = ee.ImageCollection("MODIS/006/MCD15A3H")
.filterBounds(roi)
.filterDate(start_time, end_time)
.select('Lai')
var LAI = LAI_Col.mean().clip(roi).multiply(0.1).rename('LAI')
// print(LAI, 'LAI')
Map.addLayer(LAI, {min:0, max:1, palette:palette}, 'LAI');
// 2.4计算植被盖度_____FVC
function calFVC(BestVI,region,scale){
var num = BestVI.reduceRegion({
reducer:ee.Reducer.percentile([5,95]),
geometry:region,
scale:scale,
maxPixels:1e13
});
print(num)
var min = ee.Number(num.get("NDVI_p5"));
var max = ee.Number(num.get("NDVI_p95"));
//print(top_min);
//print(top_max);
var greaterPart = BestVI.gt(max);
var lessPart = BestVI.lt(min);
var middlePart =ee.Image(1).subtract(greaterPart).subtract(lessPart);
//calculate FVC
var tempf1=BestVI.subtract(min).divide(max.subtract(min));
var FVC=ee.Image(1).multiply(greaterPart).add(ee.Image(0).multiply(lessPart))
.add(tempf1.multiply(middlePart))
return FVC.rename('FVC');
}
var FVC = calFVC(VIs.select('NDVI'),roi,1000)
print(FVC,'FVC')
Map.addLayer(FVC, {min:0, max:1, palette:palette}, 'FVC');
// 2.将第一部分提取的数据整合到一块,构建一个数据集
var Datesets = VIs.addBands([LAI, SR_Col, FVC])
// var Datesets = VIs.addBands(SR_Col)
print(Datesets,'Datasets')
/***************************************************************
3. 值提取到点
能实现这个功能的有很多函数,介绍下sampleRegions()
***************************************************************/
// extract feature_
var samples_datesets=Datesets.sampleRegions({
collection:point,
// properties:["Sample_ID","Longitude","Latitude"],
scale:1000
})
print('result_extract', samples_datesets)
/***************************************************************
4.将数据转为列表导出结果
***************************************************************/
//export
Export.table.toDrive({
collection:samples_datesets,
description: output_name,
folder:'Height_datasets(Spectra)',
selectors: features
})