这里我们利用凉山州作为火灾边界,同样可以切换我们所需要的区域,可以切换省级代码来进行,需要手动修改。这里我们用到的swith 和case的案例条件判断分析,
语法
switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: 与 case 1 和 case 2 不同时执行的代码 }
实例
显示今天的星期名称。请注意 Sunday=0, Monday=1, Tuesday=2, 等等:
var d=new Date().getDay(); switch (d) { case 0:x="今天是星期日"; break; case 1:x="今天是星期一"; break; case 2:x="今天是星期二"; break; case 3:x="今天是星期三"; break; case 4:x="今天是星期四"; break; case 5:x="今天是星期五"; break; case 6:x="今天是星期六"; break; }
这里面所需的函数:
ui.DateSelect(type,placeholder,value,onChange,disabled,style)
时间选择。
方法参数:
- ui(ui)
调用者:ui对象。
- type(String)
日期选择类型,可选值为date|daterange|year|month|datetime|datetimerange。
- placeholder(String)
占位符内容。
- value(String|List)
选择具体的日期,格式为:yyyy-MM-dd|yyyy-MM-dd HH:mm:ss
- onChange(Function)
更新选择日期触发事件。
- disabled(Boolean)
是否禁用日期组件。
- style(Object)
组件样式。
返回值:ui.DateSelect
这里同样可以导出影像:
image(image,description,assetId,pyramidingPolicy,dimensions,region,scale,crs,crsTransform,maxPixels)
导出影像到个人存储空间。
方法参数:
- export(Export)
Export方法。
- image(Image)
要导出的影像。
- description(String, optional)
导出影像任务的描述。
- assetId(String, optional)
导出影像的存储路径。
- pyramidingPolicy(Object, optional)
金字塔规则。
- dimensions(Int, optional)
维度。
- region(Geometry, optional)
导出影像的范围。
- scale(Float, optional)
缩放比例,目前默认都是1。
- crs(Projection, optional)
投影的基准坐标参考系,暂指定为EPSG:4326或EPSG:3857参考系。
- crsTransform(List, optional)
投影坐标系变换值的列表。
- maxPixels(Long, optional)
要导出的最大像素数。
返回值:null
这个代码的还有提升的结果,如果要发布成为APP,那么就不太容易改变我们的研究区,因为在APP中没有code editor的界面,同样此APP的影像导出结果如果要下载,并没有出现在面板上。另外,对于chart图表的加载并没有加载到MAP上,如果转化为APP的化可能结果都无法显示,所以这个程序只能在code Editor界面中的控制台查看
代码:
/** * @Name : 凉山州火灾高发地异常度分析系统 * @Author : 西南大学天生一队 * @Source : 航天宏图第四届 “航天宏图杯”PIE软件二次开发大赛云开发组三等奖获奖作品 */ //定义程序运行过程需要用到的变量 var date = ["2018-03-20", "2018-04-20"]; //开始日期和结束日期 var mapID = null; //当前图层ID var maplegend = null; //当前图层图例ID var roiID = null; //当前研究范围ID var selectTag = "LST"; //选择的计算项目 var areaCode = "0"; //行政区划代码,默认为0 var roi = null; //研究区,在程序运行时动态变化 var default_roi = null; //默认研究区,凉山州 var sec_year = 2018; //要显示TVDI变化图的年份 var animationlayerID = []; //如果显示了动态图,则用此数组记录动态图的图层ID var currentImg = null; //当前图层所对应的影像,导出时使用 var exportScale = 500; //导出分辨率 //获得凉山州矢量 roi = pie .FeatureCollection("NGCC/CHINA_CITY_BOUNDARY") .filter(pie.Filter.eq("name", "凉山彝族自治州")) .getAt(0) .geometry(); default_roi = roi; //将默认研究区设置为凉山彝族自治州 //设置渲染样式(默认拉伸渲染,参数为最小值为最大值) function setVis(minvalue, maxvalue) { var newVis = { min: minvalue, max: maxvalue, palette: [ "217303", "268303", "2a9203", "2fa203", "33b203", "37c203", "3bd203", "40e203", "44f203", "4bfc09", "56fd18", "6dfe37", "79fe47", "8cff05", "98ff04", "a5fe04", "b1fe03", "befe02", "cbfe02", "d7fd02", "e3fc02", "effb02", "faf802", "f9eb02", "f7dd03", "f6cf03", "f5c203", "f4b503", "f3a803", "f29b04", "f18e04", "f08104", "ef7404", "ee6804", "ed5b05", "ec4f05", "eb4305", "e93705", "e82b05", "e72006", "e61406", "e50906", ], }; return newVis; } //按顺序输入影像集,起始时间、结束时间,要提取的波段名,研究区矢量【仅限单个波段提取】 function loadCol(nameCol, start, end, bandname, roi) { var rCol = pie .ImageCollection(nameCol) .filterDate(start, end) .filterBounds(roi) .select(bandname) .mean() .clip(roi); return rCol; } //更改行政区划后调用的函数 function getROI(code) { var new_roi = null; if (code !== 0) { var fCol = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY"); new_roi = fCol .filter(pie.Filter.eq("code", parseInt(code))) .first() .geometry(); } else { new_roi = default_roi; } return new_roi; } //下载landsat8影像 function l8Col_load(start, end) { var l8Col = pie .ImageCollection("LC08/01/T1") .filterDate(start, end) .select(["B2", "B3", "B4", "B5", "B6", "BQA"]) .filterBounds(roi) .map(function (image) { var qa = image.select("BQA"); var cloudMask = qa.bitwiseAnd(1 << 3).eq(0); return image.updateMask(cloudMask); }); return l8Col; } //定义Landsat8不同指数计算方式 var landsat8 = { //NDWI: (B03 - B05)/(B03 + B05) NDWI: function (image) { var b3 = image.select("B3"); var b5 = image.select("B5"); var ndvi = b3.subtract(b5).divide(b3.add(b5)); return ndvi.rename("NDVI"); }, //MNDWI: (G - SWIR)/(G + SWIR) MNDWI: function (image) { var b3 = image.select("B3"); var b6 = image.select("B6"); var ndvi = b3.subtract(b6).divide(b3.add(b6)); return ndvi.rename("MNDWI"); }, //NDVI: (B05 - B04)/(B05 + B04) NDVI: function (image) { var b5 = image.select("B5"); var b4 = image.select("B4"); var ndvi = b5.subtract(b4).divide(b5.add(b4)); return ndvi.rename("NDVI"); }, //EVI: 2.5*(B05 - B04) / (B05 + 6*B04 - 7.5*B02 + 1) EVI: function (image) { var nir = image.select("B5").divide(10000); var red = image.select("B4").divide(10000); var blue = image.select("B2").divide(10000); var evi = nir .subtract(red) .multiply(2.5) .divide(nir.add(red.multiply(6)).subtract(blue.multiply(7.5)).add(1)); return evi.rename("EVI"); }, }; //点击“确定”按钮后调用的计算函数,用于计算选择的指标 function calcuate(roi, startDate, endDate, tag) { //影像集合 var l8Col = pie.ImageCollection("LC08/01/T1"); //通过日期过滤影像集合,并计算 l8Col = l8Col .filterDate(startDate, endDate) .select(["B2", "B3", "B4", "B5", "B6", "BQA"]) .filterBounds(roi) .map(function (image) { var qa = image.select("BQA"); var cloudMask = qa.bitwiseAnd(1 << 4).eq(0); return image.updateMask(cloudMask); }); var image = null; var vis = null; switch (tag) { case "LST": image = loadCol("USGS/MOD11A1/006", date[0], date[1], "LST_Day_1km", roi) .multiply(0.02) .subtract(273.15); vis = setVis(0, 40); addLegend("地表温度(°C)", [10, 20, 30, 40]); break; case "NDVI": image = l8Col.map(landsat8.NDVI).mean().clip(roi); vis = setVis(-0.2, 0.8); addLegend("NDVI Value", ["0", "0.6"]); break; case "NDWI": image = l8Col.map(landsat8.NDWI).mean().clip(roi); vis = setVis(-1, 0.3); addLegend("NDWI Value", ["-0.8", "0.1"]); break; case "MNDWI": image = l8Col.map(landsat8.MNDWI).mean().clip(roi); vis = setVis(-1, 0.3); addLegend("MNDWI Value", ["-0.8", "0.1"]); break; case "EVI": image = l8Col.map(landsat8.EVI).mean().clip(roi); vis = setVis(-0.2, 0.8); addLegend("EVI Value", ["0", "0.6"]); break; case "TVDI": //调用TVDI数据产品 image = loadCol("BNU/GLOBAL_1KM_TVDI", date[0], date[1], "B1", roi); image = image.divide(10000); vis = setVis(0, 1); addLegend("TVDI Value(0~1)", ["0.25", "0.75"]); break; case "火点": //调用MODIS数据产品 image = loadCol("USGS/MOD14A2/006", date[0], date[1], "FireMask", roi); vis = setVis(3, 8); addLegend("置信等级", ["<3", 4, 5, 6, 7, 8]); break; } if (mapID !== null) { Map.removeLayer(mapID); //如果有图层ID则将其移除,保证只有1个图层显示 } mapID = Map.addLayer(image, vis, tag); currentImg = image; } //添加图例样式的函数,作用在于计算的项目发生改变时动态调整图例,参数:1)titile:string;2)labels:object[] function addLegend(title, labels) { var data = { title: title, colors: [ "#217303", "#268303", "#2a9203", "#2fa203", "#33b203", "#37c203", "#3bd203", "#40e203", "#44f203", "#4bfc09", "#56fd18", "#6dfe37", "#79fe47", "#8cff05", "#98ff04", "#a5fe04", "#b1fe03", "#befe02", "#cbfe02", "#d7fd02", "#e3fc02", "#effb02", "#faf802", "#f9eb02", "#f7dd03", "#f6cf03", "#f5c203", "#f4b503", "#f3a803", "#f29b04", "#f18e04", "#f08104", "#ef7404", "#ee6804", "#ed5b05", "#ec4f05", "#eb4305", "#e93705", "#e82b05", "#e72006", "#e61406", "#e50906", ], labels: labels, step: 30, }; var style = { right: "150px", bottom: "10px", height: "70px", width: "350px", }; if (maplegend !== null) { Map.removeUI(maplegend); //如果存在图例则将其移除,保证只有一个图例 } maplegend = ui.Legend(data, style); Map.addUI(maplegend); } //导出当前图层所对应的影像 function exportCurrentMap(img, description, roi, scale) { if (currentImg !== null && animationlayerID.length == 0) { Export.image({ image: img, description: description, region: roi, scale: scale, }); print("导出成功!"); } else { print("当前图层为空或图层不唯一!"); } } //根据年份计算每个月的TVDI,并显示折线图。TVDI值越大,土壤湿度越低,反之土壤湿度越高 function calculateTVDI(start, end) { var img = pie .ImageCollection("BNU/GLOBAL_1KM_TVDI") .filterDate(start, end) .select("B1") .filterBounds(roi) .mean() .clip(roi) .divide(10000); return img; } function showTVDI(year) { var month = [ "-01", "-02", "-03", "-04", "-05", "-06", "-07", "-08", "-09", "-10", "-11", "-12", ]; var day = [ "-31", "-28", "-31", "-30", "-31", "-30", "-31", "-31", "-30", "-31", "-30", "-31", ]; var data = []; for (var i = 0; i < 12; i++) { var t1 = calculateTVDI(year + month[i] + "-01", year + month[i] + day[i]); var t2 = t1.reduceRegion(pie.Reducer.mean(), roi, 1000); data.push(t2); } var line_a = { title: year + "年TVDI变化", legend: ["TVDI"], xAxisName: "月份", yAxisName: "TVDI值", chartType: "line", yMin: 0, yMax: 1, smooth: true, }; // 显示折线图 var mark = [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", ]; ChartImage(data, mark, line_a); } //显示某年动态图的函数 function showAnimation(year) { var month = [ "-01", "-02", "-03", "-04", "-05", "-06", "-07", "-08", "-09", "-10", "-11", "-12", ]; var day = [ "-31", "-28", "-31", "-30", "-31", "-30", "-31", "-31", "-30", "-31", "-30", "-31", ]; var data = []; if (mapID !== null) { Map.removeLayer(mapID); } if (animationlayerID.length > 0) { for (var i = 0; i < animationlayerID.length; i++) { Map.removeLayer(animationlayerID[i]); } animationlayerID = []; } switch (selectTag) { case "TVDI": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = calculateTVDI(start, end); var map = Map.addLayer( img, setVis(0, 1), year + month[i] + "TVDI", false ); animationlayerID.push(map); data.push(year + month[i] + "TVDI"); } addLegend("TVDI Value(0~1)", ["0.25", "0.75"]); break; case "LST": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = loadCol("USGS/MOD11A1/006", start, end, "LST_Day_1km", roi) .multiply(0.02) .subtract(273.15); var map = Map.addLayer( img, setVis(0, 40), year + month[i] + "LST", false ); animationlayerID.push(map); data.push(year + month[i] + "LST"); } addLegend("地表温度(°C)", [10, 20, 30, 40]); break; case "火点": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = loadCol("USGS/MOD14A2/006", start, end, "FireMask", roi); var map = Map.addLayer( img, setVis(3, 8), year + month[i] + "火点", false ); animationlayerID.push(map); data.push(year + month[i] + "火点"); } addLegend("置信等级", ["<3", 4, 5, 6, 7, 8]); break; case "NDVI": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = l8Col_load(start, end).map(landsat8.NDVI).mean().clip(roi); var map = Map.addLayer( img, setVis(-0.2, 0.8), year + month[i] + "NDVI", false ); animationlayerID.push(map); data.push(year + month[i] + "NDVI"); } addLegend("NDVI Value", ["0", "0.6"]); break; case "NDWI": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = l8Col_load(start, end).map(landsat8.NDWI).mean().clip(roi); var map = Map.addLayer( img, setVis(-1, 0.3), year + month[i] + "NDWI", false ); animationlayerID.push(map); data.push(year + month[i] + "NDWI"); } addLegend("NDWI Value", ["-0.8", "0.1"]); break; case "MNDWI": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = l8Col_load(start, end).map(landsat8.MNDWI).mean().clip(roi); var map = Map.addLayer( img, setVis(-1, 0.3), year + month[i] + "MNDWI", false ); animationlayerID.push(map); data.push(year + month[i] + "MNDWI"); } addLegend("MNDWI Value", ["-0.8", "0.1"]); break; case "EVI": for (var i = 0; i < 12; i++) { var img = null; var start = year + month[i] + "-01"; var end = year + month[i] + day[i]; img = l8Col_load(start, end).map(landsat8.EVI).mean().clip(roi); var map = Map.addLayer( img, setVis(-0.2, 0.8), year + month[i] + "EVI", false ); animationlayerID.push(map); data.push(year + month[i] + "EVI"); } addLegend("EVI Value", ["0", "0.6"]); break; } Map.playLayersAnimation(data, 1, -1); //动图间隔时间1秒,无限次循环。 } Map.centerObject(roi, 5); //将地图中心转到研究范围 /* -------------------------以下代码是控件的布局以及事件的绑定等参数设置----------------------------- */ function funDateSelect(value) { date[0] = value[0]; date[1] = value[1]; } var dateSelect = ui.DateSelect({ type: "daterange", placeholder: "请输入数值", value: ["2018-03-20", "2018-04-20"], onChange: funDateSelect, disabled: false, }); function changeSelect(value) { selectTag = value; } var select1 = ui.Select({ items: ["LST", "TVDI", "火点", "NDVI", "NDWI", "MNDWI", "EVI"], placeholder: "请选择", value: selectTag, multiple: false, onChange: changeSelect, }); var selectIndex = ui.Label("选择项目:"); var selectPanel = ui.Panel({ widgets: [selectIndex, select1], layout: ui.Layout.flow("horizontal"), }); function inputArea(value) { areaCode = value; roi = getROI(areaCode); } var textBox3 = ui.TextBox({ placeholder: "请输入行政区划编码", value: areaCode, onChange: inputArea, disabled: false, }); var textboxName3 = ui.Label("更改行政区划(省级):"); var txtPanel1 = ui.Panel({ widgets: [textboxName3, textBox3], layout: ui.Layout.flow("horizontal"), }); var selecDateLabel = ui.Label("选择日期范围:"); var txtPanel2 = ui.Panel({ widgets: [selecDateLabel, dateSelect], layout: ui.Layout.flow("horizontal"), }); //点击“确定”按钮调用的函数 function click_BtnOK() { print("当前计算项目:", selectTag + "," + date[0] + "~" + date[1]); //调用计算函数计算选择的指标添加到地图 calcuate(roi, date[0], date[1], selectTag); if (animationlayerID.length > 0) { for (var i = 0; i < animationlayerID.length; i++) { Map.removeLayer(animationlayerID[i]); } animationlayerID = []; } } var btnOK = ui.Button({ label: "确定", type: "success", onClick: click_BtnOK, style: { left: "50px" }, }); function click_btnExport() { exportCurrentMap( currentImg, date[0] + "-" + date[1] + selectTag, roi, exportScale ); } var btnExport = ui.Button({ label: "导出当前图层", type: "success", onClick: click_btnExport, style: { left: "50px" }, }); function changeScale(value) { exportScale = value; } var select2 = ui.Select({ items: [30, 50, 100, 200, 500, 1000, 2000], placeholder: "请选择", value: exportScale, multiple: false, onChange: changeScale, }); var selectPanel2 = ui.Panel({ widgets: [ui.Label("选择导出分辨率(米):"), select2], layout: ui.Layout.flow("horizontal"), }); function click_btnMonthly() { showAnimation(sec_year); } var btnMonthly = ui.Button({ label: "显示当前指标每月动态图", type: "success", onClick: click_btnMonthly, style: { left: "10px" }, }); function click_showBtn() { //画出选择的年份TVDI变化图 showTVDI(sec_year); } var btnShow = ui.Button({ label: "显示TVDI变化折线图", type: "success", onClick: click_showBtn, style: { left: "10px" }, }); var btnPanel1 = ui.Panel({ widgets: [btnOK, btnExport], layout: ui.Layout.flow("horizontal"), }); function inputYear(value) { sec_year = value; } var txtBoxyear = ui.TextBox({ placeholder: "请输入年份", value: sec_year, onChange: inputYear, disabled: false, }); var labelyear = ui.Label("输入年份:"); var txtPanel3 = ui.Panel({ widgets: [labelyear, txtBoxyear], layout: ui.Layout.flow("horizontal"), }); var btnPanel2 = ui.Panel({ widgets: [btnShow, btnMonthly], layout: ui.Layout.flow("horizontal"), }); var panel = ui.Panel({ widgets: [ ui.Label("凉山彝族自治州火灾异常监测", { "font-size": "18px" }), ui.Label( "默认区域为凉山彝族自治州,若想更换区域请输入行政区代码(省级),若输入0则为默认区域", { "font-size": "18px" } ), selectPanel, txtPanel1, txtPanel2, btnPanel1, selectPanel2, txtPanel3, btnPanel2, ], style: { width: "400px", height: "500px", backgroundColor: "#fff", }, }); ui.root.add(panel); /* 以上是网页上的整体框架布局*/
结果: