【问题标题】:Reclassify NDVI raster in intervals on Google Earht Engine在 Google 地球引擎上按间隔重新分类 NDVI 栅格
【发布时间】:2019-07-16 15:37:10
【问题描述】:

地点:

var roi = /* color: #d63000 */ee.Geometry.Point([-71.97203347683796, -13.529827050320447]);

收藏:

var collection = ee.ImageCollection('COPERNICUS/S2') 
  .filter(ee.Filter.lt("CLOUDY_PIXEL_PERCENTAGE", 10)) 
  .filterDate('2018-01-1' ,'2018-12-31')
  .filterBounds(roi)

计算 NDVI

function addNDVI(image) {
  var a = image.normalizedDifference(['B8', 'B4']);
  return image.addBands(a);
}
var ndvi2 = collection.map(addNDVI)
var ndvi2 = ndvi2.qualityMosaic('nd');

现在我想在内部 [-1-0.2]、[0.2-0.4]、[0.4-0.6]、[0.6-0.8]、[0.8-1] 中重新分类 NDVI 栅格,我试试这个代码

var ndvireclass = ndvi2.select("nd").divide(10).ceil();
Map.addLayer(ndvireclass, {bands:'nd', min: 0, max: 1, gamma: 1.5}, 'NDVI reclass');

但结果图像只有 2 类 -1 和 1

【问题讨论】:

    标签: javascript google-earth-engine


    【解决方案1】:

    有多种方法可以做到这一点,我更喜欢的方法是使用决策树分类器。从您的问题来看,您想要的范围似乎是 小于 0.2、02-0.4、0.4-0.6、0.6-0.8(可能遗漏了问题)和大于 0.8。 我们需要为此构建一个决策树,使用它来创建分类器,然后将其应用于图像。

    var DTstring = ['1) root 9999 9999 9999',
    '2) nd<=0.2 9999 9999 1 *',
    '3) nd>0.2 9999 9999 9999',
    '6) nd<=0.4 9999 9999 2 *',
    '7) nd>0.4 9999 9999 9999',
    '14) nd<=0.6 9999 9999 3 *',
    '15) nd>0.6 9999 9999 9999',
    '30) nd<=0.8 9999 9999 4 *',
    '31) nd>0.8 9999 9999 5 *'].join("\n");
    
    var classifier = ee.Classifier.decisionTree(DTstring);
    var reclassifiedImage = ndvi2.select('nd').classify(classifier);
    

    您可以查看工作示例here

    您还可以使用逻辑运算符来测试所需范围内的值,然后乘以类别编号以获得每个类别的像素。 例如对于第 2 类

    var nd = ndvi2.select('nd');
    var c2 = nd.gt(0.2).and(nd.lte(0.4)).multiply(2);
    

    如果您对 c1、c3、c4、c5 进行类似操作,您应该拥有只有像素值为 0 和类号的栅格。如果你添加所有这些层,你应该得到你想要的

    【讨论】:

    • 您介意稍微解释一下决策树的工作原理吗?如果我想更改间隔。
    • 您可以了解决策树本身here。至于字符串本身,我找不到很好的资料来解释,所以我会尽力在这里解释。首先,决策树字符串具有多行,并且在每一行上都指定了一个决策节点。每行有 5 个部分,例如。 1)root999999999999。这里 1) 是节点号,它向前连接到第 2n,第 2n+1 个节点。例如 1 到 2 和 3,3 到 6 和 7 等等。 rootnd 这是要检查的条件。
    • 对于我们的图像,它应该是波段名称,因为它会检查该波段中的值。 9999 是占位符,最后一个指定要分配的值。像 1。星号表示不再从该节点传播。要更改阈值,您只需更改条件中的值,它类似于添加一条线,但在这样做时您必须考虑线/节点号。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2018-09-15
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多