-
说明:应读者的鼓励和要求,今天就更新一篇用SVM进行土地利用分类的案例,在代码里写了详细的说明,如果还不明白,私聊吧,知乎回复的比较慢,或者可以加微信好友,大家一起讨论和学习。
-
初学者如果有想学习有关GEE的其它知识,可以告诉我,如果我知道我尽量抽时间更新,和大家一起交流学习。
1 先大概的说一下基本的步骤
-
选取影像
-
数字化训练样本
-
训练模型
-
影像分类
-
验证模型
2 利用SVM进行土地利用分类
- 数字化训练样本
训练和测试样本 | 验证结果 |
---|---|
- 分类结果
真彩色 | 分类结果 |
---|---|
- 详细代码
// 研究区域
var roi = ee.FeatureCollection("users/comingboy1118/China/CH_shi");
var roi = roi.filter(ee.Filter.eq("市","武汉市"));
Map.addLayer(roi,{"color":'red',},"roi");
Map.centerObject(roi, 8);
// 获取影像
var image = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
.filterBounds(roi)
.filterDate("2019-01-01","2019-12-31")
.median()
.clip(roi);
// 选取某些波段用于分类
var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B10', 'B11'];
var image = image.select(bands);
Map.addLayer(image, {bands: ['B4', 'B3','B2'],min: 0, max: 10000,gamma:3,opacity:1},'image');
// 合并训练的数据(这里使用面,不是用点,为了更快的选取训练数据,点都是一个一个的选取,但是我画一个面就有很多个点数据)
var polygon =ee.FeatureCollection([water,build,other]);
// 通过选取的面,转为点数据,实际其实是根据选取的位置获取图像上的特征
var points = image.sampleRegions({
collection: polygon,
properties: ['class'],
scale: 30
});
// 以下就是纯粹为了选取XXX个点的数据进行训练模型,XXX个点数据进行验证模型
// 备注:有一个bug,如果点的数据少于输入的数据,那这个函数就没有意义了
// split train and test points
var split = function(data,number){
var tr = data.randomColumn('random', 555) ;
var train = ee.FeatureCollection([]);
var test = ee.FeatureCollection([]);
for(var i =1;i<=3;i++){
var cate = tr.filter(ee.Filter.eq("class",i)).limit(number,"random");
var cate_tr = cate.limit(number*0.8,"random",false);
var cate_test = cate.limit(number*0.2,"random",true);
train = train.merge(cate_tr);
test = test.merge(cate_test);
}
return [train,test];
};
var train_test = split(points,200);
var train = train_test[0];
var test = train_test[1];
// 统计每类有多少个数据
var figure_histogram = function(points){
var histogram = ui.Chart.feature.histogram({
features: points,
property: "class",
minBucketWidth:1,
maxBuckets:3,
}).setOptions({
legend: {'position': 'none' },
title: 'counts of different categories',
hAxis: {'title': 'categories'},
vAxis: {'title': 'counts'},
});
print(histogram)
return histogram
}
// 训练数据
figure_histogram(train);
// 验证数据
figure_histogram(test);
// 用默认的参数训练SVM模型
var trained = ee.Classifier.libsvm().train(train,'class',bands)
// 对图像进行分类
var classified = image.select(bands).classify(trained);
Map.addLayer(classified, {min: 1, max: 3, palette: ['blue', 'red','green']}, 'classified');
// 验证模型
var validated = test.classify(trained);
var testAccuracy = validated.errorMatrix('class', 'classification');
var accuracy = testAccuracy.accuracy();
var userAccuracy = testAccuracy.consumersAccuracy();
var producersAccuracy = testAccuracy.producersAccuracy();
var kappa = testAccuracy.kappa();
print('Validation error matrix: ', testAccuracy);
print('Validation overall accuracy: ', accuracy);
print('User acc: ', userAccuracy);
print('Prod acc: ', producersAccuracy);
print('Kappa: ', kappa);
4.代码链接 https://code.earthengine.google.com/f34604fd5335128efbcb56755437dde9