#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测 原创

此星光明
发布于 2022-9-27 15:23
9815浏览
0收藏


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

代码:

PIE-engine APP 教程 ——太湖生态环境智能监测系统/**
 * @Name    :   基于多源遥感的太湖生态环境智能监测系统
 * @Time    :   2020/7/21
 * @Author  :   中国矿业大学(北京)PIE小分队
 * @Version :   1.0
 * @E-mail  :   sun_yilin@yeah.net
 * @Source
// 需要转换为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;
    },
    // 大气校正步骤1
    min567: 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 10000
    jz: 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);
    },

    // 计算 FAI
    funFAI: 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,小于则为0
        return image.addBands(algae);
    },

    //添加 IndexBands
    addIndexBands: 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 SR
    alg: function (image) {
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var b6 = image.select("B6"); // swir1

        // 计算ndvi
        var 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);
    },

    //ndvi
    ndvi: function (image) {
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var ndvi = b5.subtract(b4).divide(b5.add(b4)).rename("ndvi");
        return image.addBands(ndvi);
    },

    //fvc
    fvc: function (image) {
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var 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);
    },

    // wet
    wet: function (image) {
        var b2 = image.select("B2"); // blue
        var b3 = image.select("B3"); // green
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var b6 = image.select("B6"); // swir1
        var b7 = image.select("B7"); // swir1
        var 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);
    },

    // ndbsi
    ndbsi: function (image) {
        var b2 = image.select("B2"); // blue
        var b3 = image.select("B3"); // green
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var b6 = image.select("B6"); // swir1
        // var b7 = image.select("B7"); // swir1
        var 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 ndbsi
        return image.addBands(ndbsi);
    },

    //ndbi
    ndbi: 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);
    },

    // evi
    evi: function (image) {
        var b2 = image.select("B2"); // blue
        var b4 = image.select("B4"); // red
        var b5 = image.select("B5"); // nir
        var 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);
    },

    // mndwi
    mndwi: 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);
    },

    // rvi
    rvi: function (image) {
        var b3 = image.select("B3"); // green
        var b5 = image.select("B5"); // nir
        var rvi = b3.divide(b5).rename("rvi");
        return image.addBands(rvi);
    },

    // ndwi
    ndwi: function (image) {
        var b3 = image.select("B3"); // green
        var b5 = image.select("B5"); // nir
        var ndwi = b3.subtract(b5).divide(b3.add(b5)).rename("ndwi");
        return image.addBands(ndwi);
    },

    trans: function (image) {
        var b4 = image.select("B4"); // red
        var 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 SR
    ss: function (image) {
        var b4 = image.select("B4"); // red
        var 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"); // red
        var b5 = image.select("B5"); // nir
        var b6 = image.select("B6"); // swir1
        var b2 = image.select("B2"); // blue
        var b3 = image.select("B3"); // green
        var 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) {
    // tvdi
    var 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, // 当显示为全部区域时,上限为25000
                        smooth: true,
                    };
                } else {
                    var line_a = {
                        title: "太湖水域蓝藻面积动态变化",
                        legend: ["蓝藻像元数量"],
                        xAxisName: "日期",
                        yAxisName: "蓝藻像元数量(500*500m)",
                        chartType: "line",
                        yMin: 0,
                        yMax: 2000, // 当显示为部分区域时,上限为2000
                        smooth: 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, // 当显示为全部区域时,上限为40000
                        smooth: 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); // 方法2
                print(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 SR
        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();
            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 SR
            var 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 SR
            var 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 SR
        var 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()); // 保存面积,需用getInfo
            yearDate.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); // 方法2
        print(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 {
        // 哨兵二号去云2
        function 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);

    // tvdi
    var tvdi = globalTVDI(selectStartDate2, selectEndDate2, roi);

    // lst
    var 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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.
  • 272.
  • 273.
  • 274.
  • 275.
  • 276.
  • 277.
  • 278.
  • 279.
  • 280.
  • 281.
  • 282.
  • 283.
  • 284.
  • 285.
  • 286.
  • 287.
  • 288.
  • 289.
  • 290.
  • 291.
  • 292.
  • 293.
  • 294.
  • 295.
  • 296.
  • 297.
  • 298.
  • 299.
  • 300.
  • 301.
  • 302.
  • 303.
  • 304.
  • 305.
  • 306.
  • 307.
  • 308.
  • 309.
  • 310.
  • 311.
  • 312.
  • 313.
  • 314.
  • 315.
  • 316.
  • 317.
  • 318.
  • 319.
  • 320.
  • 321.
  • 322.
  • 323.
  • 324.
  • 325.
  • 326.
  • 327.
  • 328.
  • 329.
  • 330.
  • 331.
  • 332.
  • 333.
  • 334.
  • 335.
  • 336.
  • 337.
  • 338.
  • 339.
  • 340.
  • 341.
  • 342.
  • 343.
  • 344.
  • 345.
  • 346.
  • 347.
  • 348.
  • 349.
  • 350.
  • 351.
  • 352.
  • 353.
  • 354.
  • 355.
  • 356.
  • 357.
  • 358.
  • 359.
  • 360.
  • 361.
  • 362.
  • 363.
  • 364.
  • 365.
  • 366.
  • 367.
  • 368.
  • 369.
  • 370.
  • 371.
  • 372.
  • 373.
  • 374.
  • 375.
  • 376.
  • 377.
  • 378.
  • 379.
  • 380.
  • 381.
  • 382.
  • 383.
  • 384.
  • 385.
  • 386.
  • 387.
  • 388.
  • 389.
  • 390.
  • 391.
  • 392.
  • 393.
  • 394.
  • 395.
  • 396.
  • 397.
  • 398.
  • 399.
  • 400.
  • 401.
  • 402.
  • 403.
  • 404.
  • 405.
  • 406.
  • 407.
  • 408.
  • 409.
  • 410.
  • 411.
  • 412.
  • 413.
  • 414.
  • 415.
  • 416.
  • 417.
  • 418.
  • 419.
  • 420.
  • 421.
  • 422.
  • 423.
  • 424.
  • 425.
  • 426.
  • 427.
  • 428.
  • 429.
  • 430.
  • 431.
  • 432.
  • 433.
  • 434.
  • 435.
  • 436.
  • 437.
  • 438.
  • 439.
  • 440.
  • 441.
  • 442.
  • 443.
  • 444.
  • 445.
  • 446.
  • 447.
  • 448.
  • 449.
  • 450.
  • 451.
  • 452.
  • 453.
  • 454.
  • 455.
  • 456.
  • 457.
  • 458.
  • 459.
  • 460.
  • 461.
  • 462.
  • 463.
  • 464.
  • 465.
  • 466.
  • 467.
  • 468.
  • 469.
  • 470.
  • 471.
  • 472.
  • 473.
  • 474.
  • 475.
  • 476.
  • 477.
  • 478.
  • 479.
  • 480.
  • 481.
  • 482.
  • 483.
  • 484.
  • 485.
  • 486.
  • 487.
  • 488.
  • 489.
  • 490.
  • 491.
  • 492.
  • 493.
  • 494.
  • 495.
  • 496.
  • 497.
  • 498.
  • 499.
  • 500.
  • 501.
  • 502.
  • 503.
  • 504.
  • 505.
  • 506.
  • 507.
  • 508.
  • 509.
  • 510.
  • 511.
  • 512.
  • 513.
  • 514.
  • 515.
  • 516.
  • 517.
  • 518.
  • 519.
  • 520.
  • 521.
  • 522.
  • 523.
  • 524.
  • 525.
  • 526.
  • 527.
  • 528.
  • 529.
  • 530.
  • 531.
  • 532.
  • 533.
  • 534.
  • 535.
  • 536.
  • 537.
  • 538.
  • 539.
  • 540.
  • 541.
  • 542.
  • 543.
  • 544.
  • 545.
  • 546.
  • 547.
  • 548.
  • 549.
  • 550.
  • 551.
  • 552.
  • 553.
  • 554.
  • 555.
  • 556.
  • 557.
  • 558.
  • 559.
  • 560.
  • 561.
  • 562.
  • 563.
  • 564.
  • 565.
  • 566.
  • 567.
  • 568.
  • 569.
  • 570.
  • 571.
  • 572.
  • 573.
  • 574.
  • 575.
  • 576.
  • 577.
  • 578.
  • 579.
  • 580.
  • 581.
  • 582.
  • 583.
  • 584.
  • 585.
  • 586.
  • 587.
  • 588.
  • 589.
  • 590.
  • 591.
  • 592.
  • 593.
  • 594.
  • 595.
  • 596.
  • 597.
  • 598.
  • 599.
  • 600.
  • 601.
  • 602.
  • 603.
  • 604.
  • 605.
  • 606.
  • 607.
  • 608.
  • 609.
  • 610.
  • 611.
  • 612.
  • 613.
  • 614.
  • 615.
  • 616.
  • 617.
  • 618.
  • 619.
  • 620.
  • 621.
  • 622.
  • 623.
  • 624.
  • 625.
  • 626.
  • 627.
  • 628.
  • 629.
  • 630.
  • 631.
  • 632.
  • 633.
  • 634.
  • 635.
  • 636.
  • 637.
  • 638.
  • 639.
  • 640.
  • 641.
  • 642.
  • 643.
  • 644.
  • 645.
  • 646.
  • 647.
  • 648.
  • 649.
  • 650.
  • 651.
  • 652.
  • 653.
  • 654.
  • 655.
  • 656.
  • 657.
  • 658.
  • 659.
  • 660.
  • 661.
  • 662.
  • 663.
  • 664.
  • 665.
  • 666.
  • 667.
  • 668.
  • 669.
  • 670.
  • 671.
  • 672.
  • 673.
  • 674.
  • 675.
  • 676.
  • 677.
  • 678.
  • 679.
  • 680.
  • 681.
  • 682.
  • 683.
  • 684.
  • 685.
  • 686.
  • 687.
  • 688.
  • 689.
  • 690.
  • 691.
  • 692.
  • 693.
  • 694.
  • 695.
  • 696.
  • 697.
  • 698.
  • 699.
  • 700.
  • 701.
  • 702.
  • 703.
  • 704.
  • 705.
  • 706.
  • 707.
  • 708.
  • 709.
  • 710.
  • 711.
  • 712.
  • 713.
  • 714.
  • 715.
  • 716.
  • 717.
  • 718.
  • 719.
  • 720.
  • 721.
  • 722.
  • 723.
  • 724.
  • 725.
  • 726.
  • 727.
  • 728.
  • 729.
  • 730.
  • 731.
  • 732.
  • 733.
  • 734.
  • 735.
  • 736.
  • 737.
  • 738.
  • 739.
  • 740.
  • 741.
  • 742.
  • 743.
  • 744.
  • 745.
  • 746.
  • 747.
  • 748.
  • 749.
  • 750.
  • 751.
  • 752.
  • 753.
  • 754.
  • 755.
  • 756.
  • 757.
  • 758.
  • 759.
  • 760.
  • 761.
  • 762.
  • 763.
  • 764.
  • 765.
  • 766.
  • 767.
  • 768.
  • 769.
  • 770.
  • 771.
  • 772.
  • 773.
  • 774.
  • 775.
  • 776.
  • 777.
  • 778.
  • 779.
  • 780.
  • 781.
  • 782.
  • 783.
  • 784.
  • 785.
  • 786.
  • 787.
  • 788.
  • 789.
  • 790.
  • 791.
  • 792.
  • 793.
  • 794.
  • 795.
  • 796.
  • 797.
  • 798.
  • 799.
  • 800.
  • 801.
  • 802.
  • 803.
  • 804.
  • 805.
  • 806.
  • 807.
  • 808.
  • 809.
  • 810.
  • 811.
  • 812.
  • 813.
  • 814.
  • 815.
  • 816.
  • 817.
  • 818.
  • 819.
  • 820.
  • 821.
  • 822.
  • 823.
  • 824.
  • 825.
  • 826.
  • 827.
  • 828.
  • 829.
  • 830.
  • 831.
  • 832.
  • 833.
  • 834.
  • 835.
  • 836.
  • 837.
  • 838.
  • 839.
  • 840.
  • 841.
  • 842.
  • 843.
  • 844.
  • 845.
  • 846.
  • 847.
  • 848.
  • 849.
  • 850.
  • 851.
  • 852.
  • 853.
  • 854.
  • 855.
  • 856.
  • 857.
  • 858.
  • 859.
  • 860.
  • 861.
  • 862.
  • 863.
  • 864.
  • 865.
  • 866.
  • 867.
  • 868.
  • 869.
  • 870.
  • 871.
  • 872.
  • 873.
  • 874.
  • 875.
  • 876.
  • 877.
  • 878.
  • 879.
  • 880.
  • 881.
  • 882.
  • 883.
  • 884.
  • 885.
  • 886.
  • 887.
  • 888.
  • 889.
  • 890.
  • 891.
  • 892.
  • 893.
  • 894.
  • 895.
  • 896.
  • 897.
  • 898.
  • 899.
  • 900.
  • 901.
  • 902.
  • 903.
  • 904.
  • 905.
  • 906.
  • 907.
  • 908.
  • 909.
  • 910.
  • 911.
  • 912.
  • 913.
  • 914.
  • 915.
  • 916.
  • 917.
  • 918.
  • 919.
  • 920.
  • 921.
  • 922.
  • 923.
  • 924.
  • 925.
  • 926.
  • 927.
  • 928.
  • 929.
  • 930.
  • 931.
  • 932.
  • 933.
  • 934.
  • 935.
  • 936.
  • 937.
  • 938.
  • 939.
  • 940.
  • 941.
  • 942.
  • 943.
  • 944.
  • 945.
  • 946.
  • 947.
  • 948.
  • 949.
  • 950.
  • 951.
  • 952.
  • 953.
  • 954.
  • 955.
  • 956.
  • 957.
  • 958.
  • 959.
  • 960.
  • 961.
  • 962.
  • 963.
  • 964.
  • 965.
  • 966.
  • 967.
  • 968.
  • 969.
  • 970.
  • 971.
  • 972.
  • 973.
  • 974.
  • 975.
  • 976.
  • 977.
  • 978.
  • 979.
  • 980.
  • 981.
  • 982.
  • 983.
  • 984.
  • 985.
  • 986.
  • 987.
  • 988.
  • 989.
  • 990.
  • 991.
  • 992.
  • 993.
  • 994.
  • 995.
  • 996.
  • 997.
  • 998.
  • 999.
  • 1000.
  • 1001.
  • 1002.
  • 1003.
  • 1004.
  • 1005.
  • 1006.
  • 1007.
  • 1008.
  • 1009.
  • 1010.
  • 1011.
  • 1012.
  • 1013.
  • 1014.
  • 1015.
  • 1016.
  • 1017.
  • 1018.
  • 1019.
  • 1020.
  • 1021.
  • 1022.
  • 1023.
  • 1024.
  • 1025.
  • 1026.
  • 1027.
  • 1028.
  • 1029.
  • 1030.
  • 1031.
  • 1032.
  • 1033.
  • 1034.
  • 1035.
  • 1036.
  • 1037.
  • 1038.
  • 1039.
  • 1040.
  • 1041.
  • 1042.
  • 1043.
  • 1044.
  • 1045.
  • 1046.
  • 1047.
  • 1048.
  • 1049.
  • 1050.
  • 1051.
  • 1052.
  • 1053.
  • 1054.
  • 1055.
  • 1056.
  • 1057.
  • 1058.
  • 1059.
  • 1060.
  • 1061.
  • 1062.
  • 1063.
  • 1064.
  • 1065.
  • 1066.
  • 1067.
  • 1068.
  • 1069.
  • 1070.
  • 1071.
  • 1072.
  • 1073.
  • 1074.
  • 1075.
  • 1076.
  • 1077.
  • 1078.
  • 1079.
  • 1080.
  • 1081.
  • 1082.
  • 1083.
  • 1084.
  • 1085.
  • 1086.
  • 1087.
  • 1088.
  • 1089.
  • 1090.
  • 1091.
  • 1092.
  • 1093.
  • 1094.
  • 1095.
  • 1096.
  • 1097.
  • 1098.
  • 1099.
  • 1100.
  • 1101.
  • 1102.
  • 1103.
  • 1104.
  • 1105.
  • 1106.
  • 1107.
  • 1108.
  • 1109.
  • 1110.
  • 1111.
  • 1112.
  • 1113.
  • 1114.
  • 1115.
  • 1116.
  • 1117.
  • 1118.
  • 1119.
  • 1120.
  • 1121.
  • 1122.
  • 1123.
  • 1124.
  • 1125.
  • 1126.
  • 1127.
  • 1128.
  • 1129.
  • 1130.
  • 1131.
  • 1132.
  • 1133.
  • 1134.
  • 1135.
  • 1136.
  • 1137.
  • 1138.
  • 1139.
  • 1140.
  • 1141.
  • 1142.
  • 1143.
  • 1144.
  • 1145.
  • 1146.
  • 1147.
  • 1148.
  • 1149.
  • 1150.
  • 1151.
  • 1152.
  • 1153.
  • 1154.
  • 1155.
  • 1156.
  • 1157.
  • 1158.
  • 1159.
  • 1160.
  • 1161.
  • 1162.
  • 1163.
  • 1164.
  • 1165.
  • 1166.
  • 1167.
  • 1168.
  • 1169.
  • 1170.
  • 1171.
  • 1172.
  • 1173.
  • 1174.
  • 1175.
  • 1176.
  • 1177.
  • 1178.
  • 1179.
  • 1180.
  • 1181.
  • 1182.
  • 1183.
  • 1184.
  • 1185.
  • 1186.
  • 1187.
  • 1188.
  • 1189.
  • 1190.
  • 1191.
  • 1192.
  • 1193.
  • 1194.
  • 1195.
  • 1196.
  • 1197.
  • 1198.
  • 1199.
  • 1200.
  • 1201.
  • 1202.
  • 1203.
  • 1204.
  • 1205.
  • 1206.
  • 1207.
  • 1208.
  • 1209.
  • 1210.
  • 1211.
  • 1212.
  • 1213.
  • 1214.
  • 1215.
  • 1216.
  • 1217.
  • 1218.
  • 1219.
  • 1220.
  • 1221.
  • 1222.
  • 1223.
  • 1224.
  • 1225.
  • 1226.
  • 1227.
  • 1228.
  • 1229.
  • 1230.
  • 1231.
  • 1232.
  • 1233.
  • 1234.
  • 1235.
  • 1236.
  • 1237.
  • 1238.
  • 1239.
  • 1240.
  • 1241.
  • 1242.
  • 1243.
  • 1244.
  • 1245.
  • 1246.
  • 1247.
  • 1248.
  • 1249.
  • 1250.
  • 1251.
  • 1252.
  • 1253.
  • 1254.
  • 1255.
  • 1256.
  • 1257.
  • 1258.
  • 1259.
  • 1260.
  • 1261.
  • 1262.
  • 1263.
  • 1264.
  • 1265.
  • 1266.
  • 1267.
  • 1268.
  • 1269.
  • 1270.
  • 1271.
  • 1272.
  • 1273.
  • 1274.
  • 1275.
  • 1276.
  • 1277.
  • 1278.
  • 1279.
  • 1280.
  • 1281.
  • 1282.
  • 1283.
  • 1284.
  • 1285.
  • 1286.
  • 1287.
  • 1288.
  • 1289.
  • 1290.
  • 1291.
  • 1292.
  • 1293.
  • 1294.
  • 1295.
  • 1296.
  • 1297.
  • 1298.
  • 1299.
  • 1300.
  • 1301.
  • 1302.
  • 1303.
  • 1304.
  • 1305.
  • 1306.
  • 1307.
  • 1308.
  • 1309.
  • 1310.
  • 1311.
  • 1312.
  • 1313.
  • 1314.
  • 1315.
  • 1316.
  • 1317.
  • 1318.
  • 1319.
  • 1320.
  • 1321.
  • 1322.
  • 1323.
  • 1324.
  • 1325.
  • 1326.
  • 1327.
  • 1328.
  • 1329.
  • 1330.
  • 1331.
  • 1332.
  • 1333.
  • 1334.
  • 1335.
  • 1336.
  • 1337.
  • 1338.
  • 1339.
  • 1340.
  • 1341.
  • 1342.
  • 1343.
  • 1344.
  • 1345.
  • 1346.
  • 1347.
  • 1348.
  • 1349.
  • 1350.
  • 1351.
  • 1352.
  • 1353.
  • 1354.
  • 1355.
  • 1356.
  • 1357.
  • 1358.
  • 1359.
  • 1360.
  • 1361.
  • 1362.
  • 1363.
  • 1364.
  • 1365.
  • 1366.
  • 1367.
  • 1368.
  • 1369.
  • 1370.
  • 1371.
  • 1372.
  • 1373.
  • 1374.
  • 1375.
  • 1376.
  • 1377.
  • 1378.
  • 1379.
  • 1380.
  • 1381.
  • 1382.
  • 1383.
  • 1384.
  • 1385.
  • 1386.
  • 1387.
  • 1388.
  • 1389.
  • 1390.
  • 1391.
  • 1392.
  • 1393.
  • 1394.
  • 1395.
  • 1396.
  • 1397.
  • 1398.
  • 1399.
  • 1400.
  • 1401.
  • 1402.
  • 1403.
  • 1404.
  • 1405.
  • 1406.
  • 1407.
  • 1408.
  • 1409.
  • 1410.
  • 1411.
  • 1412.
  • 1413.
  • 1414.
  • 1415.
  • 1416.
  • 1417.
  • 1418.
  • 1419.
  • 1420.
  • 1421.
  • 1422.
  • 1423.
  • 1424.
  • 1425.
  • 1426.
  • 1427.
  • 1428.
  • 1429.
  • 1430.
  • 1431.
  • 1432.
  • 1433.
  • 1434.
  • 1435.
  • 1436.
  • 1437.
  • 1438.
  • 1439.
  • 1440.
  • 1441.
  • 1442.
  • 1443.
  • 1444.
  • 1445.
  • 1446.
  • 1447.
  • 1448.
  • 1449.
  • 1450.
  • 1451.
  • 1452.
  • 1453.
  • 1454.
  • 1455.
  • 1456.
  • 1457.
  • 1458.
  • 1459.
  • 1460.
  • 1461.
  • 1462.
  • 1463.
  • 1464.
  • 1465.
  • 1466.
  • 1467.
  • 1468.
  • 1469.
  • 1470.
  • 1471.
  • 1472.
  • 1473.
  • 1474.
  • 1475.
  • 1476.
  • 1477.
  • 1478.
  • 1479.
  • 1480.
  • 1481.
  • 1482.
  • 1483.
  • 1484.
  • 1485.
  • 1486.
  • 1487.
  • 1488.
  • 1489.
  • 1490.
  • 1491.
  • 1492.
  • 1493.
  • 1494.
  • 1495.
  • 1496.
  • 1497.
  • 1498.
  • 1499.
  • 1500.
  • 1501.
  • 1502.
  • 1503.
  • 1504.
  • 1505.
  • 1506.
  • 1507.
  • 1508.
  • 1509.
  • 1510.
  • 1511.
  • 1512.
  • 1513.
  • 1514.
  • 1515.
  • 1516.
  • 1517.
  • 1518.
  • 1519.
  • 1520.
  • 1521.
  • 1522.
  • 1523.
  • 1524.
  • 1525.
  • 1526.
  • 1527.
  • 1528.
  • 1529.
  • 1530.
  • 1531.
  • 1532.
  • 1533.
  • 1534.
  • 1535.
  • 1536.
  • 1537.
  • 1538.
  • 1539.
  • 1540.
  • 1541.
  • 1542.
  • 1543.
  • 1544.
  • 1545.
  • 1546.
  • 1547.
  • 1548.
  • 1549.
  • 1550.
  • 1551.
  • 1552.
  • 1553.
  • 1554.
  • 1555.
  • 1556.
  • 1557.
  • 1558.
  • 1559.
  • 1560.
  • 1561.
  • 1562.
  • 1563.
  • 1564.
  • 1565.
  • 1566.
  • 1567.
  • 1568.
  • 1569.
  • 1570.
  • 1571.
  • 1572.
  • 1573.
  • 1574.
  • 1575.
  • 1576.
  • 1577.
  • 1578.
  • 1579.
  • 1580.
  • 1581.
  • 1582.
  • 1583.
  • 1584.
  • 1585.
  • 1586.
  • 1587.
  • 1588.
  • 1589.
  • 1590.
  • 1591.
  • 1592.
  • 1593.
  • 1594.
  • 1595.
  • 1596.
  • 1597.
  • 1598.
  • 1599.
  • 1600.
  • 1601.
  • 1602.
  • 1603.
  • 1604.
  • 1605.
  • 1606.
  • 1607.
  • 1608.
  • 1609.
  • 1610.
  • 1611.
  • 1612.
  • 1613.
  • 1614.
  • 1615.
  • 1616.
  • 1617.
  • 1618.
  • 1619.
  • 1620.
  • 1621.
  • 1622.
  • 1623.
  • 1624.
  • 1625.
  • 1626.
  • 1627.
  • 1628.
  • 1629.
  • 1630.
  • 1631.
  • 1632.
  • 1633.
  • 1634.
  • 1635.
  • 1636.
  • 1637.
  • 1638.
  • 1639.
  • 1640.
  • 1641.
  • 1642.
  • 1643.
  • 1644.
  • 1645.
  • 1646.
  • 1647.
  • 1648.
  • 1649.
  • 1650.
  • 1651.
  • 1652.
  • 1653.
  • 1654.
  • 1655.
  • 1656.
  • 1657.
  • 1658.
  • 1659.
  • 1660.
  • 1661.
  • 1662.
  • 1663.
  • 1664.
  • 1665.
  • 1666.
  • 1667.
  • 1668.
  • 1669.
  • 1670.
  • 1671.
  • 1672.
  • 1673.
  • 1674.
  • 1675.
  • 1676.
  • 1677.
  • 1678.
  • 1679.
  • 1680.
  • 1681.
  • 1682.
  • 1683.
  • 1684.
  • 1685.
  • 1686.
  • 1687.
  • 1688.
  • 1689.
  • 1690.
  • 1691.
  • 1692.
  • 1693.
  • 1694.
  • 1695.
  • 1696.
  • 1697.
  • 1698.
  • 1699.
  • 1700.
  • 1701.
  • 1702.
  • 1703.
  • 1704.
  • 1705.
  • 1706.
  • 1707.
  • 1708.
  • 1709.
  • 1710.
  • 1711.
  • 1712.
  • 1713.
  • 1714.
  • 1715.
  • 1716.
  • 1717.
  • 1718.
  • 1719.
  • 1720.
  • 1721.
  • 1722.
  • 1723.
  • 1724.
  • 1725.
  • 1726.
  • 1727.
  • 1728.
  • 1729.
  • 1730.
  • 1731.
  • 1732.
  • 1733.
  • 1734.
  • 1735.
  • 1736.
  • 1737.
  • 1738.
  • 1739.
  • 1740.
  • 1741.
  • 1742.
  • 1743.
  • 1744.
  • 1745.
  • 1746.
  • 1747.
  • 1748.
  • 1749.
  • 1750.
  • 1751.
  • 1752.
  • 1753.
  • 1754.
  • 1755.
  • 1756.
  • 1757.
  • 1758.
  • 1759.
  • 1760.
  • 1761.
  • 1762.
  • 1763.
  • 1764.
  • 1765.
  • 1766.
  • 1767.
  • 1768.
  • 1769.
  • 1770.
  • 1771.
  • 1772.
  • 1773.
  • 1774.
  • 1775.
  • 1776.
  • 1777.
  • 1778.
  • 1779.
  • 1780.
  • 1781.
  • 1782.
  • 1783.
  • 1784.
  • 1785.
  • 1786.
  • 1787.
  • 1788.
  • 1789.
  • 1790.
  • 1791.
  • 1792.
  • 1793.
  • 1794.
  • 1795.
  • 1796.
  • 1797.
  • 1798.
  • 1799.
  • 1800.
  • 1801.
  • 1802.
  • 1803.
  • 1804.
  • 1805.
  • 1806.
  • 1807.
  • 1808.
  • 1809.
  • 1810.
  • 1811.
  • 1812.
  • 1813.
  • 1814.
  • 1815.
  • 1816.
  • 1817.
  • 1818.
  • 1819.
  • 1820.
  • 1821.
  • 1822.
  • 1823.
  • 1824.
  • 1825.
  • 1826.
  • 1827.
  • 1828.
  • 1829.
  • 1830.
  • 1831.
  • 1832.
  • 1833.
  • 1834.
  • 1835.
  • 1836.
  • 1837.
  • 1838.
  • 1839.
  • 1840.
  • 1841.
  • 1842.
  • 1843.
  • 1844.
  • 1845.
  • 1846.
  • 1847.
  • 1848.
  • 1849.
  • 1850.
  • 1851.
  • 1852.
  • 1853.
  • 1854.
  • 1855.
  • 1856.
  • 1857.
  • 1858.
  • 1859.
  • 1860.
  • 1861.
  • 1862.
  • 1863.
  • 1864.
  • 1865.
  • 1866.
  • 1867.
  • 1868.
  • 1869.
  • 1870.
  • 1871.
  • 1872.
  • 1873.
  • 1874.
  • 1875.
  • 1876.
  • 1877.
  • 1878.
  • 1879.
  • 1880.
  • 1881.
  • 1882.
  • 1883.
  • 1884.
  • 1885.
  • 1886.
  • 1887.
  • 1888.
  • 1889.
  • 1890.
  • 1891.
  • 1892.
  • 1893.
  • 1894.
  • 1895.
  • 1896.
  • 1897.
  • 1898.
  • 1899.
  • 1900.
  • 1901.
  • 1902.
  • 1903.
  • 1904.
  • 1905.
  • 1906.
  • 1907.
  • 1908.
  • 1909.
  • 1910.
  • 1911.
  • 1912.
  • 1913.
  • 1914.
  • 1915.
  • 1916.
  • 1917.
  • 1918.
  • 1919.
  • 1920.
  • 1921.
  • 1922.
  • 1923.
  • 1924.
  • 1925.
  • 1926.
  • 1927.
  • 1928.
  • 1929.
  • 1930.
  • 1931.
  • 1932.
  • 1933.
  • 1934.
  • 1935.
  • 1936.
  • 1937.
  • 1938.
  • 1939.
  • 1940.
  • 1941.
  • 1942.
  • 1943.
  • 1944.
  • 1945.
  • 1946.
  • 1947.
  • 1948.
  • 1949.
  • 1950.
  • 1951.
  • 1952.
  • 1953.
  • 1954.
  • 1955.
  • 1956.
  • 1957.
  • 1958.
  • 1959.
  • 1960.
  • 1961.
  • 1962.
  • 1963.
  • 1964.
  • 1965.
  • 1966.
  • 1967.
  • 1968.
  • 1969.
  • 1970.
  • 1971.
  • 1972.
  • 1973.
  • 1974.
  • 1975.
  • 1976.
  • 1977.
  • 1978.
  • 1979.
  • 1980.
  • 1981.
  • 1982.
  • 1983.
  • 1984.
  • 1985.
  • 1986.
  • 1987.
  • 1988.
  • 1989.
  • 1990.
  • 1991.
  • 1992.
  • 1993.
  • 1994.
  • 1995.
  • 1996.
  • 1997.
  • 1998.
  • 1999.
  • 2000.
  • 2001.
  • 2002.
  • 2003.
  • 2004.
  • 2005.
  • 2006.
  • 2007.
  • 2008.
  • 2009.
  • 2010.
  • 2011.
  • 2012.
  • 2013.
  • 2014.
  • 2015.
  • 2016.
  • 2017.
  • 2018.
  • 2019.
  • 2020.
  • 2021.
  • 2022.
  • 2023.
  • 2024.
  • 2025.
  • 2026.
  • 2027.
  • 2028.
  • 2029.
  • 2030.
  • 2031.
  • 2032.
  • 2033.
  • 2034.
  • 2035.
  • 2036.
  • 2037.
  • 2038.
  • 2039.
  • 2040.
  • 2041.
  • 2042.
  • 2043.
  • 2044.
  • 2045.
  • 2046.
  • 2047.
  • 2048.
  • 2049.
  • 2050.
  • 2051.
  • 2052.
  • 2053.
  • 2054.
  • 2055.
  • 2056.
  • 2057.
  • 2058.
  • 2059.
  • 2060.
  • 2061.
  • 2062.
  • 2063.
  • 2064.
  • 2065.
  • 2066.
  • 2067.
  • 2068.
  • 2069.
  • 2070.
  • 2071.
  • 2072.
  • 2073.
  • 2074.
  • 2075.
  • 2076.
  • 2077.
  • 2078.
  • 2079.
  • 2080.
  • 2081.
  • 2082.
  • 2083.
  • 2084.
  • 2085.
  • 2086.
  • 2087.
  • 2088.
  • 2089.
  • 2090.
  • 2091.
  • 2092.
  • 2093.
  • 2094.
  • 2095.
  • 2096.
  • 2097.
  • 2098.
  • 2099.
  • 2100.
  • 2101.
  • 2102.
  • 2103.
  • 2104.
  • 2105.
  • 2106.
  • 2107.
  • 2108.
  • 2109.
  • 2110.
  • 2111.
  • 2112.
  • 2113.
  • 2114.
  • 2115.
  • 2116.
  • 2117.
  • 2118.
  • 2119.
  • 2120.
  • 2121.
  • 2122.
  • 2123.
  • 2124.
  • 2125.
  • 2126.
  • 2127.
  • 2128.
  • 2129.
  • 2130.
  • 2131.
  • 2132.
  • 2133.
  • 2134.
  • 2135.
  • 2136.
  • 2137.
  • 2138.
  • 2139.
  • 2140.
  • 2141.
  • 2142.
  • 2143.
  • 2144.
  • 2145.
  • 2146.
  • 2147.
  • 2148.
  • 2149.
  • 2150.
  • 2151.
  • 2152.
  • 2153.
  • 2154.
  • 2155.
  • 2156.
  • 2157.
  • 2158.
  • 2159.
  • 2160.
  • 2161.
  • 2162.
  • 2163.
  • 2164.
  • 2165.
  • 2166.
  • 2167.
  • 2168.
  • 2169.
  • 2170.
  • 2171.
  • 2172.
  • 2173.
  • 2174.
  • 2175.
  • 2176.
  • 2177.
  • 2178.
  • 2179.
  • 2180.
  • 2181.
  • 2182.
  • 2183.
  • 2184.
  • 2185.
  • 2186.
  • 2187.
  • 2188.
  • 2189.
  • 2190.
  • 2191.
  • 2192.
  • 2193.
  • 2194.
  • 2195.
  • 2196.
  • 2197.
  • 2198.
  • 2199.
  • 2200.
  • 2201.
  • 2202.
  • 2203.
  • 2204.
  • 2205.
  • 2206.
  • 2207.
  • 2208.
  • 2209.
  • 2210.
  • 2211.
  • 2212.
  • 2213.
  • 2214.
  • 2215.
  • 2216.
  • 2217.
  • 2218.
  • 2219.
  • 2220.
  • 2221.
  • 2222.
  • 2223.
  • 2224.
  • 2225.
  • 2226.
  • 2227.
  • 2228.
  • 2229.
  • 2230.
  • 2231.
  • 2232.
  • 2233.
  • 2234.
  • 2235.
  • 2236.
  • 2237.
  • 2238.
  • 2239.
  • 2240.
  • 2241.
  • 2242.
  • 2243.
  • 2244.
  • 2245.
  • 2246.
  • 2247.
  • 2248.
  • 2249.
  • 2250.
  • 2251.
  • 2252.
  • 2253.
  • 2254.
  • 2255.
  • 2256.
  • 2257.
  • 2258.
  • 2259.
  • 2260.
  • 2261.
  • 2262.
  • 2263.
  • 2264.
  • 2265.
  • 2266.
  • 2267.
  • 2268.
  • 2269.
  • 2270.
  • 2271.
  • 2272.
  • 2273.
  • 2274.
  • 2275.
  • 2276.
  • 2277.
  • 2278.
  • 2279.
  • 2280.
  • 2281.
  • 2282.
  • 2283.
  • 2284.
  • 2285.
  • 2286.
  • 2287.
  • 2288.
  • 2289.
  • 2290.
  • 2291.
  • 2292.
  • 2293.
  • 2294.
  • 2295.
  • 2296.
  • 2297.
  • 2298.
  • 2299.
  • 2300.
  • 2301.
  • 2302.
  • 2303.
  • 2304.
  • 2305.
  • 2306.
  • 2307.
  • 2308.
  • 2309.
  • 2310.
  • 2311.
  • 2312.
  • 2313.
  • 2314.
  • 2315.
  • 2316.
  • 2317.
  • 2318.
  • 2319.
  • 2320.
  • 2321.
  • 2322.
  • 2323.
  • 2324.
  • 2325.
  • 2326.
  • 2327.
  • 2328.
  • 2329.
  • 2330.
  • 2331.
  • 2332.
  • 2333.
  • 2334.
  • 2335.
  • 2336.
  • 2337.
  • 2338.
  • 2339.
  • 2340.
  • 2341.
  • 2342.
  • 2343.
  • 2344.
  • 2345.
  • 2346.
  • 2347.
  • 2348.
  • 2349.
  • 2350.
  • 2351.
  • 2352.
  • 2353.
  • 2354.
  • 2355.
  • 2356.
  • 2357.
  • 2358.
  • 2359.
  • 2360.
  • 2361.
  • 2362.
  • 2363.
  • 2364.
  • 2365.
  • 2366.
  • 2367.
  • 2368.
  • 2369.
  • 2370.
  • 2371.
  • 2372.
  • 2373.
  • 2374.
  • 2375.
  • 2376.
  • 2377.
  • 2378.
  • 2379.
  • 2380.
  • 2381.
  • 2382.
  • 2383.
  • 2384.
  • 2385.
  • 2386.
  • 2387.
  • 2388.
  • 2389.
  • 2390.
  • 2391.
  • 2392.
  • 2393.
  • 2394.
  • 2395.
  • 2396.
  • 2397.
  • 2398.
  • 2399.
  • 2400.
  • 2401.
  • 2402.
  • 2403.
  • 2404.
  • 2405.
  • 2406.
  • 2407.
  • 2408.
  • 2409.
  • 2410.
  • 2411.
  • 2412.
  • 2413.
  • 2414.
  • 2415.
  • 2416.
  • 2417.
  • 2418.
  • 2419.
  • 2420.
  • 2421.
  • 2422.
  • 2423.
  • 2424.
  • 2425.
  • 2426.
  • 2427.
  • 2428.
  • 2429.
  • 2430.
  • 2431.
  • 2432.
  • 2433.
  • 2434.
  • 2435.
  • 2436.
  • 2437.
  • 2438.
  • 2439.
  • 2440.
  • 2441.
  • 2442.
  • 2443.
  • 2444.
  • 2445.
  • 2446.
  • 2447.
  • 2448.
  • 2449.
  • 2450.
  • 2451.
  • 2452.
  • 2453.
  • 2454.
  • 2455.
  • 2456.
  • 2457.
  • 2458.
  • 2459.
  • 2460.
  • 2461.
  • 2462.
  • 2463.
  • 2464.
  • 2465.
  • 2466.
  • 2467.
  • 2468.
  • 2469.
  • 2470.
  • 2471.
  • 2472.
  • 2473.
  • 2474.
  • 2475.
  • 2476.
  • 2477.
  • 2478.
  • 2479.
  • 2480.
  • 2481.
  • 2482.
  • 2483.
  • 2484.
  • 2485.
  • 2486.
  • 2487.
  • 2488.
  • 2489.
  • 2490.
  • 2491.
  • 2492.
  • 2493.
  • 2494.
  • 2495.
  • 2496.
  • 2497.
  • 2498.
  • 2499.
  • 2500.
  • 2501.
  • 2502.
  • 2503.
  • 2504.
  • 2505.
  • 2506.
  • 2507.
  • 2508.
  • 2509.
  • 2510.
  • 2511.
  • 2512.
  • 2513.
  • 2514.
  • 2515.
  • 2516.
  • 2517.
  • 2518.
  • 2519.
  • 2520.
  • 2521.
  • 2522.
  • 2523.
  • 2524.
  • 2525.
  • 2526.
  • 2527.
  • 2528.
  • 2529.
  • 2530.
  • 2531.
  • 2532.
  • 2533.
  • 2534.
  • 2535.
  • 2536.
  • 2537.
  • 2538.
  • 2539.
  • 2540.
  • 2541.
  • 2542.
  • 2543.
  • 2544.
  • 2545.
  • 2546.
  • 2547.
  • 2548.
  • 2549.
  • 2550.
  • 2551.
  • 2552.
  • 2553.
  • 2554.
  • 2555.
  • 2556.
  • 2557.
  • 2558.
  • 2559.
  • 2560.
  • 2561.
  • 2562.
  • 2563.
  • 2564.
  • 2565.
  • 2566.
  • 2567.
  • 2568.
  • 2569.
  • 2570.
  • 2571.
  • 2572.
  • 2573.
  • 2574.
  • 2575.
  • 2576.
  • 2577.
  • 2578.
  • 2579.
  • 2580.
  • 2581.
  • 2582.
  • 2583.
  • 2584.
  • 2585.
  • 2586.
  • 2587.
  • 2588.
  • 2589.
  • 2590.
  • 2591.
  • 2592.
  • 2593.
  • 2594.
  • 2595.
  • 2596.
  • 2597.
  • 2598.
  • 2599.
  • 2600.
  • 2601.
  • 2602.
  • 2603.
  • 2604.
  • 2605.
  • 2606.
  • 2607.
  • 2608.
  • 2609.
  • 2610.
  • 2611.
  • 2612.
  • 2613.
  • 2614.
  • 2615.
  • 2616.
  • 2617.
  • 2618.
  • 2619.
  • 2620.
  • 2621.
  • 2622.
  • 2623.
  • 2624.
  • 2625.
  • 2626.
  • 2627.
  • 2628.
  • 2629.
  • 2630.
  • 2631.
  • 2632.
  • 2633.
  • 2634.
  • 2635.
  • 2636.
  • 2637.
  • 2638.
  • 2639.
  • 2640.
  • 2641.
  • 2642.
  • 2643.
  • 2644.
  • 2645.
  • 2646.
  • 2647.
  • 2648.
  • 2649.
  • 2650.
  • 2651.
  • 2652.
  • 2653.
  • 2654.
  • 2655.
  • 2656.
  • 2657.
  • 2658.
  • 2659.
  • 2660.
  • 2661.
  • 2662.
  • 2663.
  • 2664.
  • 2665.
  • 2666.
  • 2667.
  • 2668.
  • 2669.
  • 2670.
  • 2671.
  • 2672.
  • 2673.
  • 2674.
  • 2675.
  • 2676.
  • 2677.
  • 2678.
  • 2679.
  • 2680.
  • 2681.
  • 2682.
  • 2683.
  • 2684.
  • 2685.
  • 2686.
  • 2687.
  • 2688.
  • 2689.
  • 2690.
  • 2691.
  • 2692.
  • 2693.
  • 2694.
  • 2695.
  • 2696.
  • 2697.
  • 2698.
  • 2699.
  • 2700.
  • 2701.
  • 2702.
  • 2703.
  • 2704.
  • 2705.
  • 2706.
  • 2707.
  • 2708.
  • 2709.
  • 2710.
  • 2711.
  • 2712.
  • 2713.
  • 2714.
  • 2715.
  • 2716.
  • 2717.
  • 2718.
  • 2719.
  • 2720.
  • 2721.
  • 2722.
  • 2723.
  • 2724.
  • 2725.
  • 2726.
  • 2727.
  • 2728.
  • 2729.
  • 2730.
  • 2731.
  • 2732.
  • 2733.
  • 2734.
  • 2735.
  • 2736.
  • 2737.
  • 2738.
  • 2739.
  • 2740.
  • 2741.
  • 2742.
  • 2743.
  • 2744.
  • 2745.
  • 2746.
  • 2747.
  • 2748.
  • 2749.
  • 2750.
  • 2751.
  • 2752.
  • 2753.
  • 2754.
  • 2755.
  • 2756.
  • 2757.
  • 2758.
  • 2759.
  • 2760.
  • 2761.
  • 2762.
  • 2763.
  • 2764.
  • 2765.
  • 2766.
  • 2767.
  • 2768.
  • 2769.
  • 2770.
  • 2771.
  • 2772.
  • 2773.
  • 2774.
  • 2775.
  • 2776.
  • 2777.
  • 2778.
  • 2779.
  • 2780.
  • 2781.
  • 2782.
  • 2783.
  • 2784.
  • 2785.
  • 2786.
  • 2787.
  • 2788.
  • 2789.
  • 2790.
  • 2791.
  • 2792.
  • 2793.
  • 2794.
  • 2795.
  • 2796.
  • 2797.
  • 2798.
  • 2799.
  • 2800.
  • 2801.
  • 2802.
  • 2803.
  • 2804.
  • 2805.
  • 2806.
  • 2807.
  • 2808.
  • 2809.
  • 2810.
  • 2811.
  • 2812.
  • 2813.
  • 2814.
  • 2815.
  • 2816.
  • 2817.
  • 2818.
  • 2819.
  • 2820.
  • 2821.
  • 2822.
  • 2823.
  • 2824.
  • 2825.
  • 2826.
  • 2827.
  • 2828.
  • 2829.
  • 2830.
  • 2831.
  • 2832.
  • 2833.
  • 2834.
  • 2835.
  • 2836.
  • 2837.
  • 2838.
  • 2839.
  • 2840.
  • 2841.
  • 2842.
  • 2843.
  • 2844.
  • 2845.
  • 2846.
  • 2847.
  • 2848.
  • 2849.
  • 2850.
  • 2851.
  • 2852.
  • 2853.
  • 2854.
  • 2855.
  • 2856.
  • 2857.
  • 2858.
  • 2859.
  • 2860.
  • 2861.
  • 2862.
  • 2863.
  • 2864.
  • 2865.
  • 2866.
  • 2867.
  • 2868.
  • 2869.
  • 2870.
  • 2871.
  • 2872.
  • 2873.
  • 2874.
  • 2875.
  • 2876.
  • 2877.
  • 2878.
  • 2879.
  • 2880.
  • 2881.
  • 2882.
  • 2883.
  • 2884.
  • 2885.
  • 2886.
  • 2887.
  • 2888.
  • 2889.
  • 2890.
  • 2891.
  • 2892.
  • 2893.
  • 2894.
  • 2895.
  • 2896.
  • 2897.
  • 2898.
  • 2899.
  • 2900.
  • 2901.
  • 2902.
  • 2903.
  • 2904.
  • 2905.
  • 2906.
  • 2907.
  • 2908.
  • 2909.
  • 2910.
  • 2911.
  • 2912.
  • 2913.
  • 2914.
  • 2915.
  • 2916.
  • 2917.
  • 2918.
  • 2919.
  • 2920.
  • 2921.
  • 2922.
  • 2923.
  • 2924.
  • 2925.
  • 2926.
  • 2927.
  • 2928.
  • 2929.
  • 2930.
  • 2931.
  • 2932.
  • 2933.
  • 2934.
  • 2935.
  • 2936.
  • 2937.
  • 2938.
  • 2939.
  • 2940.
  • 2941.
  • 2942.
  • 2943.
  • 2944.
  • 2945.
  • 2946.
  • 2947.
  • 2948.
  • 2949.
  • 2950.
  • 2951.
  • 2952.
  • 2953.
  • 2954.
  • 2955.
  • 2956.
  • 2957.
  • 2958.
  • 2959.
  • 2960.
  • 2961.
  • 2962.
  • 2963.
  • 2964.
  • 2965.
  • 2966.
  • 2967.
  • 2968.
  • 2969.
  • 2970.
  • 2971.
  • 2972.
  • 2973.
  • 2974.
  • 2975.
  • 2976.
  • 2977.
  • 2978.
  • 2979.
  • 2980.
  • 2981.
  • 2982.
  • 2983.
  • 2984.
  • 2985.
  • 2986.
  • 2987.
  • 2988.
  • 2989.
  • 2990.
  • 2991.
  • 2992.
  • 2993.
  • 2994.
  • 2995.
  • 2996.
  • 2997.
  • 2998.
  • 2999.
  • 3000.
  • 3001.
  • 3002.
  • 3003.
  • 3004.
  • 3005.
  • 3006.
  • 3007.
  • 3008.
  • 3009.
  • 3010.
  • 3011.
  • 3012.
  • 3013.
  • 3014.
  • 3015.
  • 3016.
  • 3017.
  • 3018.
  • 3019.
  • 3020.
  • 3021.
  • 3022.
  • 3023.
  • 3024.
  • 3025.
  • 3026.
  • 3027.
  • 3028.
  • 3029.
  • 3030.
  • 3031.
  • 3032.
  • 3033.
  • 3034.
  • 3035.
  • 3036.
  • 3037.
  • 3038.
  • 3039.
  • 3040.
  • 3041.
  • 3042.
  • 3043.
  • 3044.
  • 3045.
  • 3046.
  • 3047.
  • 3048.
  • 3049.
  • 3050.
  • 3051.
  • 3052.
  • 3053.
  • 3054.
  • 3055.
  • 3056.
  • 3057.
  • 3058.
  • 3059.
  • 3060.
  • 3061.
  • 3062.
  • 3063.
  • 3064.
  • 3065.
  • 3066.
  • 3067.
  • 3068.
  • 3069.
  • 3070.
  • 3071.
  • 3072.
  • 3073.
  • 3074.
  • 3075.
  • 3076.
  • 3077.
  • 3078.
  • 3079.
  • 3080.
  • 3081.
  • 3082.
  • 3083.
  • 3084.
  • 3085.
  • 3086.
  • 3087.
  • 3088.
  • 3089.
  • 3090.
  • 3091.
  • 3092.
  • 3093.
  • 3094.
  • 3095.
  • 3096.
  • 3097.
  • 3098.
  • 3099.
  • 3100.
  • 3101.
  • 3102.
  • 3103.
  • 3104.
  • 3105.
  • 3106.
  • 3107.
  • 3108.
  • 3109.
  • 3110.
  • 3111.
  • 3112.
  • 3113.
  • 3114.
  • 3115.
  • 3116.
  • 3117.
  • 3118.
  • 3119.
  • 3120.
  • 3121.
  • 3122.
  • 3123.
  • 3124.
  • 3125.
  • 3126.
  • 3127.
  • 3128.
  • 3129.
  • 3130.
  • 3131.
  • 3132.
  • 3133.
  • 3134.
  • 3135.
  • 3136.
  • 3137.
  • 3138.
  • 3139.
  • 3140.
  • 3141.
  • 3142.
  • 3143.
  • 3144.
  • 3145.
  • 3146.
  • 3147.
  • 3148.
  • 3149.
  • 3150.
  • 3151.
  • 3152.
  • 3153.
  • 3154.
  • 3155.
  • 3156.
  • 3157.
  • 3158.
  • 3159.
  • 3160.
  • 3161.
  • 3162.
  • 3163.
  • 3164.
  • 3165.
  • 3166.
  • 3167.
  • 3168.
  • 3169.
  • 3170.
  • 3171.
  • 3172.
  • 3173.
  • 3174.
  • 3175.
  • 3176.
  • 3177.
  • 3178.
  • 3179.
  • 3180.
  • 3181.
  • 3182.
  • 3183.
  • 3184.
  • 3185.
  • 3186.
  • 3187.
  • 3188.
  • 3189.
  • 3190.
  • 3191.
  • 3192.
  • 3193.
  • 3194.
  • 3195.
  • 3196.
  • 3197.
  • 3198.
  • 3199.
  • 3200.
  • 3201.
  • 3202.
  • 3203.
  • 3204.
  • 3205.
  • 3206.
  • 3207.
  • 3208.
  • 3209.
  • 3210.
  • 3211.
  • 3212.
  • 3213.
  • 3214.
  • 3215.
  • 3216.
  • 3217.
  • 3218.
  • 3219.
  • 3220.
  • 3221.
  • 3222.
  • 3223.
  • 3224.
  • 3225.
  • 3226.
  • 3227.
  • 3228.
  • 3229.
  • 3230.
  • 3231.
  • 3232.
  • 3233.
  • 3234.
  • 3235.
  • 3236.
  • 3237.
  • 3238.
  • 3239.
  • 3240.
  • 3241.
  • 3242.
  • 3243.
  • 3244.
  • 3245.
  • 3246.
  • 3247.
  • 3248.
  • 3249.
  • 3250.
  • 3251.
  • 3252.
  • 3253.
  • 3254.
  • 3255.
  • 3256.
  • 3257.
  • 3258.
  • 3259.
  • 3260.
  • 3261.
  • 3262.
  • 3263.
  • 3264.
  • 3265.
  • 3266.
  • 3267.
  • 3268.
  • 3269.
  • 3270.
  • 3271.
  • 3272.
  • 3273.
  • 3274.
  • 3275.
  • 3276.
  • 3277.
  • 3278.
  • 3279.
  • 3280.
  • 3281.
  • 3282.
  • 3283.
  • 3284.
  • 3285.
  • 3286.
  • 3287.
  • 3288.
  • 3289.
  • 3290.
  • 3291.
  • 3292.
  • 3293.
  • 3294.
  • 3295.
  • 3296.
  • 3297.
  • 3298.
  • 3299.
  • 3300.
  • 3301.
  • 3302.
  • 3303.
  • 3304.
  • 3305.
  • 3306.
  • 3307.
  • 3308.
  • 3309.
  • 3310.
  • 3311.
  • 3312.
  • 3313.
  • 3314.
  • 3315.
  • 3316.
  • 3317.
  • 3318.
  • 3319.
  • 3320.
  • 3321.
  • 3322.
  • 3323.
  • 3324.
  • 3325.
  • 3326.
  • 3327.
  • 3328.

结果:

#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


 

#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


 

#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


 

#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


 

#冲刺创作新星#PIE-engine APP 教程 ——太湖生态环境智能监测-鸿蒙开发者社区


 

 


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-9-27 15:24:29修改
2
收藏
回复
举报
2


回复
    相关推荐