#冲刺创作新星#基于PIE-Engine的水体频率变化遥感监测自动 原创

此星光明
发布于 2022-9-26 21:02
浏览
0收藏


 本次app是一个水体变化频率的变化监测,这个UI界面的设计中首先是标题,然后就是区域水体变化及监测的范围和时间选择,以及我们所选择监测的指数,NDWI,ADWI,MNDWI,随机森林的结果。这里面有一个非常大的限制,虽然再APP中有注释,注:虽然随机森林的提取最好,但是运算量大,计算时间长,可能会报错,请用户合理选择,但是选择其它指数的计算依旧无法现象。这里的归一化植被指数的函数,以及其它的结果:

normalizedDifference(bandNames)

指定两个特定波段,计算(Band1-Band2)/(Band1+Band2)的值。

方法参数:

- image(Image)

Image实例。

- bandNames(List)

Image的波段名称列表,包含两个元素。

返回值:像素值类型为布尔值的Image对象。

ui.Panel(widgets,layout,style)

容器组件。

方法参数:

- ui(ui)

调用者:ui对象。

- widgets(List)

组件列表

- layout(Object)

容器布局

- style(Object)

组件样式

返回值:ui.Panel

ui.root.add(widget)

添加组件。

方法参数:

- ui(ui)

调用者:ui对象。

- widget(String)

UI组件实例。

返回值:ui.root

代码:

/**
 * @Name    :   基于PIE-Engine的水体频率变化长时序遥感监测自动计算平台
 * @Time    :   2021/06/30
 * @Author  :   中国地质大学(武汉)水体频率小组
 * @Desc    :   -2基于水体频率的水体类别变化检测及面积对比
 * @Source

//设定变量
var layerKey = null;
var roiKey = null;
var selectStartYear = "2016"; //选择开始年份
var selectEndYear = "2020"; //选择结束年份
var selectLBp1 = "114.338";
var selectLBp2 = "30.517";
var selectRTp1 = "114.469";
var selectRTp2 = "30.604"; //自定义感兴趣区域
var selectway = "NDWI"; //选择方法

//获取研究区域
function getROI(x1, y1, x2, y2) {
    var s1 = parseFloat(x1);
    var s2 = parseFloat(y1);
    var p1 = parseFloat(x2);
    var p2 = parseFloat(y2);
    // 研究区
    var roi = pie.Geometry.Rectangle([
        [s1, s2],
        [p1, p2]
    ], null);
    Map.centerObject(roi, 10);
    Map.addLayer(roi, { color: "#ff0000", fillColor: "#00000000" }, "roi", true);
    return roi;
}
//计算NDWI
function NDWI(image) {
    var ndwi = image.normalizedDifference(['B3', 'B5'])
    var label = ndwi.gt(0).rename("Label");
    return label;
}
//计算AWEI
function AWEI(image) {
    var awei = image.select(["B2", "B3", "B5", "B6", "B7"]).expression(
        'B2+2.5*B3-1.5*(B5+B6)-0.25*B7', {
            B2: image.select("B2"),
            B3: image.select("B3"),
            B5: image.select("B5"),
            B6: image.select("B6"),
            B7: image.select("B7"),
        }).rename('AWEI');
    return awei.gt(0);
};
//计算MNDWI
function MNDWI(image) {
    var mndwi = image.normalizedDifference(['B3', 'B6']).gt(0).rename('mNDWI');
    return mndwi;
}

//训练样本波段范围0-5000,LC08/02/SR数据集范围0-50000,除以10处理
function divide10(image) {
    return imgd10 = image.divide(10);
}
///////////////////////////////////////////////机器学习分类水体/////////////////////////////////////////
//加载机器学习的样本点和预测波段以及随机森林
function Machinelearning(images) {
    // 添加训练样本
    var TrainingPoints = pie.FeatureCollection('user/pieadmin/ALLALL');
    // 预测使用的波段
    var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'NDVI', 'mNDWI', 'AWEI'];
    // 分类标签
    var label = 'waterclass';
    // 随机森林
    var classifer = pie.Classifier.rTrees().train(TrainingPoints, label, bands);
//水体指数的波段添加,然后分别然给影像都进行一次,
    function water_index(img) {
        var image = img.select(["B2", "B3", "B4", "B5", "B6", "B7"]);
        var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
        var mndwi = image.normalizedDifference(['B3', 'B6']).rename('mNDWI');
        var awei = image.select(["B2", "B3", "B5", "B6", "B7"]).expression(
            'B2+2.5*B3-1.5*(B5+B6)-0.25*B7', {
                B2: image.select("B2"),
                B3: image.select("B3"),
                B5: image.select("B5"),
                B6: image.select("B6"),
                B7: image.select("B7"),
            }).rename('AWEI');
        return img.addBands(ndvi).addBands(mndwi).addBands(awei);
    }
    var image = images.map(water_index);
    var resultImage = image.map(function(image) {
        var Rfiamge = image.select(bands).classify(classifer);
        return Rfiamge;
    });
    return resultImage;
}

//去云
function maskL8sr(image) {
    var qa = image.select('QA_PIXEL');
    var mask = qa.bitwiseAnd(1 << 3).eq(0)
        .and(qa.bitwiseAnd(1 << 4).eq(0))
        .and(qa.bitwiseAnd(1 << 5).eq(0));
    return image.updateMask(mask);
}
//计算有效像元,这里随便选择一个波段就行了,因为所有的波段都进行了掩膜了
function validPixel(image) {
    return image.select('B2').gte(0);
};

// 计算水体频率
function Frequency(images, roi, selectway) {
    var pixel_validNumber = images.map(validPixel).sum().clip(roi);
    switch (selectway) {
        case "NDWI":
            var water_validNumber = images.map(NDWI).sum().clip(roi);
            break;
        case "AWEI":
            var water_validNumber = images.map(AWEI).sum().clip(roi);
            break;
        case "MNDWI":
            var water_validNumber = images.map(MNDWI).sum().clip(roi);
            break;
        case "随机森林":
            var water_validNumber = Machinelearning(images.map(divide10)).sum().clip(roi);
            break;
    }
    var waterFrequency = water_validNumber.divide(pixel_validNumber).rename('frequency');
    //获得永久性水体
    var PermanentWater = waterFrequency.gte(0.75).rename("waterclass");
    //获得季节性水体
    var mask1 = waterFrequency.gte(0.25);
    var mask2 = waterFrequency.lt(0.75);
    var SensonalWater = pie.ImageCollection.fromImages([mask1, mask2]).sum().eq(2).rename('waterclass');
    //获得陆地小于0.25的水频率
    var Land = waterFrequency.lt(0.25).rename("waterclass");
    //0-1值影像乘积操作    
    var PW = PermanentWater.multiply(4);
    var SW = SensonalWater.multiply(2);
    var LD = Land.multiply(1);
    //合成影像集
    var PSL = pie.ImageCollection.fromImages([PW, SW, LD]).sum().select('waterclass');
    return PSL;
}
//点击按钮所进行的
function clickBtn() {
    var roi = getROI(selectLBp1, selectLBp2, selectRTp1, selectRTp2);
    //获取影像集并进行预处理
    var imageC1 = pie.ImageCollection('LC08/02/SR')
        .filterBounds(roi)
        .filterDate(selectStartYear + "-01-01", selectEndYear + "-12-31")
        .select(["B2", "B3", "B4", "B5", "B6", "B7", "QA_PIXEL"])
        .filter(pie.Filter.lt('cloud_cover', 30))
        .map(maskL8sr);

    var imageC2 = pie.ImageCollection('LC08/02/SR')
        .filterBounds(roi)
        .filterDate(selectEndYear + "-01-01", selectEndYear + "-12-31")
        .select(["B2", "B3", "B4", "B5", "B6", "B7", "QA_PIXEL"])
        .filter(pie.Filter.lt('cloud_cover', 30))
        .map(maskL8sr);

    //得到开始年份和结束年份的图像并相减得出变化图像
    var frequency1 = Frequency(imageC1, roi, selectway);
    var frequency2 = Frequency(imageC2, roi, selectway);
    var change = frequency2.subtract(frequency1).rename("change");

    //获得开始年份和结束年份的水体类别0-1值图
    var PWC1 = frequency1.eq(4);
    var SWC1 = frequency1.eq(2);
    var Land1 = frequency1.eq(1);
    var PWC2 = frequency2.eq(4);
    var SWC2 = frequency2.eq(2);
    var Land2 = frequency2.eq(1);

    //计算面积
    function countArea(image) {
        var areaImage = image.updateMask(image).pixelArea().multiply(image);
        var waterarea = areaImage.reduceRegion(pie.Reducer.sum(), roi, 300);
        var image_area = image.set("Area", waterarea.get("constant"));
        return image_area;
    };
    var WaterClassImgs1 = [];
    var PWarea1 = countArea(PWC1);
    WaterClassImgs1.push(PWarea1);
    var SWarea1 = countArea(SWC1);
    WaterClassImgs1.push(SWarea1);
    var Landarea1 = countArea(Land1);
    WaterClassImgs1.push(Landarea1);
    var PWarea2 = countArea(PWC2);
    WaterClassImgs1.push(PWarea2);
    var SWarea2 = countArea(SWC2);
    WaterClassImgs1.push(SWarea2);
    var Landarea2 = countArea(Land2);
    WaterClassImgs1.push(Landarea2);
    var class_area1 = pie.ImageCollection().fromImages(WaterClassImgs1).reduceColumns(pie.Reducer.toList(), ['Area']);
    print(class_area1);

    //生成直方图
    class_area1.getInfo(function(datas) {
        var y1 = [];
        var dataList = datas.list;
        var y1 = dataList.Area;
        y1 = y1.map(area area / 1000000);
        var column_options = {
            title: '年尺度水体类别面积',
            legend: [selectStartYear, selectEndYear],
            xAxis: ['PermanentWater', 'SensonalWater', 'Land'],
            xAxisName: "类别 ",
            yAxisName: "平方公里",
            series: [
                [y1[0], y1[1], y1[2]],
                [y1[3], y1[4], y1[5]],
            ],
            chartType: "column",
        };
        ChartArray(column_options);
    });
    //变化图层显示样式
    var vischange = {
        opacity: 1,
        uniqueValue: '-3,-2,-1,0,1,2,3',
        palette: '0000FF,9400D3,00BFFF,FFFFFF,808000,FF0000,FF8C00'
    };
    Map.addLayer(change.select('change'), vischange, "Change", true);

    //图例
    var data = {
        title: "水体类别变化图例",
        colors: ["#0000FF", "#9400D3", "#00BFFF", "#FFFFFF", "#808000", "#FF0000", "#FF8C00"],
        labels: ["陆地→永久", "季节→永久", "陆地→季节", "不变", "季节→陆地", "永久→季节", "永久→陆地"],
        step: 1
    };
    var style = {
        right: "150px",
        bottom: "10px",
        height: "70px",
        width: "500px"
    };
    var legend = ui.Legend(data, style);
    Map.addUI(legend);
}

var label1 = ui.Label("基于PIE-engine的水体频率变化长时序遥感监测自动计算平台", { "font-size": "18px" });
var label2 = ui.Label("二、区域水体类别变化及检测(年尺度):", { "font-size": "17px" });
var label3 = ui.Label("请自定义用户感兴趣区,区域类型为矩形,输入坐标值:", { "font-size": "14px" });
var label4 = ui.Label("请输入开始年份和结束年份(2014—2020任选两年):", { "font-size": "14px" });
var label5 = ui.Label("请选择计算水体频率方法:", { "font-size": "14px" });
var label6 = ui.Label("注:虽然随机森林的提取最好,但是运算量大,计算时间长,可能会报错,请用户合理选择", { "font-size": "10px" });
var text1 = ui.Label("经度");
var text2 = ui.Label("纬度");

//选择研究区范围模块
var textBoxLB1 = ui.TextBox({
    placeholder: "(经度,如114.338)",
    value: selectLBp1,
    onChange: function(value) {
        selectLBp1 = value;
    },
    disabled: false
})
var textBoxLB2 = ui.TextBox({
    placeholder: "(纬度,如30.517)",
    value: selectLBp2,
    onChange: function(value) {
        selectLBp2 = value;
    },
    disabled: false
})
var selectLBName = ui.Label("左下角点坐标:", { "font-size": "14px" });
var selectRTName = ui.Label("右上角点坐标:", { "font-size": "14px" });
var textBoxRT1 = ui.TextBox({
    placeholder: "(经度,如114.469)",
    value: selectRTp1,
    onChange: function(value) {
        selectRTp1 = value;
    },
    disabled: false
})
var textBoxRT2 = ui.TextBox({
    placeholder: "(纬度,如30.604)",
    value: selectRTp2,
    onChange: function(value) {
        selectRTp2 = value;
    },
    disabled: false
})
var selectPanel1 = ui.Panel({
    widgets: [text1, textBoxLB1, text2, textBoxLB2],
    layout: ui.Layout.flow("horizontal")
});
var selectPanel3 = ui.Panel({
    widgets: [text1, textBoxRT1, text2, textBoxRT2],
    layout: ui.Layout.flow("horizontal")
});

//选择时间模块
var textBox2 = ui.TextBox({
    placeholder: "请输入开始年份(如2016)",
    value: selectStartYear,
    onChange: function(value) {
        selectStartYear = value;
    },
    disabled: false
})
var selectstartName = ui.Label("开始年份:", { "font-size": "14px" });
var selectStartPanel = ui.Panel({
    widgets: [selectstartName, textBox2],
    layout: ui.Layout.flow("horizontal")
});
var textBox3 = ui.TextBox({
    placeholder: "请输入结束年份(如2020)",
    value: selectEndYear,
    onChange: function(value) {
        selectEndYear = value;
    },
    disabled: false
})
var selectendName = ui.Label("结束年份:", { "font-size": "14px" });
var selectEndPanel = ui.Panel({
    widgets: [selectendName, textBox3],
    layout: ui.Layout.flow("horizontal")
});

//选择方法模块
var select1 = ui.Select({
    items: ['AWEI', 'NDWI', "MNDWI", "随机森林"],
    placeholder: "请选择",
    value: selectway,
    multiple: false,
    onChange: function(value) {
        selectway = value;
    }
})
var selectName = ui.Label("选择方法:", { "font-size": "14px" });
var selectPanel2 = ui.Panel({
    widgets: [selectName, select1],
    layout: ui.Layout.flow("horizontal")
});

//按钮
var btn = ui.Button({
    label: "开始",
    type: "success",
    onClick: clickBtn,
    style: { left: "150px" }
});

//界面
var panel = ui.Panel({
    widgets: [
        label1, label2, label3,
        selectLBName,
        selectPanel1,
        selectRTName,
        selectPanel3,
        label4,
        selectStartPanel,
        selectEndPanel,
        label5,
        selectPanel2,
        label6,
        btn
    ],
    style: {
        width: "350px",
        backgroundColor: "#fff"
    }
});
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.

#冲刺创作新星#基于PIE-Engine的水体频率变化遥感监测自动-鸿蒙开发者社区


 这个程序暂时无法执行的原因?服务繁忙,请稍后再试。

往期推荐:

​Google Earth Engine(GEE)——欧洲10米分辨率土地分类(21种分类)EUCROPMAP 2018数据​

​Nature(GEE_APP)全球潮汐可视化兼影像数据下载网站:Intertidal change​

​GEE:1992-2013年校正的夜间灯光数据集 (CCNL)​

​Google Earth Engine(GEE)——MODIS数据蒸散发数据北京市2001—2020年四季平均值案例分析​

​Google Earth Engine(GEE)——清华全球不透水层数据中国区域逐年下载​

​ALOS全球数字表面模型(DSM)30米重分类结果演示​

​Landsat 常见数据集问题汇总​


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报


回复
    相关推荐