GEE必须会教程—一文教你华南地区NDVI趋势可视化分析(代码分享)

本文主要是介绍GEE必须会教程—一文教你华南地区NDVI趋势可视化分析(代码分享),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本期将带来NDVI的变化趋势分析,一个地区究竟是变绿了,还是植被退化了,如何进行量化呢?小编给出了代码,后期将带来详细的解释,大家可以先尝试着分析一下代码。

上代码!

var region=ee.FeatureCollection('users/hesuixinya511/South_China');
var empty = ee.Image().toByte();
var outline = ee.Image().toByte().paint({featureCollection:region,color:0,width:2});
Map.addLayer(outline, {palette: "black"}, "outline");
Map.centerObject(region,6);var mod13 = ee.ImageCollection('MODIS/006/MOD13Q1');
var mod13Summer = mod13.filterDate('2000-01-01', '2020-12-31').filter(ee.Filter.calendarRange(2000, 2020, 'year')).map(function(img) {return img.set('year', img.date().get('year'));});
print(mod13Summer);
//按年份jion数据
var mod13SummerAnnualJoin = ee.Join.saveAll('same_year').apply({primary: mod13Summer.distinct('year'),secondary: mod13Summer,condition: ee.Filter.equals({leftField: 'year', rightField: 'year'})
});
print(mod13SummerAnnualJoin);//添加年份作为新的波段
var summerStats = ee.ImageCollection(mod13SummerAnnualJoin.map(function(img) {var year = img.get('year');var yearCol = ee.ImageCollection.fromImages(img.get('same_year'));var mean = yearCol.select('NDVI').mean();var yr = ee.Image.constant(ee.Number(year)).toShort();return ee.Image.cat(yr, mean).rename(['year', 'mean']).set('year', year);
}));
print(summerStats,'summerStats');//lineChart
var NDVI_mean = summerStats.select("mean"). map(function(image){return image.multiply(0.0001).set(image.toDictionary(image.propertyNames()));});
var Yearly_chart = ui.Chart.image.series({imageCollection: NDVI_mean.select('mean'),region: region,reducer: ee.Reducer.mean(),scale: 500,xProperty: 'year',}).setOptions({interpolateNulls: true,lineWidth: 2,title: 'NDVI Yearly Seires',vAxis: {title: 'NDVI'},hAxis: {title: 'Date'},trendlines: { 0: {title: 'NDVI_trend',type:'linear', showR2: true,  color:'red', visibleInLegend: true}}});
print(Yearly_chart);//sensSlope 
var sens = summerStats.reduce(ee.Reducer.sensSlope());
print(sens,'sens');
//linearFit
var fit=summerStats.reduce(ee.Reducer.linearFit());
print(fit,'fit');
//slop 可视化 
var visParams = {opacity: 1,bands: ['slope'],min: -55,max: 55,palette:['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']
};
Map.addLayer(sens.clip(region), visParams, 'Sen\'s slope');
var vis = {min: -55, max: 55, palette: ['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']};
var palettes = require('users/gena/packages:palettes');
function makeColorBarParams(palette) {return {bbox: [0, 0, 1, 0.1],dimensions: '300x10',format: 'png',min: 0,max: 1,palette: palette,};
}
var type=((sens.select('slope').gt(0)).multiply(1))
.add((sens.select('slope').lte(0)).multiply(2))
Map.addLayer(type.clip(region),{min:1,max:2,palette:['#3CB371','#B22222']},'G_or_B',false)
Export.image.toDrive({image:type.clip(region),description:"Drive",fileNamePrefix:"Graph",folder:"Graph1",scale:500,region:region,crs:"EPSG:4326",maxPixels:1e13
})
var colorBar = ui.Thumbnail({image: ee.Image.pixelLonLat().select(0),params: makeColorBarParams(['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']),style: {stretch: 'horizontal', margin: '0px 8px', maxHeight: '40px'},
});
var legendLabels = ui.Panel({widgets: [ui.Label(vis.min, {margin: '4px 8px'}),ui.Label((vis.max / 2),{margin: '4px 8px', textAlign: 'center', stretch: 'horizontal'}),ui.Label(vis.max, {margin: '4px 8px'})],layout: ui.Panel.Layout.flow('horizontal')
});
var legendTitle = ui.Label({value: 'Annual growing season NDVI trend',style: {fontWeight: 'bold'}
});
var legendPanel = ui.Panel([legendTitle, colorBar, legendLabels]);
Map.add(legendPanel);
function getHistogram(Img, geometry) {var hist = Img.select('slope').reduceRegion({reducer: ee.Reducer.autoHistogram(),geometry: geometry,scale: 250,maxPixels: 1e13,});var histArray = ee.Array(hist.get('slope'));var binBottom = histArray.slice(1, 0, 1);var nPixels = histArray.slice(1, 1, null);var histColumnFromArray =ui.Chart.array.values({array: nPixels, axis: 0, xLabels: binBottom}).setChartType('LineChart').setOptions({title: 'vegetation condition trend histogram',hAxis: {title: 'Slope'},vAxis: {title: 'Pixel count'},pointSize: 0,lineSize: 2,colors: ['1b7837'],legend: {position: 'none'}});return histColumnFromArray;
}
var histogram=(getHistogram(sens.select('slope')
.updateMask(((sens.select('slope')).gt(-200)).and ((sens.select('slope')).lt(200))), region));
var Greening_Area=((type.eq(1)).updateMask(type.eq(1)).multiply(ee.Image.pixelArea())).reduceRegion({reducer:ee.Reducer.sum(),geometry:region,scale :250,maxPixels:1e13});
print('Greening area (km2)',ee.Number(Greening_Area.get('slope')).divide(1000000))
var Browning_Area=((type.eq(2)).updateMask(type.eq(2)).multiply(ee.Image.pixelArea())).reduceRegion({reducer:ee.Reducer.sum(),geometry:region,scale :250,maxPixels:1e13});
print('Browning area (km2)',ee.Number(Browning_Area.get('slope')).divide(1000000))
var dict = ee.Image.pixelArea()  .addBands(type.int())  .reduceRegion({  reducer:ee.Reducer.sum().group({  groupField:1,  groupName:'type',  }),  geometry:region,  scale:250,  maxPixels:1e13  });  
var groups = ee.List(dict.get("groups"));  
var typeNames = ee.List(["Greening","Browning"]);  
var featureList = groups.map(function(group){  group = ee.Dictionary(group);  var area = ee.Number(group.get("sum"));  area = area.divide(1000000);  //km2var type = ee.Number(group.get("type"));  var f = ee.Feature(null, {  "type": type,   "area": area,   "name": typeNames.get(type.subtract(1))});  return f;  
});  
var areaFCol = ee.FeatureCollection(featureList);  
var totalArea = ee.Number(areaFCol.aggregate_sum("area"));  
areaFCol = areaFCol.map(function(f){  var typearea = ee.Number(f.get("area"));  f = f.set("type_area", typearea);  f = f.set("percent",typearea.divide(totalArea).multiply(100));return f;  
});  
print(areaFCol ,'areaFCol');
var piechart =ui.Chart.feature.byFeature(areaFCol).setChartType('PieChart').setOptions({xProperty: 'name',yProperties: 'percent',title: 'Area Percent of Greening and Browning pixles',legend: {position:'none'},//top-rightwidth: 200,height: 200,is3D: true,colors: ['#3CB371','#B22222'],});
var panel2 = ui.Panel();
panel2.style().set({width: '350px',position: 'top-right'
});
var Area_table=(ui.Chart.feature.byFeature(areaFCol.select(['name','type_area']),'name').setChartType('Table'));
var legendTitle = ui.Label({value: 'Area statistic of greening and browning area (Km2)',style: {fontWeight: 'bold'}
});
panel2.add(histogram).add(piechart).add(legendTitle).add(Area_table);  
Map.add(panel2);

最后你可以看到华南地区NDVI随时间的变化趋势

也可以看到绿了还是退化了的面积统计:

当然也可以看到可视化的地图哦:

今天的分享到这里就结束了,有不懂可以私聊小编哦,更多内容欢迎大家关注小编的公众号“梧桐GIS”,谢谢大家的支持!

这篇关于GEE必须会教程—一文教你华南地区NDVI趋势可视化分析(代码分享)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956572

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专