本次开发教程是基于太湖生态环境智能监测系统,这个我们首先预加载我们所选的研究区,这次研究区是在太湖研究区,首秀按需要转化为几何,预加载持续时间,颜色图层预设,波段(MODIS、Landsat的QA波段去云函数)去云效果,然后UI界面的设定,这个界面非常长,所以设定了很多label标签、复选框、按钮和textbox,当然每一个部分都在一个面板,最后就是程序的嵌套和各个部分的,本此APP主要分为三个部分:第一部分就是太湖湖泊的监测、第二部分是基于Landsat数据月季年监测、第三部分太湖周围生态监测,最后是其它功能监测,这里每一个部分其实所用到的数据基本上上是相互独立的,这样有利于减少云计算的过程,减少运算压力。每一个部分都可以拿出来单独的使用,每一个部分都是一个单独的APP。

代码:

/*** @Name    :   基于多源遥感的太湖生态环境智能监测系统* @Time    :   2020/7/21* @Author  :   中国矿业大学(北京)PIE小分队* @Version :   1.0* @E-mail  :   sun_yilin@yeah.net* @Source  :   航天宏图第四届 “航天宏图杯”PIE软件二次开发大赛云开发组一等奖获奖作品*/
// 需要转换为geometry;
var lakes = pie.FeatureCollection("user/pieadmin/lakeDemo");
var XukouBay = lakes.filter(pie.Filter.eq("NAME", "XukouBay")).first().geometry();
var EastLake = lakes.filter(pie.Filter.eq("NAME", "EastLake")).first().geometry();
var ZhushanBay = lakes.filter(pie.Filter.eq("NAME", "ZhushanBay")).first().geometry();
var WestLake = lakes.filter(pie.Filter.eq("NAME", "WestLake")).first().geometry();
var SouthLake = lakes.filter(pie.Filter.eq("NAME", "SouthLake")).first().geometry();
var MeiliangBay = lakes.filter(pie.Filter.eq("NAME", "MeiliangBay")).first().geometry();
var GongBay = lakes.filter(pie.Filter.eq("NAME", "GongBay")).first().geometry();
var EntireLake = lakes.filter(pie.Filter.eq("NAME", "EntireLake")).first().geometry();
var CentralLake = lakes.filter(pie.Filter.eq("NAME", "CentralLake")).first().geometry();
var points = pie.FeatureCollection("user/pieadmin/lakeDemoPoints"); // 训练样本
var MOD11A2 = pie.ImageCollection("USGS/MOD11A2/006"); // 1km分辨率Map.setCenter(120.22, 31.22, 10); // 太湖中心
var selectStartDate = "2020-08-01"; // 计算蓝藻水华初始时间
var selectEndDate = "2020-08-03";var selectStartDate1 = "2016-05-01"; // 计算水域面积初始时间
var selectEndDate1 = "2020-09-30";var selectStartDate2 = "2020-05-01"; // 影像显示初始时间
var selectEndDate2 = "2020-09-30";var color1 = ["#040274","#040281","#0502a3","#0502b8","#0502ce","#0502e6","#0602ff","#235cb1","#307ef3","#269db1","#30c8e2","#32d3ef","#3be285","#3ff38f","#86e26f","#3ae237","#b5e22e","#d6e21f","#fff705","#ffd611","#ffb613","#ff8b13","#ff6e08","#ff500d","#ff0000","#de0101","#c21301","#a71001","#911003",
];var color2 = ["#9AA5DF","#0602ff","#235cb1","#307ef3","#269db1","#30c8e2","#32d3ef","#3be285","#3ff38f","#86e26f",
];var color3 = ["#145999","#1b76cc","#1f86e6","#26aaea","#36b6eb","#4dc0eb","#60cfeb","#77daef","#b0dfef","#d1e5ee","#dce6f0","#e1e7f2","#dee6f1","#43c370","#44b772","#52c88e","#6fc993","#7ecb97","#acd2ad",
];var color4 = ["#145999","#1b76cc","#1f86e6","#26aaea","#36b6eb","#4dc0eb","#60cfeb","#77daef","#b0dfef","#d1e5ee","#dce6f0","#e1e7f2","#dee6f1","#43c370","#44b772","#52c88e","#6fc993","#7ecb97","#acd2ad","#d4c97a","#d0bc59","#d3b146","#c78f3c","#c3812d","#c5762b","#b95322","#ae4621","#ba6e78","#bc8fa9","#c7aac6","#dbcdde","#fffcff",
];function generateVis(min, max, palette) {var vis = {min: min,max: max,palette: palette,};return vis;
}function generateVisalg(min, max) {return generateVis(min, max, color1);
}function generateVisalgOccu(min, max) {return generateVis(min, max, color2);
}function addLegend(args) {var title = args.title || "";var labels = args.labels || [];var step = args.step || 1;var colors = args.colors || [];// 图例var data = {title: title,colors: colors,labels: labels,step: step,};var style = {right: "100px",bottom: "25px",height: "70px",width: "350px",};var legend = ui.Legend(data, style);Map.addUI(legend);
}function addLegendToMap(args) {args["colors"] = color1;addLegend(args);
}function addOccuLegendToMap(args) {args["colors"] = color2;addLegend(args);
}function addDem1LegendToMap(args) {args["colors"] = color3;addLegend(args);
}function addDem2LegendToMap(args) {args["colors"] = color4;addLegend(args);
}function addClassLegendToMap(args) {var colors = ["#040274", "#269db1", "#3ae237", "#ff0000", "#911003"];args["colors"] = colors;addLegend(args);
}var modisUtil = {maskClouds: function (image) {// 选择质量评估波段var QA = image.select("state_1km");// 1<<10表示二进制第10位,第10位表示有云var bitMask = 1 << 10;// 使得检测出含云像元置为0,进行掩膜去除含云return image.select(["sur_refl_b01","sur_refl_b02","sur_refl_b05","sur_refl_b06","sur_refl_b07",]).updateMask(QA.bitwiseAnd(bitMask).eq(0));},getMOD09GA: function (startDate, endDate, roi) {var MOD09GA = pie.ImageCollection("USGS/MOD09GA/006"); // 500米分辨率var TerraGA = MOD09GA.filterDate(startDate, endDate) // 数据筛选.filterBounds(roi).map(modisUtil.maskClouds);return TerraGA;},// 大气校正步骤1min567: function (image) {var b05 = image.select("sur_refl_b05").multiply(0.0001); // 841-876nm, NIR(859)var b06 = image.select("sur_refl_b06").multiply(0.0001); // 620-670nm, RED(645)var b07 = image.select("sur_refl_b07").multiply(0.0001); // 1230-1250nm, SWIR1(1240)var images = pie.ImageCollection().fromImages([b05, b06, b07]); // 重组影像var min = images.min().rename("min"); // 获取最小值影像return image.addBands(min);},// 大气校正步骤2// multiply 0.0001 is needed because the data is scaled by 10000jz: function (image) {var b01 = image.select("sur_refl_b01").multiply(0.0001);var b02 = image.select("sur_refl_b02").multiply(0.0001);var b05 = image.select("sur_refl_b05").multiply(0.0001); // 841-876nm, NIR(859)var min = image.select("min");var b011 = b01.subtract(min); // 均减去min波段var b021 = b02.subtract(min);var b051 = b05.subtract(min);return image.addBands(b011).addBands(b021).addBands(b051);},// 计算 FAIfunFAI: function (image) {b02 = image.select("sur_refl_b02"); // 841-876nm, NIR(859)b01 = image.select("sur_refl_b01"); // 620-670nm, RED(645)b05 = image.select("sur_refl_b05"); // 1230-1250nm, SWIR1(1240)var temp = b01.add(b05.subtract(b01).multiply(0.359663865546)); // 构建近红外波段var Index = b02.subtract(temp).rename("FAI");return Index;},// 建立 FAI 阈值掩膜.mod_FAI: function (image) {var FAI_threshold = image.select("FAI").rename("FAI_threshold");FAI_threshold = FAI_threshold.updateMask(FAI_threshold.gte(-0.004));return FAI_threshold;},// 统计发生频率Binary: function (image) {var algae = image.select("FAI").gte(-0.004).rename("alage"); // 大于等于-0.004为1,小于则为0return image.addBands(algae);},//添加 IndexBandsaddIndexBands: function (image) {var FAI = modisUtil.funFAI(image);return image.addBands(FAI);},
};var landsat8Util = {// landsat8去云处理removeCloud: function (image) {// 数据去云处理var qa = image.select("QA_PIXEL");var cloudMask = qa.bitwiseAnd(1 << 4).eq(0).and(qa.bitwiseAnd(1 << 3).eq(0));return image.updateMask(cloudMask);},scaleImage: function (image) {return image.select(["B2", "B3", "B4", "B5", "B6", "B7"]).multiply(0.0000275).subtract(0.2);},//加载Landsat 8 SRalg: function (image) {var b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar b6 = image.select("B6"); // swir1// 计算ndvivar lswi = b5.subtract(b6).divide(b5.add(b6)).clip(TH_boundary);var fai = b5.subtract(b4.add(b6.subtract(b4)).multiply(0.219895287958)).clip(TH_boundary);var alg = fai.updateMask(fai.gte(0.05)).updateMask(lswi.gte(0.63)).rename("alg"); // 判定太湖蓝藻水华return image.addBands(alg); // 添加蓝藻波段},turbidity: function (image) {var b4 = image.select("B4");var b3 = image.select("B3");var tbd = b4.subtract(b3).divide(b4.add(b3)).power(2).multiply(3117.4).add(b4.subtract(b3).divide(b4.add(b3)).power(2).multiply(1083.6)).add(106.17).rename("turbidity");return image.addBands(tbd);},MD: function (image) {var b4 = image.select("B4");var b5 = image.select("B5");//计算蓝藻密度var md = b5.divide(b4).power(2).multiply(1352).subtract(b5.divide(b4).multiply(159.08)).add(192.87).rename("md");return image.addBands(md);},cha: function (image) {var b4 = image.select("B4");var b5 = image.select("B5");//计算叶绿素var cha = b5.multiply(100.49).divide(b4).subtract(15.776).rename("cha");return image.addBands(cha);},//ndvindvi: function (image) {var b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar ndvi = b5.subtract(b4).divide(b5.add(b4)).rename("ndvi");return image.addBands(ndvi);},//fvcfvc: function (image) {var b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar ndvi = b5.subtract(b4).divide(b5.add(b4)).rename("ndvi");//   var ndvi_per = ndvi.reduceRegion(pie.Reducer.percentile([2, 98]), roi, 1000).get("ndvi");//   var ndvi_min = pie.Number(pie.Dictionary(ndvi_per).get("p2"));//   var ndvi_max = pie.Number(pie.Dictionary(ndvi_per).get("p98"));var ndvi_min = ndvi.reduceRegion(pie.Reducer.min(), roi, 1000).get("ndvi");ndvi_min = pie.Number(ndvi_min);var ndvi_max = ndvi.reduceRegion(pie.Reducer.max(), roi, 1000).get("ndvi");ndvi_max = pie.Number(ndvi_max);var fvc = ndvi.subtract(ndvi_min).divide(ndvi_max.subtract(ndvi_min)).rename("fvc");return image.addBands(fvc);},// wetwet: function (image) {var b2 = image.select("B2"); // bluevar b3 = image.select("B3"); // greenvar b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar b6 = image.select("B6"); // swir1var b7 = image.select("B7"); // swir1var tem1 = b2.multiply(0.1511).add(b3.multiply(0.1973));var tem2 = b4.multiply(0.3283).add(b5.multiply(0.3407));var tem3 = b6.multiply(-0.7177).add(b7.multiply(-0.4559));var wet_oli = tem1.add(tem2).subtract(tem3).rename("wet");return image.addBands(wet_oli);},// ndbsindbsi: function (image) {var b2 = image.select("B2"); // bluevar b3 = image.select("B3"); // greenvar b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar b6 = image.select("B6"); // swir1// var b7 = image.select("B7"); // swir1var tem1 = b6.divide(b6.add(b5)).multiply(2).subtract(b5.divide(b6.add(b5))).add(b3.divide(b3.add(b6)));var tem2 = b6.divide(b6.add(b5)).multiply(2).add(b5.divide(b6.add(b5))).add(b3.divide(b3.add(b6)));var ibi = tem1.divide(tem2);var tem3 = b6.multiply(1.0).add(b4).subtract(b5.add(b2));var tem4 = b6.multiply(1.0).add(b4).add(b5.add(b2));var si = tem3.divide(tem4);var ndbsi = ibi.add(si).divide(2).rename("ndbsi"); // get the ndbsireturn image.addBands(ndbsi);},//ndbindbi: function (image) {var b6 = image.select("B6");var b5 = image.select("B5");var ndbi = b6.subtract(b5).divide(b6.add(b5)).rename("ndbi");return image.addBands(ndbi);},// evievi: function (image) {var b2 = image.select("B2"); // bluevar b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar evi = b5.subtract(b4).multiply(2.5).divide(b5.add(b4.multiply(6)).subtract(b2.multiply(7.5)).add(1)).rename("evi");return image.addBands(evi);},// mndwimndwi: function (image) {var b6 = image.select("B6");var b3 = image.select("B3");var mndwi = b3.subtract(b6).divide(b3.add(b6)).rename("mndwi");return image.addBands(mndwi);},// rvirvi: function (image) {var b3 = image.select("B3"); // greenvar b5 = image.select("B5"); // nirvar rvi = b3.divide(b5).rename("rvi");return image.addBands(rvi);},// ndwindwi: function (image) {var b3 = image.select("B3"); // greenvar b5 = image.select("B5"); // nirvar ndwi = b3.subtract(b5).divide(b3.add(b5)).rename("ndwi");return image.addBands(ndwi);},trans: function (image) {var b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nir//计算叶绿素//计算蓝藻密度var alg = pie.Image(-0.416).subtract(b5.log().multiply(0.587)).subtract(b4.log().multiply(0.722));var band = alg.exp().rename("trans"); // 计算指数并裁剪区域return image.addBands(band); // 添加蓝藻波段},//加载Landsat 8 SRss: function (image) {var b4 = image.select("B4"); // redvar b2 = image.select("B2"); // nir//计算叶绿素//计算蓝藻密度var ss = b4.subtract(b2).divide(b4.add(b2)).rename("ss");return image.addBands(ss); // 添加蓝藻波段},mndwiCa: function (image) {var b4 = image.select("B4"); // redvar b5 = image.select("B5"); // nirvar b6 = image.select("B6"); // swir1var b2 = image.select("B2"); // bluevar b3 = image.select("B3"); // greenvar mndwi = b3.subtract(b6).divide(b3.add(b6)).rename("mndwi");// var mask1 = mndwi.updateMask(mndwi.gt(ndvi).and(evi.lt(0.1))).rename('water');return image.addBands(mndwi);},getLandsat8: function (startDate, endDate, roi, cloud = 30) {var l8SR = pie.ImageCollection("LC08/02/SR");var l8Col = l8SR.filterDate(startDate, endDate).filterBounds(roi).filter(pie.Filter.lt("cloud_cover", cloud)).map(landsat8Util.removeCloud).map(landsat8Util.scaleImage);return l8Col;},
};function mergeMOD09GAData(startDate, endDate, roi, callback) {var TerraGA = modisUtil.getMOD09GA(startDate, endDate, roi);var dateList = TerraGA.reduceColumns(pie.Reducer.toList(), ["date"]);dateList.getInfo(function (list) {var dates = Array.from(new Set(list["list"]["date"]));dates.sort();callback(TerraGA, dates);});
}function globalTVDI(startDate, endDate, roi) {// tvdivar images = pie.ImageCollection("BNU/GLOBAL_1KM_TVDI").filterBounds(roi).filterDate(startDate, endDate).select("B1").mean().clip(roi);var tvdi = images.multiply(0.0001).rename("tvdi");return tvdi;
}function getDateList(startDate, endDate) {var syear = parseInt(startDate.slice(0, 4)); // 获取起始日期前四位var sother = startDate.slice(4, 10); // 获取起始日期后6位var eyear = parseInt(endDate.slice(0, 4)); // 获取结束日期前四位var eother = endDate.slice(4, 10); // 获取结束日期后6位var dates = [];if (syear > eyear) {return dates;}for (var year = syear; year <= eyear; year++) {dates.push({start: year + sother,end: year + eother,});}return dates;
}// UI界面
var panel = ui.Panel({style: {width: "400px"},
}); // set the panel
var style1 = {"font-size": "20px", color: "green", "font-weight": "bold"}; // set the format
var style2 = {"font-size": "16px", color: "black", "font-weight": "bold"}; // set the format
var label1 = ui.Label("基于多源遥感的太湖生态环境智能监测系统 V1.0", style1); // edit the content
var label2 = ui.Label("制作人: PIE小分队.", style2);
var label3 = ui.Label("E-mail: sun_yilin@yeah.net.", style2);
panel.add(label1).add(label2).add(label3); // add the ui panel// 设置目录
// 第一节,太湖湖泊监测
var labelA = ui.Label("一、太湖湖泊监测", {"font-size": "20px","font-weight": "bold",color: "red",
});
var labelA1 = ui.Label("1、基于MODIS数据逐日监测", {"font-size": "18px","font-weight": "bold",color: "red",
});
panel.add(labelA).add(labelA1);
// 1 选择区域
var label4 = ui.Label("1) 请选择一个区域", {"font-size": "16px","font-weight": "bold",color: "red",
});// 设置空的变量保存矢量.
var TH_boundary = [];
// Create a ui.Select widget for area selection.
var places = {EntireLake: EntireLake,CentralLake: CentralLake,EastLake: EastLake,SouthLake: SouthLake,WestLake: WestLake,GongBay: GongBay,MeiliangBay: MeiliangBay,ZhushanBay: ZhushanBay,XukouBay: XukouBay,
};// 设置选择区域
var selectArea = ui.Select({items: Object.keys(places),placeholder: "Click on the select",value: null,multiple: false,onChange: function (key) {// 存储选择的矢量边界TH_boundary = places[key];return TH_boundary;},
});
panel.add(label4).add(selectArea);// 显示研究区
function clickBtn() {Map.addLayer(TH_boundary, {color: "FF0000", fillColor: "00000000", width: 1},"roi");
}var btShow = ui.Button({label: "显示研究区",type: "success",onClick: clickBtn,
});
var btNotShow = ui.Button({label: "不显示研究区",type: "success",
});
var btnPanelShow = ui.Panel({widgets: [btShow, btNotShow],layout: ui.Layout.flow("horizontal"),
});
panel.add(btnPanelShow);// 2 选择时间
// 开始时间
var label5 = ui.Label("2) 请输入研究时间", {"font-size": "16px","font-weight": "bold",color: "red",
});function inputSDatea(value) {selectStartDate = value;
}var textBox1a = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectStartDate, //输入显示框显示数值onChange: inputSDatea,disabled: false,
});var textboxName1a = ui.Label("开始时间:");
var textboxPanel1a = ui.Panel({widgets: [textboxName1a, textBox1a],layout: ui.Layout.flow("horizontal"),
});
panel.add(label5).add(textboxPanel1a);// 结束时间
function inputEDatea(value) {selectEndDate = value;
}var textBox2a = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectEndDate, //输入显示框显示数值onChange: inputEDatea,disabled: false,
});var textboxName2a = ui.Label("结束时间:");
var textboxPanel2a = ui.Panel({widgets: [textboxName2a, textBox2a],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2a);// 水华面积计算
var label6 = ui.Label("3) 逐日水华监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btArea = ui.Button({label: "计算每日水华面积",type: "success",onClick: function () {print("开始蓝藻水华面积计算");mergeMOD09GAData(selectStartDate,selectEndDate,TH_boundary,function (TerraGA, dates) {var count_images = [];for (var i = 0; i < dates.length; i++) {var FAI_threshold = TerraGA.filter(pie.Filter.eq("date", dates[i])).map(modisUtil.min567).map(modisUtil.jz).map(modisUtil.addIndexBands).select("FAI").mosaic().clip(TH_boundary); // 镶嵌并裁剪var areaPixel = FAI_threshold.gte(-0.004); // 统计方法2:生成二值影像var countPixel = areaPixel.reduceRegion(pie.Reducer.sum(),TH_boundary,500); // 计算像素数之和//设置图层显示属性var visalg = generateVisalg(-0.004, 0.25);Map.addLayer(FAI_threshold.updateMask(areaPixel),visalg,dates[i],false); // 去云影像,绘制图层count_images.push(countPixel); // 记录数量print("日期:", dates[i]); // 输出日期print("数量:", countPixel); // 打印结果}// Map.playLayersAnimation(dates, 0.5, 100);  // 动画演示// 显示图例addLegendToMap({title: "FAI",labels: ["-0.004", "0.25"],step: 1,});// 通过判断设置图表属性if (TH_boundary == EntireLake) {var line_a = {title: "太湖水域蓝藻面积动态变化",legend: ["蓝藻面积"],xAxisName: "日期",yAxisName: "蓝藻像元数量(500*500m)",chartType: "line",yMin: 0,yMax: 25000, // 当显示为全部区域时,上限为25000smooth: true,};} else {var line_a = {title: "太湖水域蓝藻面积动态变化",legend: ["蓝藻像元数量"],xAxisName: "日期",yAxisName: "蓝藻像元数量(500*500m)",chartType: "line",yMin: 0,yMax: 2000, // 当显示为部分区域时,上限为2000smooth: true,};}// 显示折线图var countChart = ui.Chart.image(count_images, dates, line_a);print(countChart);print("结束蓝藻水华面积计算");});},
});
panel.add(label6).add(btArea);// 时间范围内蓝藻频率图
var label7 = ui.Label("4) 水华发生频率", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btOccurency = ui.Button({label: "计算频率影像",type: "success",onClick: function () {print("开始蓝藻频率计算");var TerraGA = modisUtil.getMOD09GA(selectStartDate,selectEndDate,TH_boundary);var BinarySum = TerraGA.map(modisUtil.min567).map(modisUtil.jz).map(modisUtil.addIndexBands).map(modisUtil.Binary).select("alage").sum().clip(TH_boundary); //对影像集中的像素求和//设置图层显示属性var visalgOccu = generateVisalgOccu(1, 10);Map.addLayer(BinarySum, visalgOccu, "Occurrence Frequency");//地图上显示图例组件addOccuLegendToMap({title: "蓝藻出现频率",labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],step: 1,});print("结束蓝藻频率计算");},
});
panel.add(label7).add(btOccurency);// 蓝藻发生最早时间
function generateDateImageCollection(TerraGA, dates) {var images = [];for (var i = 0; i < dates.length; i++) {var image = TerraGA.filter(pie.Filter.eq("date", dates[i])).mosaic().clip(TH_boundary);image = modisUtil.funFAI(image);image = modisUtil.mod_FAI(image);var dateImage = image.where(image.gte(-0.004), i + 1).rename("dateImage"); // 设置数据值images.push(dateImage);}var imageCollection = pie.ImageCollection.fromImages(images);return imageCollection;
}var label71 = ui.Label("5) 水华发生起始时间", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btEarlyTime = ui.Button({label: "计算起始时间影像",type: "success",onClick: function () {print("开始计算蓝藻发生最早时间");mergeMOD09GAData(selectStartDate,selectEndDate,TH_boundary,function (TerraGA, dates) {var imageCollection = generateDateImageCollection(TerraGA, dates);var earlyImage = imageCollection.select("dateImage").min(); // 获得最小值天数影像//设置图层显示属性var visalgOccu = generateVisalgOccu(1, 10);Map.addLayer(earlyImage, visalgOccu, "earlyImage");// 显示图例addOccuLegendToMap({title: "水华发生起始时间(天)",labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],step: 1,});print("结束计算蓝藻发生最早时间");});},
});
panel.add(label71).add(btEarlyTime);// 蓝藻发生的截止时间
var label72 = ui.Label("6) 水华发生结束时间", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btLatestTime = ui.Button({label: "计算结束时间影像",type: "success",onClick: function () {print("开始计算蓝藻消失时间");mergeMOD09GAData(selectStartDate,selectEndDate,TH_boundary,function (TerraGA, dates) {var imageCollection = generateDateImageCollection(TerraGA, dates);var latestImage = imageCollection.select("dateImage").max(); // 获得最小值天数影像//设置图层显示属性var visalgOccu = generateVisalgOccu(1, 10);Map.addLayer(latestImage, visalgOccu, "latestImage");// 显示图例addOccuLegendToMap({title: "水华发生结束时间(天)",labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],step: 1,});print("结束计算蓝藻消失时间");});},
});
panel.add(label72).add(btLatestTime);// 蓝藻发生的持续时间
var label73 = ui.Label("7) 水华发生持续时间", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btDurationTime = ui.Button({label: "计算水华持续时间影像",type: "success",onClick: function () {print("开始计算蓝藻持续时间");mergeMOD09GAData(selectStartDate,selectEndDate,TH_boundary,function (TerraGA, dates) {var imageCollection = generateDateImageCollection(TerraGA, dates);var earlyImage = imageCollection.select("dateImage").min(); // 获得最小值天数影像var latesImage = imageCollection.select("dateImage").max(); // 获得最大值天数影像var durationImage = latesImage.subtract(earlyImage); // 获得蓝藻持续时间//设置图层显示属性var visalgOccu = generateVisalgOccu(1, 10);Map.addLayer(durationImage, visalgOccu, "durationImage");// 显示图例addOccuLegendToMap({title: "水华发生持续时间(天)",labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],step: 1,});print("结束计算蓝藻持续时间");});},
});
panel.add(label73).add(btDurationTime);// 等级显示及直方图计算
var label74 = ui.Label("8) 蓝藻水华等级显示及统计", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btHIS = ui.Button({label: "显示水华等级",type: "success",onClick: function () {print("开始水华等级显示");mergeMOD09GAData(selectStartDate,selectEndDate,TH_boundary,function (TerraGA, dates) {var image = TerraGA.filter(pie.Filter.eq("date", dates[0])).map(modisUtil.addIndexBands).select("FAI").mosaic().clip(TH_boundary);print(dates[0] + "等级统计结果:");// Create a VCI level (Lv.2 - Lv.6) classification function.var VCIs = [{name: "VCI_Lv1", min: -0.004, max: 0, palette: "#040274"},{name: "VCI_Lv2", min: 0, max: 0.05, palette: "#269db1"},{name: "VCI_Lv3", min: 0.05, max: 0.1, palette: "#3ae237"},{name: "VCI_Lv4", min: 0.1, max: 0.15, palette: "#ff0000"},{name: "VCI_Lv5", min: 0.15, max: null, palette: "#911003"},];var count_images = []; // 保存数量print("统计结果输出:");for (var i = 0; i < VCIs.length; i++) {var vci_image = image.rename(VCIs[i].name);if (VCIs[i].min !== null) {vci_image = vci_image.updateMask(vci_image.gte(VCIs[i].min));}if (VCIs[i].max !== null) {vci_image = vci_image.updateMask(vci_image.lt(VCIs[i].max));}var vci_image_count = vci_image.reduceRegion(pie.Reducer.count(),TH_boundary,500);print(vci_image_count);count_images.push(vci_image_count);Map.addLayer(vci_image, {palette: VCIs[i].palette}, VCIs[i].name);}// 显示图例addClassLegendToMap({title: "VCI",labels: ["VCI1", "VCI2", "VCI3", "VCI4", "VCI5"],step: 1,});var labelui = ui.Label(dates[0] + "等级分类显示", {"font-size": "22px","font-weight": "bold",color: "black",}); //ui界面添加标题Map.addUI(labelui);// 绘制表格// 设置图表属性if (TH_boundary == EntireLake) {var line_a = {title: "太湖水域蓝藻等级面积统计",legend: ["蓝藻面积"],xAxisName: "等级",yAxisName: "蓝藻像元数量(500*500m)",chartType: "line",yMin: 0,yMax: 5000, // 当显示为全部区域时,上限为40000smooth: true,};} else {var line_a = {title: "太湖水域蓝藻等级面积统计",legend: ["蓝藻面积"],xAxisName: "等级",yAxisName: "蓝藻像元数量(500*500m)",chartType: "line",yMin: 0,yMax: 2000, // 当显示为部分区域时,上限为4000// smooth: true};}// 显示折线图var labels = ["VCI1", "VCI2", "VCI3", "VCI4", "VCI5"];var countChart = ui.Chart.image(count_images, labels, line_a); // 方法2print(countChart);print("结束水华等级显示");});},
});
panel.add(label74).add(btHIS);// 基于Landsat系列数据进行月季年监测
var labelA2 = ui.Label("2、基于Landsat数据月季年监测", {"font-size": "18px","font-weight": "bold",color: "red",
});
panel.add(labelA2);var label4A = ui.Label("1) 请选择一个区域", {"font-size": "16px","font-weight": "bold",color: "red",
});var selectAreaA = ui.Select({items: Object.keys(places),placeholder: "点击选择",value: null,multiple: false,onChange: function (key) {// 存储选择的矢量边界TH_boundary = places[key];return TH_boundary;},
});
panel.add(label4A).add(selectAreaA);var btShowA = ui.Button({label: "显示研究区",type: "success",onClick: clickBtn,
});
var btNotShowA = ui.Button({label: "不显示研究区",type: "success",
});
var btnPanelShowA = ui.Panel({widgets: [btShowA, btNotShowA],layout: ui.Layout.flow("horizontal"),
});
panel.add(btnPanelShowA);// 2 选择时间
// 开始时间
var selectStartDateA = "2020-06-01"; // 设置初始值
var selectEndDateA = "2020-09-31";var label5A = ui.Label("2) 请输入研究时间及云量", {"font-size": "16px","font-weight": "bold",color: "red",
});function inputSDateA(value) {selectStartDateA = value;
}var textBox1A = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectStartDateA, //输入显示框显示数值onChange: inputSDateA,disabled: false,
});var textboxName1A = ui.Label("开始时间:");
var textboxPanel1A = ui.Panel({widgets: [textboxName1A, textBox1A],layout: ui.Layout.flow("horizontal"),
});
panel.add(label5A).add(textboxPanel1A);// 结束时间
function inputEDateA(value) {selectEndDateA = value;
}var textBox2A = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectEndDateA, //输入显示框显示数值onChange: inputEDateA,disabled: false,
});var textboxName2A = ui.Label("结束时间:");
var textboxPanel2A = ui.Panel({widgets: [textboxName2A, textBox2A],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2A);// 筛选云量 输入数值
var textboxName2AA = ui.Label("输入云量:");function funInputNumberA(value) {selectNumA = value; // 设置云量值
}var selectNumA = 20; // 设置起始输入数据
var inputNumberA = ui.InputNumber({placeholder: "请输入云量",value: selectNumA,min: 0,max: 100,step: 1,onChange: funInputNumberA,disabled: false,
});
var textboxPanel2AA = ui.Panel({widgets: [textboxName2AA, inputNumberA],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2AA);// 蓝藻水华计算
var label81 = ui.Label("3) 月季年蓝藻水华监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btALG = ui.Button({label: "计算水华影像",type: "success",onClick: function () {print("开始水华面积计算");//设置图层显示属性var visalg = generateVisalg(-0.5, 0.5);var layerDate = []; //存储年份var counts = []; // 存储像元数量var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start;var endDate = dateList[i].end;var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.alg);var alg_mean = l8Col.select("alg").mean().clip(TH_boundary); // 求取平均值var layerName = startDate + "_" + endDate + "alg"; // 设置图层名称layerDate.push(year);var count = alg_mean.reduceRegion(pie.Reducer.count(), TH_boundary, 30); // 统计数量print(count);counts.push(count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 设置图表属性var line_a = {title: "太湖水域蓝藻动态变化",legend: ["蓝藻"],xAxisName: "日期",yAxisName: "蓝藻数量",chartType: "line",yMin: 0,yMax: 10000000,smooth: true,};// 显示折线图var chart = ui.Chart.image(counts, layerDate, line_a);print(chart);// 图例addLegendToMap({title: "FAI",labels: ["0", "0.05", "0.1", "0.15", "0.20", "0.25"],step: 30,});print("结束水华面积计算");},
});
panel.add(label81).add(btALG);// 蓝藻浑浊度计算
var label8 = ui.Label("4) 月季年蓝藻浑浊度监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btHZ = ui.Button({label: "计算蓝藻浑浊度影像",type: "success",onClick: function () {print("开始计算蓝藻浑浊度");//加载Landsat 8 SRvar layerDate = []; //存储年份var counts = []; // 存储像元数量var dateList = getDateList(selectStartDateA, selectEndDateA);//设置图层显示属性var visalg = generateVisalg(0, 1000);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.turbidity);var alg_mean = l8Col.select("turbidity").max().clip(TH_boundary); // 求取最大值var layerName = startDate + "_" + endDate + "turbidity"; // 设置图层名称layerDate.push(year);var mean_count = alg_mean.select("turbidity").reduceRegion(pie.Reducer.mean(), TH_boundary, 30); // 统计数量counts.push(mean_count);print(mean_count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 显示图例addLegendToMap({title: "浑浊度",labels: ["优", "差"],step: 12,});// 设置图表属性var line_a = {title: "太湖水域蓝藻浑浊度动态变化",legend: ["蓝藻浑浊度"],xAxisName: "日期",yAxisName: "浑浊度均值)",chartType: "line",yMin: 0,yMax: 1000,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算蓝藻浑浊度");},
});
panel.add(label8).add(btHZ);// 蓝藻密度计算
var label9 = ui.Label("5) 月季年蓝藻密度监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btMD = ui.Button({label: "计算蓝藻密度影像",type: "success",onClick: function () {print("开始计算蓝藻密度");var layerDate = []; //存储年份var counts = []; // 存储像元数量var dateList = getDateList(selectStartDateA, selectEndDateA);//设置图层显示属性var visalg = generateVisalg(0, 1000);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();//加载Landsat 8 SRvar l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.MD);var alg_mean = l8Col.select("md").mean().clip(TH_boundary); // 求取平均值var layerName = startDate + "_" + endDate + "md"; // 设置图层名称layerDate.push(year);var mean_count = alg_mean.select("md").reduceRegion(pie.Reducer.mean(), TH_boundary, 30); // 统计数量counts.push(mean_count);print(mean_count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 显示图例addLegendToMap({title: "密度",labels: ["低", "高"],step: 30,});// 绘制表格// 设置图表属性var line_a = {title: "太湖水域蓝藻密度动态变化",legend: ["蓝藻浑浊度"],xAxisName: "日期",yAxisName: "密度均值)",chartType: "line",yMin: 0,yMax: 100000,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算蓝藻密度");},
});
panel.add(label9).add(btMD);// 计算叶绿素a
var label81 = ui.Label("6) 月季年叶绿素监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btChla = ui.Button({label: "计算叶绿素影像",type: "success",onClick: function () {print("开始计算叶绿素");var layerDate = []; //存储年份var counts = []; // 存储像元数量//设置图层显示属性var visalg = generateVisalg(-50, 1000);var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();//加载Landsat 8 SRvar l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.cha);var alg_mean = l8Col.select("cha").mean().clip(TH_boundary); // 求取平均值var layerName = startDate + "_" + endDate + "cha"; // 设置图层名称layerDate.push(year);var mean_count = alg_mean.select("cha").reduceRegion(pie.Reducer.mean(), TH_boundary, 30); // 统计数量counts.push(mean_count);print(mean_count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 显示图例addLegendToMap({title: "叶绿素",labels: ["低", "高"],step: 30,});// 设置图表属性var line_a = {title: "太湖水域蓝藻叶绿素动态变化",legend: ["蓝藻浑浊度"],xAxisName: "日期",yAxisName: "叶绿素均值)",chartType: "line",yMin: 0,yMax: 1000,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算叶绿素");},
});
panel.add(label81).add(btChla);// 透明度反演
var label82 = ui.Label("7) 月季年透明度监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btParence = ui.Button({label: "计算透明度影像",type: "success",onClick: function () {print("开始计算透明度");//加载Landsat 8 SRvar layerDate = []; //存储年份var counts = []; // 存储像元数量//设置图层显示属性var visalg = generateVisalg(0, 200);var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.trans);var alg_mean = l8Col.select("trans").mean().clip(TH_boundary); // 求取平均值var layerName = startDate + "_" + endDate + "trans"; // 设置图层名称layerDate.push(year);var mean_count = alg_mean.select("trans").reduceRegion(pie.Reducer.mean(), TH_boundary, 30); // 统计数量counts.push(mean_count);print("均值:", mean_count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 显示图例addLegendToMap({title: "透明度", labels: ["低", "高"], step: 30});// 绘制表格// 设置图表属性var line_a = {title: "太湖水域蓝藻透明度动态变化",legend: ["蓝藻透明度"],xAxisName: "日期",yAxisName: "透明度均值",chartType: "line",yMin: 0,yMax: 1000,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算透明度");},
});
panel.add(label82).add(btParence);// 归一化悬浮物指数
var label83 = ui.Label("8) 月季年归一化悬浊物监测", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btSS = ui.Button({label: "计算归一化悬浊物影像",type: "success",onClick: function () {print("开始计算归一化悬浊物");var layerDate = []; //存储年份var counts = []; // 存储像元数量//设置图层显示属性var visalg = generateVisalg(0, 1);var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.ss);var alg_mean = l8Col.select("ss").mean().clip(TH_boundary); // 求取平均值var layerName = startDate + "_" + endDate + "ss"; // 设置图层名称layerDate.push(year);var mean_count = alg_mean.select("ss").reduceRegion(pie.Reducer.mean(), TH_boundary, 30); // 统计数量counts.push(mean_count);print(mean_count);Map.addLayer(alg_mean, visalg, layerName); // 加载图层}// 显示图例addLegendToMap({title: "归一化悬浊物", labels: ["低", "高"], step: 30});// 绘制表格// 设置图表属性var line_a = {title: "太湖水域蓝藻归一化悬浊物动态变化",legend: ["归一化悬浊物"],xAxisName: "日期",yAxisName: "归一化悬浊物均值)",chartType: "line",yMin: 0,yMax: 1,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算归一化悬浊物");},
});
panel.add(label83).add(btSS);// 计算水域面积变化
var label11 = ui.Label("8) 太湖水域面积", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btMJ = ui.Button({label: "计算水域面积",type: "success",onClick: function () {print("开始水华面积计算");var waterArea = []; //存储面积var yearDate = []; // 存储时间var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate,endDate,TH_boundary,selectNumA);l8Col = l8Col.map(landsat8Util.mndwiCa);var mndwi_max = l8Col.select("mndwi").max().clip(TH_boundary);var l8_water = mndwi_max.gt(0.1);Map.addLayer(l8_water, {palette: "#0602ff"}, year + "water");//根据计算的水体数据计算面积var areaImage = mndwi_max.pixelArea().multiply(l8_water.gt(0.1));var water = areaImage.reduceRegion(pie.Reducer.sum(), TH_boundary, 30);var water_area = pie.Number(water.get("constant")).divide(1000000);waterArea.push(water_area.getInfo()); // 保存面积,需用getInfoyearDate.push(year); // 存储年份print(year + "水体面积是(单位:平方千米): ",pie.Number(water.get("constant")).divide(1000000)); //进行单位换算}// 设置图表属性var line_options = {title: "太湖水域面积动态变化",legend: ["水域面积"],xAxis: yearDate,xAxisName: "年",yAxisName: "平方千米",series: [waterArea],chartType: "line",};//调用绘制折线图的方法var chart = ui.Chart.array(line_options);print(chart);//动画显示Map.playLayersAnimation(dates, 0.5, -1);},
});
panel.add(label11).add(btMJ);var label111 = ui.Label("9) 太湖水域温度", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btLST = ui.Button({label: "计算水域温度",type: "success",onClick: function () {var layerDate = []; //存储年份var counts = []; // 存储像元数量//设置图层显示属性var visalg = generateVisalg(0, 40);var dateList = getDateList(selectStartDateA, selectEndDateA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();// 筛选影像var rawLST = MOD11A2.filterDate(startDate, endDate).filterBounds(TH_boundary).select("LST_Day_1km").mean().clip(TH_boundary);var lst = rawLST.select("LST_Day_1km").multiply(0.02).subtract(273.15);var layerName = startDate + "_" + endDate + "LSTmean";Map.addLayer(lst, visalg, layerName);var mean = lst.reduceRegion(pie.Reducer.mean(), TH_boundary, 1000); // 统计温度均值counts.push(mean);layerDate.push(year);}// 显示图例addLegendToMap({title: "湖面温度",labels: ["0", "10 ", " 20", "30"],step: 12,});// 绘制表格// 设置图表属性var line_a = {title: "太湖水域温度均值变化",legend: ["温度均值"],xAxisName: "年份",yAxisName: "温度均值(℃)",chartType: "line",yMin: 0,yMax: 40,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);},
});
panel.add(label111).add(btLST);// 第二节,太湖周围生态监测
// 基于Landsat系列数据计算太湖周围生态指数
var labelB = ui.Label("二、太湖周围生态监测", {"font-size": "20px","font-weight": "bold",color: "red",
});
panel.add(labelB);var label1B1 = ui.Label("1、指数计算", {"font-size": "18px","font-weight": "bold",color: "red",
});
panel.add(label1B1);// 2 选择时间
// 开始时间
var selectStartDateAA = "2014-03-01"; // 设置初始值
var selectEndDateAA = "2020-10-31";var label5AA = ui.Label("1) 请输入研究时间及缓冲距离", {"font-size": "16px","font-weight": "bold",color: "red",
});function inputSDateAA(value) {selectStartDateAA = value;
}var textBox1AA = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectStartDateAA, //输入显示框显示数值onChange: inputSDateAA,disabled: false,
});var textboxName1AA = ui.Label("开始时间:");
var textboxPanel1AA = ui.Panel({widgets: [textboxName1AA, textBox1AA],layout: ui.Layout.flow("horizontal"),
});
panel.add(label5AA).add(textboxPanel1AA);// 结束时间
function inputEDateAA(value) {selectEndDateAA = value;
}var textBox2AA = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectEndDateAA, //输入显示框显示数值onChange: inputEDateAA,disabled: false,
});var textboxName2AA = ui.Label("结束时间:");
var textboxPanel2AA = ui.Panel({widgets: [textboxName2AA, textBox2AA],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2AA);//获取缓冲区
// 输入数值
var textboxName2AAA = ui.Label("请输入缓冲距离(km):");function funInputNumberAA(value) {selectNumAA = value; // 设置值
}var selectNumAA = 30; // 设置起始输入数据
var inputNumberAA = ui.InputNumber({placeholder: "请输入缓冲距离",value: selectNumAA,min: 0,max: 100,step: 1,onChange: funInputNumberAA,disabled: false,
});
var textboxPanel2AA = ui.Panel({widgets: [textboxName2AAA, inputNumberAA],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2AA);// 1缓冲区温度反演
var label11 = ui.Label("2) 温度显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btlst = ui.Button({label: "计算温度",type: "success",onClick: function () {print("开始计算温度");var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var layerDate = []; //存储年份var counts = []; // 存储像元数量var layers = [];//设置图层显示属性var visalg = generateVisalg(0, 40);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();// 筛选影像var rawLST = MOD11A2.filterDate(startDate, endDate).filterBounds(Th_buffer_dif).select("LST_Day_1km").mean().clip(Th_buffer_dif);var lst = rawLST.select("LST_Day_1km").multiply(0.02).subtract(273.15);var layerName = startDate + "_" + endDate + "mean";layers.push(layerName);Map.addLayer(lst, visalg, layerName);var mean = lst.reduceRegion(pie.Reducer.mean(), Th_buffer_dif, 1000); // 统计温度均值print(mean);counts.push(mean);layerDate.push(year);}// 显示图例addLegendToMap({title: "湖面温度",labels: ["0", "10 ", " 20", "30", "40"],step: 12,});// 绘制表格// 设置图表属性var line_a = {title: "太湖水域周围" + selectNumAA + "km温度均值变化",legend: ["温度均值(℃)"],xAxisName: "年份",yAxisName: "温度均值(℃)",chartType: "line",yMin: 0,yMax: 40,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);//动画显示Map.playLayersAnimation(layers, 0.5, -1);print("结束计算温度");},
});
panel.add(label11).add(btlst);// 缓冲区绿度反演
var label12 = ui.Label("3) NDVI显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btNdvi = ui.Button({label: "计算NDVI",type: "success",onClick: function () {print("开始计算NDVI");var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var layerDate = []; //存储年份var counts = []; // 存储像元数量var layers = [];//设置图层显示属性var visalg = generateVisalg(-1, 1);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();// 筛选影像var l8Col = landsat8Util.getLandsat8(startDate,endDate,Th_buffer_dif,20);l8Col = l8Col.map(landsat8Util.ndvi).select("ndvi").max().clip(Th_buffer_dif);var layerName = startDate + "_" + endDate + "mean";layers.push(layerName);Map.addLayer(l8Col, visalg, layerName);var mean = l8Col.select("ndvi").reduceRegion(pie.Reducer.mean(), Th_buffer_dif, 30); // 统计ndvi均值print(mean);counts.push(mean);layerDate.push(year);}// 显示图例addLegendToMap({title: "NDVI",labels: ["-1", "-0.5 ", " 0", "0.5", "1"],step: 12,});// 设置图表属性var line_a = {title: "太湖水域周围" + selectNumAA + "kmNDVI均值变化",legend: ["NDVI均值"],xAxisName: "年份",yAxisName: "NDVI均值",chartType: "line",yMin: 0,yMax: 1,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);//动画显示Map.playLayersAnimation(layers, 0.5, -1);print("结束计算NDVI");},
});
panel.add(label12).add(btNdvi);// 计算植被覆盖度
var label121 = ui.Label("4) 植被覆盖度显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btfvc = ui.Button({label: "计算FVC",type: "success",onClick: function () {print("开始计算FVC");var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var layers = [];//设置图层显示属性var visalg = generateVisalg(0, 1);var dateList = getDateList(selectStartDateAA, selectEndDateAA);var startDate = dateList[0].start; // 组合开始日期var endDate = dateList[0].end; // 组合结束日期// 筛选影像var l8Col = landsat8Util.getLandsat8(startDate, endDate, Th_buffer_dif, 20);var ndvi = l8Col.map(landsat8Util.ndvi).select("ndvi").max().clip(Th_buffer_dif);var result = pie.Dictionary(ndvi.reduceRegion(pie.Reducer.percentile([5, 95]), Th_buffer_dif, 30));var ndvi_p5 = pie.Dictionary(result.get("ndvi")).getNumber("p5").getInfo();//反演区域植被覆盖度并加载var fvc = ndvi.subtract(ndvi_p5).divide(1.2).rename("fvc");var layerName = startDate + "_" + endDate + "mean";layers.push(layerName);Map.addLayer(fvc.select("fvc"), visalg, layerName);var mean = fvc.select("fvc").reduceRegion(pie.Reducer.mean(), Th_buffer_dif, 30); // 统计ndvi均值print("fvc均值:", mean);// 显示图例addLegendToMap({title: "FVC",labels: ["0", "0.2 ", " 0.4", "0.6", "0.8", "1"],step: 12,});print("结束计算FVC");},
});
panel.add(label121).add(btfvc);// 计算湿度
var label13 = ui.Label("5) Wet显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btWet = ui.Button({label: "计算Wet",type: "success",onClick: function () {print("开始计算wet");var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var layerDate = []; //存储年份var counts = []; // 存储像元数量var layers = [];//设置图层显示属性var visalg = generateVisalg(-0.5, 0.5);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();// 筛选影像var l8Col = landsat8Util.getLandsat8(startDate,endDate,Th_buffer_dif,20);var wet = landsat8Util.wet(l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).mean());wet = wet.select("wet").clip(Th_buffer_dif);var layerName = startDate + "_" + endDate + "mean";layers.push(layerName);Map.addLayer(wet, visalg, layerName);var mean = wet.select("wet").reduceRegion(pie.Reducer.mean(), Th_buffer_dif, 30); // 统计WET均值print("均值:", mean);counts.push(mean);layerDate.push(year);}// 显示图例addLegendToMap({title: "Wet",labels: ["-0.5", "-0.25 ", " 0", "0.25", "0.5"],step: 12,});// 设置图表属性var line_a = {title: "太湖水域周围" + selectNumAA + "kmWet均值变化",legend: ["Wet均值"],xAxisName: "年份",yAxisName: "Wet均值",chartType: "line",yMin: -0.5,yMax: 0.5,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);//动画显示// Map.playLayersAnimation(layers, 0.5, -1);print("结束计算Wet");},
});
panel.add(label13).add(btWet);// 城镇建筑指数
var label14 = ui.Label("6) NDBSI显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btNdbsi = ui.Button({label: "计算NDBSI",type: "success",onClick: function () {print("开始计算NDBSI");var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var layerDate = []; //存储年份var counts = []; // 存储像元数量//设置图层显示属性var visalg = generateVisalg(-0.1, 1);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();// 筛选影像var l8Col = landsat8Util.getLandsat8(startDate,endDate,Th_buffer_dif,selectNumA);l8Col = l8Col.select(["B2", "B3", "B4", "B5", "B6"]).mean();var ndbsi = landsat8Util.ndbsi(l8Col).select("ndbsi").clip(Th_buffer_dif);var layerName = startDate + "_" + endDate + "mean";Map.addLayer(ndbsi, visalg, layerName);var mean = ndbsi.reduceRegion(pie.Reducer.mean(), Th_buffer_dif, 30); // 统计ndvi均值print("均值:", mean);counts.push(mean);layerDate.push(year);}// 显示图例addLegendToMap({title: "NDBSI",labels: ["0", "0.2 ", " 0.4", "0.6", "0.8", "1"],step: 12,});// 设置图表属性var line_a = {title: "太湖水域周围" + selectNumAA + "kmNDBSI均值变化",legend: ["Wet均值"],xAxisName: "年份",yAxisName: "NDBSI均值",chartType: "line",yMin: -0.1,yMax: 1,smooth: true,};// 显示折线图var countChart = ui.Chart.image(counts, layerDate, line_a);print(countChart);print("结束计算NDBSI");},
});
panel.add(label14).add(btNdbsi);// 监督分类
// 第二节,土地利用监测
// 基于Landsat系列数据对太湖周边地区进行土地利用监测
var label1B2 = ui.Label("2、土地利用监测", {"font-size": "18px","font-weight": "bold",color: "red",
});
panel.add(label1B2);function classifyLand(tag) {Map.centerObject(EntireLake, 11);var counts = []; // 存储像元数量var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate, endDate, Th_buffer_dif, 10);var image = l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).median();image = landsat8Util.ndvi(image);image = landsat8Util.mndwi(image);image = image.clip(Th_buffer_dif);// 获得训练样本,并且按照8:2分成训练样本和验证样本var sampleFeatureCollection = image.sampleRegions(points,["landcover"],30);sampleFeatureCollection = sampleFeatureCollection.filter(pie.Filter.notNull(["B2","B3","B4","B5","B6","B7","ndvi","mndwi"]))sampleFeatureCollection = sampleFeatureCollection.randomColumn("random");var sampleTrainingFeatures = sampleFeatureCollection.filter(pie.Filter.lte("random", 0.8));var sampleTestingFeatures = sampleFeatureCollection.filter(pie.Filter.gt("random", 0.8));var methods = {rTrees: pie.Classifier.rTrees,svm: pie.Classifier.svm,normalBayes: pie.Classifier.normalBayes,};// 构建RT分类器,并训练数据var classifer = methods[tag]().train(sampleTrainingFeatures, "landcover", ["B2","B3","B4","B5","B6","B7","ndvi","mndwi",]);// 影像分类,并加载显示var resultImage = image.classify(classifer, "classifyA");// 形态学运算resultImage = resultImage.focal_max(1); // 膨胀运算resultImage = resultImage.focal_min(1); //腐蚀运算var visParam = {opacity: 1,uniqueValue: "1,2,3,4,5",palette: "#040274,#269db1,#3ae237,#ff0000,#911003",};Map.addLayer(resultImage, visParam, year + "-" + tag + "-Image");Map.addLayer(image, {min: 0, max: 0.3, bands: ["B4", "B3", "B2"]},year + "-Original Image");var counts = [];for (var i = 1; i <= 5; i++) {var areaImg = pie.Image().pixelArea();var count = areaImg.multiply(resultImage.eq(i)).reduceRegion(pie.Reducer.sum(), Th_buffer_dif, 30); // 类别数量统计counts.push(count);}// 设置图表属性var line_a = {title: dateList[i].start.slice(0, 4) + "年太湖水域周边地物面积统计",legend: ["不同地物面积"],xAxisName: "类别",yAxisName: "面积(平方千米)",chartType: "line",yMin: 0,yMax: 20000,};var labels = ["水体", "建设用地", "林地", "耕地", "裸地"];var countChart = ui.Chart.image(counts, labels, line_a); // 方法2print(countChart);}// 添加图例addLegend({title: "土地利用分类",colors: ["#040274", "#269db1", "#3ae237", "#ff0000", "#911003"],labels: ["水体", "建设用地", "林地", "耕地", "裸地"],step: 1,});// 评估训练样本的精度var checkM = classifer.confusionMatrix();print("训练矩阵:", checkM);print("训练矩阵-ACC系数:",checkM.acc(),"训练矩阵-Kappa系数:",checkM.kappa());// 评估验证样本的精度var predictResult = sampleTestingFeatures.classify(classifer,"classification");var errorM = predictResult.errorMatrix("landcover", "classification");print("验证矩阵:", errorM);print("验证矩阵-ACC系数:",errorM.acc(),"验证矩阵-Kappa系数:",errorM.kappa());
}// 城市建筑用地情况
var label15 = ui.Label("1) 随机森林分类", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btClass = ui.Button({label: "开始分类",type: "success",onClick: function () {// 获得样本点print("开始随机森林分类");classifyLand("rTrees");print("结束随机森林分类");},
});
panel.add(label15).add(btClass);// 支持向量机分类
var label16 = ui.Label("2) 支持向量机分类", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btSVCClass = ui.Button({label: "开始分类",type: "success",onClick: function () {// 获得样本点print("开始支持向量机分类");classifyLand("svm");print("结束支持向量机分类");},
});
panel.add(label16).add(btSVCClass);// 正太贝叶斯分类
var label17 = ui.Label("3) 正太贝叶斯分类", {"font-size": "16px","font-weight": "bold",color: "red",
});
var btNBClass = ui.Button({label: "开始分类",type: "success",onClick: function () {// 获得样本点print("开始正太贝叶斯分类");classifyLand("normalBayes");print("结束正太贝叶斯分类");},
});
panel.add(label17).add(btNBClass);// k-mean分类
var label18 = ui.Label("4) 非监督分类", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label18);function clusterLand(tag) {Map.centerObject(EntireLake, 11);var Th_buffer_1km = EntireLake.buffer(selectNumAA * 1000);var Th_buffer_dif = Th_buffer_1km.difference(EntireLake);var dateList = getDateList(selectStartDateAA, selectEndDateAA);// 筛选影像for (var i = 0; i < dateList.length; i++) {var startDate = dateList[i].start; // 组合开始日期var endDate = dateList[i].end; // 组合结束日期var year = new Date(startDate).getFullYear();var l8Col = landsat8Util.getLandsat8(startDate, endDate, Th_buffer_dif, 10);var image = l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).median();var ndvi = landsat8Util.ndvi(image).select("ndvi");var mndwi = landsat8Util.mndwi(image).select("mndwi");image = image.addBands(ndvi).addBands(mndwi).clip(Th_buffer_dif);// 随机采集样本,30米下采集200个点分类var training = image.sample(Th_buffer_dif, 30, "", "", 200);var methods = {kMeans: pie.Clusterer.kMeans,em: pie.Clusterer.em,};// 创建分类器,并进行训练var cluster = methods[tag](selectNumAAA).train(training);// 分类数据并显示var resultImage = image.cluster(cluster, "clusterA");// 形态学运算resultImage = resultImage.focal_max(1); // 膨胀运算resultImage = resultImage.focal_min(1); //腐蚀运算var visParam = {opacity: 1,classify: "0,1,2,3,4,5,6",palette: "FF0000,00FFFF,00FF00,FF00FF,0000FF,FFFF00,FF8000,00AAFF",};Map.addLayer(resultImage, visParam, year + "-" + tag + "-resultImage", false);var vis = {min: 0,max: 0.3,opacity: 0.9,bands: ["B4", "B3", "B2"],};Map.addLayer(image.select(["B4", "B3", "B2"]), vis, year + "-Landsat8 RGB", false);}
}//获取类别
// 输入数值
var textboxName2AAAA = ui.Label("请输入k:");function funInputNumberAAA(value) {selectNumAAA = value; // 设置值
}var selectNumAAA = 2; // 设置起始输入数据
var inputNumberAAA = ui.InputNumber({placeholder: "请输入k",value: selectNumAAA,min: 0,max: 5,step: 1,onChange: funInputNumberAAA,disabled: false,
});
var textboxPanel2AAA = ui.Panel({widgets: [textboxName2AAAA, inputNumberAAA],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel2AAA);var btkmeanClass = ui.Button({label: "k-means分类",type: "success",onClick: function () {// 获得样本点print("开始k-means分类");clusterLand("kMeans");print("结束k-means分类");},
});
panel.add(btkmeanClass);// 最大期望算法
var btemClass = ui.Button({label: "最大期望算法",type: "success",onClick: function () {// 获得样本点print("开始最大期望分类");clusterLand("em");print("结束最大期望分类");},
});
panel.add(btemClass);// 第三节,其他功能
var labelC = ui.Label("三、其他功能", {"font-size": "20px","font-weight": "bold",color: "red",
});
panel.add(labelC);
var label510 = ui.Label("1) 请输入行政区划", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label510);
var label5101 = ui.Label("[注]:行政区划网址:http://www.mca.gov.cn/article/sj/xzqh/2020/", {"font-size": "16px","font-weight": "bold",color: "black"}
);
panel.add(label5101);// 单选按钮,选择省、城市、县
var selectDis = "县行政区划";function funRadio(value) {selectDis = value;
}var radio = ui.Radio({label: ["省行政区划", "县行政区划"],value: selectDis,onChange: funRadio,disabled: false,
});
var textboxName31 = ui.Label("行政级别:");
var textboxPanel31 = ui.Panel({widgets: [textboxName31, radio],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel31);//定义常量参数
var layerKey = null;
var roiKey = null;
var selectCode = "110114";// 输入行政区划
//获取指定的ROI数据
function getROI(code) {if (selectDis == "县行政区划") {var fCol = pie.FeatureCollection("NGCC/CHINA_COUNTY_BOUNDARY");} else if (selectDis == "省行政区划") {var fCol = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY");}var roi = fCol.filter(pie.Filter.eq("code", parseInt(code))).first().geometry();if (roiKey != null) {Map.removeLayer(roiKey);}var geometry = roi.centroid(); // 中心点var roiPoint = pie.FeatureCollection(pie.Feature(geometry));Map.addLayer(roiPoint, {color: "00AAFF", fillColor: "00000000"},"centroidPoint",true);Map.centerObject(geometry, 10);var label1a = ui.Label("行政区划代码:" + code, {"font-size": "20px","font-weight": "bold",color: "black",});Map.addUI(label1a);roiKey = Map.addLayer(roi, {color: "#ff0000", fillColor: "#00000000"},"roi");return roi;
}function inputArea(value) {if (value > 99999) {selectCode = value;var roi = getROI(selectCode);print("行政区划的面积是(平方千米):");print(roi.area().divide(1000000)); // 计算面积}
}var textBox3 = ui.TextBox({placeholder: "请输入行政区划编码",value: selectCode,onChange: inputArea,disabled: false,
});
var textboxName3 = ui.Label("行政区划:");
var textboxPanel3 = ui.Panel({widgets: [textboxName3, textBox3],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel3);// 导出数据
function clickBtExpShp() {var roi = getROI(selectCode);Export.table({collection: roi,description: "ExportShp" + selectCode,assetId: selectCode + "shp",});
}var btExpShp = ui.Button({label: "导出行政边界",type: "success",onClick: clickBtExpShp,
});
panel.add(btExpShp);// 输入时间
// 开始时间
var label511 = ui.Label("2) 请输入查询时间", {"font-size": "16px","font-weight": "bold",color: "red",
});function inputSDate(value) {selectStartDate2 = value;
}var textBox11 = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectStartDate2, //输入显示框显示数值onChange: inputSDate,disabled: false,
});var textboxName11 = ui.Label("开始时间:");
var textboxPanel1 = ui.Panel({widgets: [textboxName11, textBox11],layout: ui.Layout.flow("horizontal"),
});
panel.add(label511).add(textboxPanel1);// 结束时间
function inputEDate(value) {selectEndDate2 = value;
}var textBox21 = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectEndDate2, //输入显示框显示数值onChange: inputEDate,disabled: false,
});var textboxName21 = ui.Label("结束时间:");
var textboxPanel21 = ui.Panel({widgets: [textboxName21, textBox21],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel21);// 查询影像
var label19 = ui.Label("3) 显示数据", {"font-size": "16px","font-weight": "bold",color: "red",
});function changeSelect(value) {var roi = getROI(selectCode);print("选择的数据:" + value);if (value == "Landsat8") {var imageCollection = landsat8Util.getLandsat8(selectStartDate2, selectEndDate2, roi, 100).select(["B4", "B3", "B2"]);print("影像集合", imageCollection.limit(1));print("影像数量", imageCollection.size());var image_median = imageCollection.median().clip(roi);print(image_median);var vis = {min: [0, 0, 0],max: [20000, 20000, 20000],opacity: 0.9,bands: ["B4", "B3", "B2"],};Map.addLayer(image_median, vis, "Landsat8");} else if (value == "GF1") {var imageCollection = pie.ImageCollection("GF1/L1A/WFV_SR").filterBounds(roi).filterDate(selectStartDate2, selectEndDate2).select(["B3", "B2", "B1"]);print("影像集合", imageCollection.limit(1));print("影像数量", imageCollection.size());var image_median = imageCollection.median().clip(roi);var vis = {min: 0, max: 0.3, opacity: 0.9, bands: ["B3", "B2", "B1"]};Map.addLayer(image_median, vis, "GF1");} else {// 哨兵二号去云2function removeCloud2(image) {var qa = image.select("QA60");var cloudBitMask = 1 << 10;var cirrusBitMask = 1 << 11;var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(qa.bitwiseAnd(cirrusBitMask).eq(0));return image.updateMask(mask);}var imageCollection = pie.ImageCollection("S2/L1C").filterBounds(roi).filterDate(selectStartDate2, selectEndDate2).map(removeCloud2).select(["B4", "B3", "B2"]); // 真彩色print("影像集合", imageCollection.limit(1));print("影像数量", imageCollection.size());var image_median = imageCollection.median().clip(roi);var vis = {min: 0, max: 10000, opacity: 0.9, bands: ["B4", "B3", "B2"]};Map.addLayer(image_median, vis, "Sentinel-2");}
}var selectId = ui.Select({items: ["Landsat8", "Sentinel-2", "GF1"],placeholder: "请选择",value: "Landsat8",multiple: false,onChange: changeSelect,
});
panel.add(label19).add(selectId);// 地形显示
var label20 = ui.Label("4) 地形显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label20);var selectTag1A = "DEM"; // 设置初始值
// select
function changeSelect1A(value) {selectTag1A = value;var roi = getROI(selectCode);var dem = pie.ImageCollection("DEM/ASTGTM_003").filterBounds(roi).select("dem").mean().clip(roi);var visParam;if (value == "DEM") {visParam = {opacity: 0.8,classify: "-100,0,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100",palette: "145999,1b76cc,1f86e6,26aaea,36b6eb,4dc0eb,60cfeb,77daef,b0dfef,d1e5ee,dce6f0,e1e7f2,dee6f1,43c370,44b772,52c88e," +"6fc993,7ecb97,acd2ad,d4c97a,d0bc59,d3b146,c78f3c,c3812d,c5762b,b95322,ae4621,ba6e78,bc8fa9,c7aac6,dbcdde,fffcff",};Map.addLayer(dem, visParam, "DEM");var mean = dem.select("dem").reduceRegion(pie.Reducer.mean(), roi, 30);print("DEM均值:" + mean.get("dem").getInfo() + "m");// 添加图例addDem2LegendToMap({title: "DEM",labels: ["-100", "500", "1000", "1500", "2000", "2500", "3000"],step: 100,});} else if (value == "坡向") {var aspect = pie.Terrain.aspect(dem); // 计算坡向visParam = {opacity: 0.8,classify: "0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320",palette: "145999,1b76cc,1f86e6,26aaea,36b6eb,4dc0eb,60cfeb,77daef,b0dfef,d1e5ee,dce6f0,e1e7f2,dee6f1,43c370,44b772,52c88e," +"6fc993,7ecb97,acd2ad,d4c97a,d0bc59,d3b146,c78f3c,c3812d,c5762b,b95322,ae4621,ba6e78,bc8fa9,c7aac6,dbcdde,fffcff",};Map.addLayer(aspect, visParam, "Aspect");// 添加图例addDem2LegendToMap({title: "坡向",labels: ["0", "50", "100", "150", "200", "250", "300"],step: 10,});} else if (value == "坡度") {var slope = pie.Terrain.slope(dem).multiply(180 / 3.1415926); // 计算坡度visParam = {opacity: 0.8,classify: "0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180",palette: "145999,1b76cc,1f86e6,26aaea,36b6eb,4dc0eb,60cfeb,77daef,b0dfef,d1e5ee,dce6f0,e1e7f2,dee6f1,43c370,44b772,52c88e," +"6fc993,7ecb97,acd2ad",};Map.addLayer(slope, visParam, "slope");// 添加图例addDem1LegendToMap({title: "坡度",labels: ["0", "30", "60", "90", "120", "150", "180"],step: 10,});} else {var imageShade = pie.Terrain.hillShade(dem, 45, 315, 8); // 山体阴影visParam = {opacity: 0.8,classify: "-1100,-800,-700,-600,-500,-400,-300,-200,-100,-50,-20,-10,-5,0,5,10,25,50,75,100,125,150,175,200,250,300,350,400,450,500,550,600,880",palette: "145999,1b76cc,1f86e6,26aaea,36b6eb,4dc0eb,60cfeb,77daef,b0dfef,d1e5ee,dce6f0,e1e7f2,dee6f1,43c370,44b772,52c88e," +"6fc993,7ecb97,acd2ad,d4c97a,d0bc59,d3b146,c78f3c,c3812d,c5762b,b95322,ae4621,ba6e78,bc8fa9,c7aac6,dbcdde,fffcff",};Map.addLayer(imageShade, visParam, "imageShade");// 添加图例addDem1LegendToMap({title: "山体阴影",labels: ["0", "50", "100", "150", "200", "250", "300"],step: 10,});}
}var select1A = ui.Select({items: ["DEM", "坡向", "坡度", "山体阴影"],placeholder: "请选择",value: selectTag1A,multiple: false,onChange: changeSelect1A,
});
var selectName1A = ui.Label("选择地形:");
var selectPanel1A = ui.Panel({widgets: [selectName1A, select1A],layout: ui.Layout.flow("horizontal"),
});
panel.add(selectPanel1A);//导出数据
function clickbtExport() {print(selectTag1A);var roi = getROI(selectCode);var dem = pie.ImageCollection("DEM/ASTGTM_003").filterBounds(roi).select("dem").mean().clip(roi);var aspect = pie.Terrain.aspect(dem); // 计算坡向var slope = pie.Terrain.slope(dem).multiply(180 / 3.1415926); // 计算坡度var imageShade = pie.Terrain.hillShade(dem, 45, 315, 8); // 山体阴影var config = {DEM: dem,坡度: slope,坡向: aspect,山体阴影: imageShade,};Export.image({image: config[selectTag1A],description: "ExportImage:" + selectTag1A,assetId: "test",region: roi,scale: 30,});
}var btExport = ui.Button({label: "导出数据",type: "success",onClick: clickbtExport,
});
panel.add(btExport);// 指数计算
var label21 = ui.Label("5) 指数计算", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label21);function changeSelect1B(value) {selectTag1B = value;var roi = getROI(selectCode);var l8Col = landsat8Util.getLandsat8(selectStartDate2,selectEndDate2,roi,20);l8Col = l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).median().clip(roi);if (value == "ndvi") {var ndvi = landsat8Util.ndvi(l8Col).select("ndvi");//设置图层显示属性var visalg = generateVisalg(-1, 1);Map.addLayer(ndvi, visalg, "NDVI");var mean = ndvi.select("ndvi").reduceRegion(pie.Reducer.mean(), roi, 30);print("ndvi均值:" + mean.get("ndvi").getInfo());// 显示图例addLegendToMap({title: "NDVI",labels: ["-1", "-0.5 ", " 0", "0.5", "1"],step: 30,});} else if (value == "fvc") {var fvc = landsat8Util.fvc(l8Col).select("fvc");var visalg = generateVisalg(0, 1);Map.addLayer(fvc, visalg, "fvc");var mean = fvc.select("fvc").reduceRegion(pie.Reducer.mean(), roi, 30);print("fvc均值:" + mean.get("fvc").getInfo());// 显示图例addLegendToMap({title: "fvc",labels: ["0", "0.2 ", " 0.4", "0.6", "0.8", "1"],step: 30,});} else if (value == "rvi") {var rvi = landsat8Util.rvi(l8Col).select("rvi");var visalg = generateVisalg(0, 1);Map.addLayer(rvi, visalg, "rvi");var mean = rvi.select("rvi").reduceRegion(pie.Reducer.mean(), roi, 30);print("rvi均值:" + mean.get("rvi").getInfo());// 显示图例addLegendToMap({title: "rvi",labels: ["0", "0.2 ", " 0.4", "0.6", "0.8", "1"],step: 30,});} else if (value == "evi") {var evi = landsat8Util.evi(l8Col).select("evi");//设置图层显示属性var visalg = generateVisalg(-1, 1);Map.addLayer(evi, visalg, "evi");var mean = evi.select("evi").reduceRegion(pie.Reducer.mean(), roi, 30);print("evi均值:" + mean.get("evi").getInfo());// 显示图例addLegendToMap({title: "evi",labels: ["-1", "-0.5 ", " 0", "0.5", "1"],step: 30,});} else if (value == "wet") {var wet = landsat8Util.wet(l8Col).select("wet");var visalg = generateVisalg(-1, 1);Map.addLayer(wet, visalg, "wet_oli");var mean = wet_oli.select("wet").reduceRegion(pie.Reducer.mean(), roi, 30);print("wet均值:" + mean.get("wet").getInfo());// 显示图例addLegendToMap({title: "wet",labels: ["-1", "-0.5 ", " 0", "0.5", "1"],step: 30,});} else if (value == "ndbsi") {var ndbsi = landsat8Util.ndbsi(l8Col).select("ndbsi");var visalg = generateVisalg(0, 0.5);Map.addLayer(ndbsi, visalg, "ndbsi");var mean = ndbsi.select("ndbsi").reduceRegion(pie.Reducer.mean(), roi, 30);print("ndbsi均值:" + mean.get("ndbsi").getInfo());// 显示图例addLegendToMap({title: "ndbsi",labels: ["0", "0.1", " 0.2", "0.3", "0.4"],step: 30,});} else if (value == "ndbi") {var ndbi = landsat8Util.ndbi(l8Col).select("ndbi");var visalg = generateVisalg(-0.5, 0.5);var ndbi = b6.subtract(b5).divide(b6.add(b5)).rename("ndbi");Map.addLayer(ndbi, visalg, "ndbi");var mean = ndbi.select("ndbi").reduceRegion(pie.Reducer.mean(), roi, 30);print("ndbi均值:" + mean.get("ndbi").getInfo());// 显示图例addLegendToMap({title: "ndbi",labels: ["-0.5", "-0.25", " 0", "0.25", "0.5"],step: 30,});} else if (value == "lai") {//加载Terra星全球500m叶面积指数/FPAR 8天合成产品(MOD15A2H V6)var images = pie.ImageCollection("USGS/MOD15A2H/006").filterDate(selectStartDate2, selectEndDate2);//选择LAI波段,计算LAI均值var lai = images.select("Lai_500m").map(function (image) {return image.updateMask(image.lt(200));}).mean().clip(roi).rename("lai");//设置图层显示属性var visalg = generateVisalg(0, 100);Map.addLayer(lai, visalg, "lai");var mean = lai.select("lai").reduceRegion(pie.Reducer.mean(), roi, 500);print("lai均值:" + mean.get("lai").getInfo());// 显示图例addLegendToMap({title: "lai",labels: ["0", "30 ", " 60", "90"],step: 30,});} else if (value == "fpar") {//加载Terra星全球500m叶面积指数/FPAR 8天合成产品(MOD15A2H V6)var images = pie.ImageCollection("USGS/MOD15A2H/006").filterDate(selectStartDate2, selectEndDate2);//选择FPAR波段,计算FPAR均值var fpar = images.select("Fpar_500m").mean().clip(roi).rename("fpar");//设置图层显示属性var visalg = generateVisalg(0, 100);Map.addLayer(fpar, visalg, "fpar");var mean = fpar.select("fpar").reduceRegion(pie.Reducer.mean(), roi, 500);print("fpar均值:" + mean.get("fpar").getInfo());// 显示图例addLegendToMap({title: "fpar",labels: ["0", "30 ", " 60", "90"],step: 30,});} else if (value == "lst") {var lst = MOD11A2.filterDate(selectStartDate2, selectEndDate2).filterBounds(roi).select("LST_Day_1km").mean().multiply(0.02).subtract(273.15).clip(roi).rename("lst");//设置图层显示属性var visalg = generateVisalg(0, 30);Map.addLayer(lst, visalg, "lst");var mean = lst.select("lst").reduceRegion(pie.Reducer.mean(), roi, 1000);print("lst均值:" + mean.get("lst").getInfo());// 显示图例addLegendToMap({title: "温度",labels: ["0", "10 ", " 20", "30"],step: 30,});} else if (value == "tvdi") {var image = globalTVDI(selectStartDate2, selectEndDate2, roi);//设置图层显示属性var visalg = generateVisalg(0, 1);Map.addLayer(image, visalg, "tvdi");var mean = image.reduceRegion(pie.Reducer.mean(), roi, 1000);print("tvdi均值:", mean.get("tvdi"));// 显示图例addLegendToMap({title: "tdvi",labels: ["0", "0.2 ", " 0.4", "0.6", "0.8", "1"],step: 30,});} else if (value == "ndwi") {var ndwi = landsat8Util.ndwi(l8Col).select("ndwi");var visalg = generateVisalg(-0.5, 0.5);Map.addLayer(ndwi, visalg, "ndwi");// 显示图例addLegendToMap({title: "ndwi",labels: ["-0.5", "-0.25 ", " 0", "0.25", "0.5"],step: 30,});} else if (value == "mndwi") {var mndwi = landsat8Util.mndwi(l8Col).select("mndwi");var visalg = generateVisalg(-0.5, 0.5);Map.addLayer(mndwi, visalg, "mndwi");// 显示图例addLegendToMap({title: "mndwi",labels: ["-0.5", "-0.25 ", " 0", "0.25", "0.5"],step: 30,});//根据计算的水体数据计算面积var areaImage = mndwi.select("water").pixelArea().multiply(mndwi.select("water").gt(0.1));var water = areaImage.reduceRegion(pie.Reducer.sum(), roi, 30);print(water);print("水体面积是(单位:平方千米): ",pie.Number(water.get("constant").getInfo()).divide(1000000)); //进行单位换算}
}var selectTag1B = "ndvi"; // 设置初值
var select1B = ui.Select({items: ["ndvi","rvi","evi","fvc","lai","fpar","wet","lst","ndbsi","ndbi","tvdi","mndwi","ndwi",],placeholder: "请选择",value: selectTag1B,multiple: false,onChange: changeSelect1B,
});
var selectName1B = ui.Label("选择指数:");
var selectPanel1B = ui.Panel({widgets: [selectName1B, select1B],layout: ui.Layout.flow("horizontal"),
});
panel.add(selectPanel1B);function clickbtExport1() {print(selectTag1B);var roi = getROI(selectCode);var l8Col = landsat8Util.getLandsat8(selectStartDate2,selectEndDate2,roi,20);l8Col = l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).median().clip(roi);// tvdivar tvdi = globalTVDI(selectStartDate2, selectEndDate2, roi);// lstvar lst = MOD11A2.filterDate(selectStartDate2, selectEndDate2).filterBounds(roi).select("LST_Day_1km").mean().multiply(0.02).subtract(273.15).rename("lst").clip(roi);// lai//加载Terra星全球500m叶面积指数/FPAR 8天合成产品(MOD15A2H V6)var images1 = pie.ImageCollection("USGS/MOD15A2H/006").filterDate(selectStartDate2, selectEndDate2);//选择LAI波段,计算LAI均值var lai = images1.select("Lai_500m").map(function (image) {return image.updateMask(image.lt(200));}).mean().clip(roi).rename("lai");// fpar//选择FPAR波段,计算FPAR均值var fpar = images1.select("Fpar_500m").mean().clip(roi).rename("fpar");l8Col = landsat8Util.ndvi(l8Col);l8Col = landsat8Util.wet(l8Col);l8Col = landsat8Util.ndbsi(l8Col);l8Col = landsat8Util.evi(l8Col);l8Col = landsat8Util.mndwi(l8Col);l8Col = landsat8Util.fvc(l8Col);l8Col = landsat8Util.rvi(l8Col);l8Col = landsat8Util.ndbi(l8Col);l8Col = l8Col.addBands(ndwi.rename("ndwi")).addBands(lst.rename("lst")).addBands(tvdi.rename("tvdi")).addBands(lai.rename("lai")).addBands(fpar.rename("fpar"));//导出影像Export.image({image: l8Col.select(selectTag1B),description: "ExportImage:" + selectTag1B,assetId: "test",region: roi,scale: 30,});
}//导出数据
var btExport1 = ui.Button({label: "导出数据",type: "success",onClick: clickbtExport1,
});
panel.add(btExport1);// 回归分析
var label22 = ui.Label("6) 回归分析", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label22);function changeCheckbox(value) {var roi = getROI(selectCode);print("开始回归分析");// 裁剪function clip(image) {image = image.clip(roi);return image;}var l8Col = landsat8Util.getLandsat8(selectStartDate2,selectEndDate2,roi,20);l8Col = l8Col.select(["B2", "B3", "B4", "B5", "B6", "B7"]).map(clip).map(landsat8Util.ndvi).map(landsat8Util.wet).map(landsat8Util.evi);var visParam1 = {min: [0, 0.5, 0],max: [0.3, 2, 0.3],opacity: 1,bands: ["offset", "scale", "offset"],};var image1 = l8Col.select(["ndvi", "evi"]).reduce(pie.Reducer.linearFit()); // 回归算法Map.addLayer(image1, visParam1, "linearFit");print("结束回归分析");
}var checkbox = ui.Checkbox({label: ["ndvi", "evi", "wet"],value: [],disabled: [],onChange: changeCheckbox,
});
panel.add(checkbox);// 土地堵盖类型显示
var label23 = ui.Label("7) 土地覆盖类型显示", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label23);function clickbtLandShow() {var roi = getROI(selectCode);//加载全球地表覆盖GlobeLand30数据var sdate = new Date(selectStartDate2).getFullYear() + "-01-01"; // 获取起始日期前四位var edate = new Date(selectEndDate2).getFullYear() + "-12-31"; // 获取结束日期前四位var img = pie.ImageCollection("NGCC/GLOBELAND30").filterBounds(roi).filterDate(sdate, edate).select("B1").mosaic().clip(roi);//按不同地表覆盖类型值设定预览参数var colors = ["#00FF00","#00e900","#00dF00","#00ce00","#00ba00","#0002FF","#97FF00","#FF0000","#FFce00","#FFFFFF",];var visGL = {uniqueValue: "10, 20, 30, 40, 50, 60, 70, 80, 90, 100",palette: colors,};//加载显示影像Map.addLayer(img, visGL, "img");// 图例addLegend({title: "地表覆盖",colors: colors,labels: ["耕地","林地","草地","灌木地","湿地","水体","苔原","人造地表","裸地","积雪",],step: 1,});
}var btLandShow = ui.Button({label: "显示",type: "success",onClick: clickbtLandShow,
});
panel.add(btLandShow);// 时间转换
var label24 = ui.Label("8) 时间转换", {"font-size": "16px","font-weight": "bold",color: "red",
});
panel.add(label24);
var selectStartDateAAA = "2021-06-30";function inputSDateAAA(value) {selectStartDateAAA = value;
}var textBox1AAA = ui.DateSelect({type: "date",placeholder: "请输入数值",value: selectStartDateAAA, //输入显示框显示数值onChange: inputSDateAAA,disabled: false,
});var textboxName1AAA = ui.Label("输入转换日期:");
var textboxPanel1AAA = ui.Panel({widgets: [textboxName1AAA, textBox1AAA],layout: ui.Layout.flow("horizontal"),
});
panel.add(textboxPanel1AAA);// 转换天数,输入数据为pieNumber类型
function convertYearToDay(dateStr) {var now = new Date(dateStr);var start = new Date(now.getFullYear(), 0, 0);var diff = (now - start) + ((start.getTimezoneOffset() - now.getTimezoneOffset()) * 60 * 1000);var oneDay = 1000 * 60 * 60 * 24;var day = Math.floor(diff / oneDay);return day;
}function clickbtCon() {var dateNum = convertYearToDay(selectStartDateAAA); //转换为1年中的某一天print("转换后的天数:" + dateNum);
}var btCon = ui.Button({label: "转换",type: "success",onClick: clickbtCon,
});
panel.add(btCon);
ui.root.add(panel);

结果:

PIE-engine APP 教程 ——太湖生态环境智能监测系统相关推荐

  1. 配电房环境智能监测系统及轨道巡检机器人

    一.方案背景 在智能电网和物联网高速发展的今天,配电房的人工巡检方式已不能适应国家电网智能化发展的需求,已有的吊轨式摄像机智能抓拍图像和视频信息,不能对图像信息进行分析和处理,这增加了配电房管理人员的 ...

  2. 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

    想要更多项目私wo!!! 一.电路设计 室内环境智能监测系统 主要功能:         1.检测空气温湿度         2.检测光照强度         3.检测烟雾浓度         4.数 ...

  3. 智慧指间丨生态环境网格化监管系统——编织生态环保“绿网”

    什么是生态环境网格化监管系统? 2014年11月,国务院办公厅发布<关于加强环境监管执法的通知>(国办发[2014]56号),要求各市.县级人民政府要将本行政区域划分为若干环境监管网格,逐 ...

  4. 毕设—基于树莓派的家居环境智能监测系统设计与实践

    一.资料查找工具 英文文献:Sci-Hub | Academic Navigation Site – To remove all barriers in the way of science 中文文献 ...

  5. 变电站计算机在线监控系统,变电站环境在线监测系统

    原标题:变电站环境在线监测系统 概述 随着计算机技术.网络通讯技术以及电力系统保护技术的发展,配电室的自动化运行水平不断提高,大大减少了人为操作,使配电室的无人值守逐步变成了可能.配电的可靠和安全是整 ...

  6. 鹰格电子300W-QX-HPS系列生态下泄流量监测系统(成套设备)

    水电站.水库大坝(闸)设计下泄生态流量对下游河流生态环境进行补偿,是对下游人民群众的生产.生活环境的保护.水电站要严格遵守国家规定,规范水电站建设及运行各个时期的管理工作,在建设及运行的同时做到合理开 ...

  7. 工业DTU下城市下水道智能监测系统

    城市下水道的科学建设,关乎城市排水.美化.安全等各方面,是城市生产生活不可或缺的重要基础设施.计讯物联城市下水道智能监测系统利用无线通信技术进行下水道各状态实时监测,在智能化管理下全面解决城市内涝.井 ...

  8. 高速公路服务器区智慧系统,引入智能监测系统,这条高速公路服务区管理再升级...

    (来源:广东交通发布) 原标题:引入智能监测系统,这条高速公路服务区管理再升级 厕所有异味?报警! 连英高速引入智能管理"黑科技", 通过应用电化学传感器和移动通信技术, 在沿线服 ...

  9. 基于NB-IoT技术的环境温湿度监测系统的研制

    摘要 针对传统环境监测系统功耗高.维护成本高.不能实时监测的弊端,研制了一种以单片机为主控制芯片的基于 NB-IoT 技术的环境温湿度监测系统,并对主控制器的工作流程及通信模块的工作方式进行优化,降低 ...

  10. 水电站生态下泄流量监测系统解决方案

    一.方案背景 我国水电站非常多,为促进经济发展发挥了重要作用,但随之带来的生态问题也不容忽视.一些水电站因生态下泄流量不足造成部分河段减水.脱水甚至干涸,一定程度上影响了河流的正常生态功能和群众的生产 ...

最新文章

  1. 微博 用户画像_分析用户画像?从微博数据采集开始!
  2. html zoom中心,css中的zoom的使用
  3. linux内核源码剖析 博客,【Linux内存源码分析】页面迁移
  4. Python数据类型-元组类型
  5. 五、字符与字符串(Char类,Char类的使用,String的基本使用,StringBuilder的使用)...
  6. matplotlib之scatter散点、bar直方图(笔记四)
  7. eclipse中自定义videoview类_android控件之VideoView建立自己的播放器
  8. python基础教程慕课_Python基础教程(6)--抽象
  9. Eclipse安装插件的“最好方法”:dropins文件夹的妙用
  10. Gargamel:信息安全取证工具
  11. sit是什么环境_SIT和UAT有什么区别?谢谢!
  12. windows8 初始界面和功能
  13. 摄像头的MIPI接口、DVP接口和CSI接口
  14. 无人机姿态解算_互补滤波(1)
  15. opensuse13.1 安装 SqliteMan
  16. uc android 面试题,一道新浪UC部门软件测试面试题
  17. sql语句中大于号小于号的处理
  18. 一加5t ,安卓p系统卡在更新页面,安卓p降级教程(一加5t测试通过)
  19. 扫码支付是如何实现的?
  20. Matplotlib画图之调整字体大小

热门文章

  1. 星星之火OIer:NOIP2018完爆总结
  2. 【创建FTP】如何在内网创建属于自己的FTP
  3. 高级辅助驾驶(ADAS)整理(炒鸡详细)
  4. 高新区智慧交通建设方案
  5. 【应届生必看】技术岗面试应答有哪些话术和技巧?
  6. java blowfish 算法_Blowfish加密算法Java实现
  7. 数组根据条件筛选出满足条件的数据(数组里面是对象)
  8. Ubuntu 编译XCB源码
  9. hDC转PostScript转PDF
  10. Day04_Manuals for Python@lisongye - list列表