Google Earth Engine(GEE)——基于两期sentinel2遥感影像使用随机森林方法进行土地分类中各地类面积的统计结果分析

上一回分析了以下求如何进行获取地类面积转换的影像结果,这次我们进行地类转换后面积的统计计算,面积统计计算主要是两个,第一个首先要统计各地类影像面积,第二个就是要统计地类中的面积。期间会用到一些函数,如下:

上一篇文章的链接地址:

https://mp.csdn.net/mp_blog/creation/editor/131506639

函数:

ee.Reducer.frequencyHistogram()

Returns a Reducer that returns a (weighted) frequency table of its inputs.

返回一个Reducer,返回其输入的(加权)频率表。 

No arguments.

Returns: Reducer

ee.Image.pixelArea()

Generate an image in which the value of each pixel is the area of that pixel in square meters. The returned image has a single band called "area."

返回一个带有面积area属性的部分

No arguments.

Returns: Image

ee.Reducer.sum()

Returns a Reducer that computes the (weighted) sum of its inputs.

No arguments.

Returns: Reducer

group(groupFieldgroupName)

Groups reducer records by the value of a given input, and reduces each group with the given reducer.

统计一个群组的数据,就需要使用group函数,他会对其每一个都进行统计分析。

Arguments:

this:reducer (Reducer):

The reducer to apply to each group, without the group field.

groupField (Integer, default: 0):

The field that contains record groups.

groupName (String, default: "group"):

The dictionary key that contains the group. Defaults to 'group'.

Returns: Reducer

代码:

var bangalore = ee.FeatureCollection('users/ujavalgandhi/public/bangalore_boundary');
var urban = ee.FeatureCollection('users/ujavalgandhi/e2e/urban_gcps');
var bare = ee.FeatureCollection('users/ujavalgandhi/e2e/bare_gcps');
var water = ee.FeatureCollection('users/ujavalgandhi/e2e/water_gcps');
var vegetation = ee.FeatureCollection('users/ujavalgandhi/e2e/vegetation_gcps');
var s2 = ee.ImageCollection('COPERNICUS/S2_SR');
var geometry = bangalore.geometry();
Map.centerObject(geometry);


var rgbVis = {
  min: 0.0,
  max: 3000,
  bands: ['B4', 'B3', 'B2'], 
};

// 2019 Jan
var filtered = s2
  .filter(ee.Filter.date('2019-01-01', '2019-02-01'))
  .filter(ee.Filter.bounds(geometry))
  .select('B.*');

  
var before = filtered.median().clip(geometry);
// Display the input composite.
Map.addLayer(before, rgbVis, 'before');

var training = urban.merge(bare).merge(water).merge(vegetation);

// Overlay the point on the image to get training data.
var training = before.sampleRegions({
  collection: training, 
  properties: ['landcover'], 
  scale: 10
});

// Train a classifier.
var classifier = ee.Classifier.smileRandomForest(50).train({
  features: training,  
  classProperty: 'landcover', 
  inputProperties: before.bandNames()
});

// // Classify the image.
var beforeClassified = before.classify(classifier);
Map.addLayer(beforeClassified,
  {min: 0, max: 3, palette: ['gray', 'brown', 'blue', 'green']}, 'before_classified');


// 2020 Jan
var after = s2
  .filter(ee.Filter.date('2020-01-01', '2020-02-01'))
  .filter(ee.Filter.bounds(geometry))
  .select('B.*')
  .median()
  .clip(geometry);

Map.addLayer(after, rgbVis, 'after');

// Classify the image.
var afterClassified= after.classify(classifier);
Map.addLayer(afterClassified,
  {min: 0, max: 3, palette: ['gray', 'brown', 'blue', 'green']}, 'after_classified');

// Reclassify from 0-3 to 1-4
var beforeClasses = beforeClassified.remap([0, 1, 2, 3], [1, 2, 3, 4]);
var afterClasses = afterClassified.remap([0, 1, 2, 3], [1, 2, 3, 4]);

// Show all changed areas
var changed = afterClasses.subtract(beforeClasses).neq(0);
Map.addLayer(changed, {min:0, max:1, palette: ['white', 'red']}, 'Change');

// 我们将之前的图像乘以 100,然后添加之后的图像
// 生成的像素值将是唯一的,并且代表每个唯一的过渡
// 即 102 是城市到裸露,103 是城市到水等。
var merged = beforeClasses.multiply(100).add(afterClasses).rename('transitions');

// 
var transitionMatrix = merged.reduceRegion({
  reducer: ee.Reducer.frequencyHistogram(), 
  geometry: geometry,
  maxPixels: 1e10,
  scale:10,
  tileScale: 16
});
// 使用频率直方图获取每个类别的像素计数
print(transitionMatrix.get('transitions'));

// 如果我们要计算每个类过渡的面积
// 我们可以使用分组reducer

// Divide by 1e6 to get the area in sq.km.
var areaImage = ee.Image.pixelArea().divide(1e6).addBands(merged);
// 按每个过渡类计算面积
// 使用分组Reducer
var areas = areaImage.reduceRegion({
      reducer: ee.Reducer.sum().group({
      groupField: 1,
      groupName: 'transitions',
    }),
    geometry: geometry,
    scale: 100,
    tileScale: 4,
    maxPixels: 1e10
    }); 

// 对结果进行后处理以生成干净的输出
var classAreas = ee.List(areas.get('groups'));
var classAreaLists = classAreas.map(function(item) {
      var areaDict = ee.Dictionary(item);
      var classNumber = ee.Number(areaDict.get('transitions')).format();
      var area = ee.Number(areaDict.get('sum')).round();//取整 
      return ee.List([classNumber, area]);
    });
var classTransitionsAreaDict = ee.Dictionary(classAreaLists.flatten());
print(classTransitionsAreaDict);

最后统计的像素数量和各类转化的面积 

 最后的这个结果就是各类面积从一类转化为另一类的一个面积统计。

猜你喜欢

转载自blog.csdn.net/qq_31988139/article/details/131523334