目录

  • 写在前面
  • 1.构建物候特征
  • 2.构建光谱特征
  • 3.将所有影像合并为一幅影像
  • 4.构建随机森林算法进行分类
  • 5.算法的存储
  • 6.面积统计

写在前面

前段时间因为考研的原因一直没能更新,已经完成了农作物种植结构的提取,现在给大家分享一下。
主要也是结合前面写过的Google Earth Engine(GEE)使用土地利用数据(modis)上采样Landsat数据提取农田范围,将以上结果作为研究的基础,结合物候特征,光谱特征,地形特征,选择随机森林算法进行农作物的提取。
不想看后面的同学可以直接看代码:https://code.earthengine.google.com/3ed8a5303c610e063ae3a4517ca4e146

1.构建物候特征

在这里主要通过不同农作物NDVI值的差异来选择合适的生长时间进行影像的选择。
通过构建典型地物的NDVI时序特征曲线,不同农作物随着时间的变化,NDVI值也在跟着变化,这种变化也反映了不同农作物在不同时期的光谱特征差异。因此,选择NDVI差异较大的越冬期和成熟期作为最佳识别期进行农作物分类,可以有效进行农作物种类的区分。

var winter = ee.ImageCollection('COPERNICUS/S2_SR').filterDate('2021-11-30', '2022-01-01').filterBounds(roi).filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)).map(maskS2clouds).map(mndwi).map(ndbi).map(ndvi).select(['B1','B2','B3','B4','B8','B12','QA60','MNDWI','NDBI','NDVI']);var winter1=winter.median().addBands(elevation.rename("ELEVATION")).addBands(slope.rename("SLOPE")).clip(roi);Map.addLayer(winter1, {bands: ['B4', 'B3', 'B2'],min:0, max: 0.3}, 'winter1',false);var summer = ee.ImageCollection('COPERNICUS/S2_SR').filterDate('2022-03-01', '2022-04-01').filterBounds(roi).filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)).map(maskS2clouds).map(mndwi).map(ndbi).map(ndvi).select(['B1','B2','B3','B4','B8','B12','QA60','MNDWI','NDBI','NDVI']);var summer1=summer.median().addBands(elevation.rename("sum_ELEVATION")).addBands(slope.rename("sum_SLOPE")).clip(roi);

这里我把基础影像根据农田范围进行了裁剪,只留下农田区域,能有效的排除一些非农田地物类型。

2.构建光谱特征

也就是构建NDVI、NDWI、NDBI等光谱指数,来区分植被、建筑,水体等。

//构建光谱特征
function mndwi(image){return image.addBands(image.normalizedDifference(['B3', 'B8']).rename('MNDWI'))
}
function ndbi(image){return image.addBands(image.normalizedDifference(['B12', 'B8']).rename('NDBI'))
}
function ndvi(image){return image.addBands(image.normalizedDifference(['B8', 'B4']).rename('NDVI'))
}

3.将所有影像合并为一幅影像

将上面选择的越冬期和成熟期的多幅影像合并为一幅,在这里需要更改波段名,不然会出现波段名重复的情况。

//更改波段名称,合成一幅影像
var useimage = winter1.addBands([summer1.select('B2').rename('sum_B2'),summer1.select('B3').rename('sum_B3'),summer1.select('B4').rename('sum_B4'),summer1.select('B8').rename('sum_B8'),summer1.select('B12').rename('sum_B12'),summer1.select('MNDWI').rename('sum_MNDWI'),summer1.select('NDBI').rename('sum_NDBI'),summer1.select('NDVI').rename('sum_NDVI'),summer1.select('sum_ELEVATION'),summer1.select('sum_SLOPE')])print(useimage,'useimage')//求交集,对影像进行掩膜
var useimage1 = useimage.updateMask(esamask)
// var useimage1 = useimage
Map.addLayer(useimage1, {bands: ['sum_B4', 'sum_B3', 'sum_B2'],min:0, max: 0.3}, 'useimage1');var usebands = ['B2','B3','B4','B8','B12','MNDWI','NDBI','NDVI','ELEVATION','SLOPE','sum_B2','sum_B3','sum_B4','sum_B8','sum_B12','sum_MNDWI','sum_NDBI','sum_NDVI','sum_ELEVATION','sum_SLOPE']

4.构建随机森林算法进行分类

构建算法也就是一些老套路了,无非就是建立样本,将样本分成训练样本和验证样本。
在这里想说一点,随机森林的决策树棵树选择不能随便选择,需要进行不同棵数的尝试,可以使用以下代码进行分析,选择准确率最高的颗数进行算法构建。

//选取森林棵树 var numTrees = ee.List.sequence(5, 50, 5); var accuracies = numTrees.map(function(t){ var classifier = ee.Classifier.smileRandomForest(t).train({features: trainingPartition,classProperty: 'landcover',inputProperties: usebands});return testingPartition.classify(classifier).errorMatrix('landcover', 'classification').accuracy();}); print(ui.Chart.array.values({array: ee.Array(accuracies),axis: 0,xLabels: numTrees}));

得到的结果大概是这样,选择准确率最高的就可以了。

5.算法的存储

因为我们上面已经训练好了算法,所以这个算法是可以运用在其他年份的,我们将它保存在个人assets里,当缺少其他年份的样本时,可以使用该算法进行分类,也就是算法复用。

var trees = ee.List(ee.Dictionary(testclassifier.explain()).get('trees'))
var dummy = ee.Feature(roi.geometry())
var col = ee.FeatureCollection(trees.map(function(x){return dummy.set('tree',x)}))
print(col)
Export.table.toAsset(col,'save_classifier','projects/dyb/assets/2022chuzhou')

6.面积统计

上面已经做好了农作物的分类,接下来可以对农作物的面积做一个统计。

var areaImage = ee.Image.pixelArea().addBands(classified)var clsdArea = areaImage.reduceRegion({'reducer': ee.Reducer.sum().group({'groupField': 1,'groupName': 'class'}),'geometry': roi.geometry(),'scale': 10,'maxPixels': 1e13
})print('Kerala landcover clsArea:', clsdArea.getInfo())

最后把所有代码放在这里
https://code.earthengine.google.com/3ed8a5303c610e063ae3a4517ca4e146

Google Earth Engine(GEE)农作物种植结构提取相关推荐

  1. Google Earth Engine(GEE)——User memory limit exceeded(2)

    上一次我们已经知道如何去进行避免这种错误的发生,有关详细内容,如果单单只是解决这个问题我们用到的是limit 和 first,上一次的博客在这里: (207条消息) Google Earth Engi ...

  2. Google Earth Engine(GEE) 01-中输入提示快捷键Ctrl+space无法使用的问题

    Google Earth Engine(GEE) 01-中输入提示快捷键Ctrl+space无法使用的问题 GEE中 Ctrl+space组合键用于代码输入快捷提示,能够提高编码的准确度和速度,但是, ...

  3. Google Earth Engine(GEE)批量下载代码(以 NDVI数据为例)

    下载数据先准备工作(具体细节都能查到):科学上网 谷歌邮箱,谷歌邮箱注册GEE账号. 一:导入需要下载边界shp文件. 标题 找到自己的shp文件,导入除了sbx文件的所有文件. 导入成功 命名ass ...

  4. 使用Google Earth Engine (GEE)实现MODIS数据批量下载

    使用Google Earth Engine GEE实现MODIS数据批量下载 前言 下载数据代码 批量执行run任务 关注公众号,分享GIS知识.ArcGIS教程.SCI论文与科研日常等 前言 上图是 ...

  5. 基于google earth engine(GEE)下载研究区域影像

    基于google earth engine(GEE)下载研究区域影像 当研究需要Landsat数据时,我们可以通过USGS官网或者地理空间数据云平台下载.由于地理空间数据云目前无法下载到较新的数据,可 ...

  6. Google Earth Engine(GEE)——可视化动态图

    代码: var geometry = /* color: #d63000 *//* shown: false *//* displayProperties: [{"type": & ...

  7. Google Earth Engine (GEE) ——卫星影像的监督分类(svm)

    问题 GEE 提供哪些机器学习技术? 如何对卫星图像进行监督分类? 如何评估分类器的准确性? 如何手动创建自己的几何图形? 目标 练习查找无云图像和使用手绘几何导入 学习训练和应用分类算法所需的基本功 ...

  8. 关于google earth engine(GEE)的一些想法与大胆预测

    我接触GEE有两年了,GEE留给我的印象是:无所不能. 不管是从庞大的数据量,还是包含遥感的各类算法:随机森林.SVM.CNN,都让人惊讶. 从GEE的云端操作来看,传统遥感需要几个月做出来的全国ND ...

  9. google earth engine GEE批量 run下载插件

    在Google earth engine中,批量导出文件经常遇到多个文件下载的情况,只能一个个点击RUN.这里介绍一款插件,Open Earth Engine extension .该插件的作者是Ma ...

最新文章

  1. nginx 服务器的学习(1)
  2. Flask实战2问答平台-登录限制(装饰器)
  3. 实例Python处理XML文件的方法
  4. Python中断多重循环的两种思路
  5. python怎么处理文字_使用python进行简单的文本处理
  6. 转载java中synchronized用法
  7. 白云区五措施扶持服务外包及呼叫中心产业发展
  8. python 命令模式_python设计模式(十六):命令模式-阿里云开发者社区
  9. 计算机网络属于什么结构,计算机网络体系结构是一种什么结构
  10. python中.item()的讲解
  11. Convex Clustering(凸聚类)
  12. 计算机等级考试陕西省考点名单及报考指南
  13. ipsec VPN 技术介绍(基础篇一)
  14. vdp-cloud readme
  15. 微型计算机系统的发展历史,计算机的系统发展历史
  16. 《Linux C编程从入门到精通》一1.3 Shell的使用基础
  17. opencv中直方图均衡函数cv::equalizeHist()的使用!!严格用程序进行了验证!
  18. Re38:读论文 NeurJudge: A Circumstance-aware Neural Framework for Legal Judgment Prediction
  19. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
  20. SPRINGBOOT启动流程及其原理详解

热门文章

  1. python量化羊驼法则
  2. 鸿蒙系统 智能手表,魅族官宣:你好,鸿蒙 首个第三方接入鸿蒙OS手机品牌新品亮相...
  3. LeetCode 热题 HOT 100 -------160. 相交链表(链表)206. 反转链表(递归、回溯)
  4. mybatis表不存在的解决办法
  5. Envoy架构理解--理解xDS/Listener/Cluster/Router/Filter
  6. 方波与sinc函数之间的最全傅里叶变换关系_助记_有图有推导
  7. 了解抖音小店店铺装修功能以及条件
  8. SEM测试优点与特点
  9. 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC
  10. 地图中的鼠标移动响应