GEE案例:根据点位提取栅格值(acrgis的多值提取到点)

1. 案例目标

在GEE中实现提取特定点位的栅格值,这一功能有很大的用途,通常为地面站点或者地面采样点的位置,从特定的产品集中提取数据。例如:多光谱反射率,气象参数,植被指数等等。也介绍了像元二分模型计算植被盖度FVC的方法。(max:95%, min:5%)

下面是具体的思路解释,代码也有详细的注释,有点懒没有对代码拆分进行介绍。

  1. 首先导入研究区的ROI和研究区域的点矢量。
    因为是完整的代码,定义参数的时候把需要改的单独列出来了,可以将变量代入具体的数据集进行更改。
  2. 根据自己的需求完善配色盘,也可以自己定义。
  3. 制作数据集,案例提取了MODIS的7光谱,NDVI,EVI,LAI,FVC并将所有数据整合到一块。(Figure 1)
    3.1. 使用的是均值mean的植被指数
    3.2. 数据均需要乘以0.0001是因为存储数据的时候需要节省空间,使用的都是整数型。我们需要从数据集查询scale factor是多少,然后乘以这个scale
    3.3 遥感影像,需要使用质量控制波段去云,代码中有去云函数
    3.4 计算FVC的代码也贴了上去,使用的是像元二分模型计算的FVC。马里兰的GLASS数据集应该有近40年的FVC产品,可能准确些吧!
  4. 提取值到点
    4.1 使用的是sampleRegions,具体含义可以在Docs查询。简要说明: collection是点矢量,properties是需要导出的属性(点矢量可能属性挺多),scale是提取点的时候检索的栅格的范围大小,对应数据集的栅格大小,landast就改为30,sentinel-2就是10
    4.2 reduceRegions貌似也可以,但是我不会
  5. 将结果下载到Google Drive
    GEE案例:根据点位提取栅格值(acrgis的多值提取到点)_第1张图片
    GEE案例:根据点位提取栅格值(acrgis的多值提取到点)_第2张图片

2. 完整案例

该案例以欧亚大陆为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
})   

你可能感兴趣的:(javascript,前端,python)