#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价 原创

此星光明
发布于 2022-9-29 20:10
9815浏览
0收藏

房山区洪涝灾害风险评价这个可以说不是一个APP,要改进的话可以通过UI控件设定来在MAP上完成,剩余的其它部分都可以实现在,这里灾害风险评价时暴露性结果统计与展示、脆弱性结果统计与展示、危险性结果统计与展示以及洪涝灾害风险结果统计与展示。代码的整个流程主要是受埃希纳加载研究区和数据,然后对DEM、slope、降水强度等进行归一化处理,在这里的每一个归一化处理中,都会通过获取min和max然后通过归一化公式来获取。

处理完DEM然后处理影像数据,这里用的是Landsat 8数据,并计算FVC,地表产流能力 ,但后进行监督分类,并进行河网密度,加载土壤类型数据集,紧接着脆弱性计算,GDP的计算,到道路网的距离的计算,人口密度在计算晚以上的内容后就可以直接进行4个评价分析。

函数:

minMax()得到的结果时"B1_min","B1_max"的波段名称,这里就可以利用这个参数进行归一化处理

得到一个返回最大、最小值的统计器。

方法参数:

返回值:Reducer

reduceRegion(reducer,geometry,scale)

对特定区域的所有像素进行统计,返回结果为一个JSON对象;目前可完成最大、最小和求和统计计算。

方法参数:

- image(Image)

Image实例。

- reducer(Reducer)

统计类型,包括最大值、最小值和求和。

- geometry(Geometry)

统计区域范围。默认是影像第一个波段的范围。

- scale(Number)

统计采样比例。

返回值:Dictionary

代码:

/**
 * @Name    :   房山区洪涝灾害风险评价
 * @Author  :   首都师范大学云开发——“图”以致用组
 * @Source  :   航天宏图第四届 “航天宏图杯”PIE软件二次开发大赛云开发组二等奖获奖作品
 */

var studyArea = pie.FeatureCollection('user/pieadmin/CNUelites')
    .first()
    .geometry();
Map.addLayer(studyArea, { color: 'black', fillColor: '00000000' }, "roi");

//定位地图中心
Map.centerObject(studyArea, 11);

//加载SRTM30m数据
var SRTM = pie.ImageCollection('DEM/SRTM_30')
    .filterBounds(studyArea)
    .select("elevation")
    .mean()
    .clip(studyArea);
//DEM数据归一化
var srtm_band = SRTM.select('elevation')
var srtm_minmax = SRTM.reduceRegion(pie.Reducer.minMax(), studyArea, 1000);
srtm_minmax = pie.Dictionary(srtm_minmax);
var elevation_min = pie.Number(srtm_minmax.get("elevation_min"));
var elevation_max = pie.Number(srtm_minmax.get("elevation_max"));
var dem_result = pie.Image(elevation_max).subtract(srtm_band).divide(elevation_max.subtract(elevation_min));
var vis_DEM = {
    min:0,
    max:1,
    palette: ['#BF812D', '#DFC27D', '#F6E8C3', '#A1D99B', '#41AB5D']
};
Map.addLayer(dem_result, vis_DEM, "dem", false);

/***********************************************************************/
//Slope归一化//计算坡度
var Slope = pie.Terrain.slope(SRTM).rename("slope");
var slope_band = Slope.select('slope')
var slope_minmax = Slope.reduceRegion(pie.Reducer.minMax(), studyArea, 1000);
slope_minmax = pie.Dictionary(slope_minmax);
var slope_min = pie.Number(slope_minmax.get("slope_min"));
var slope_max = pie.Number(slope_minmax.get("slope_max"));
var slope_result = pie.Image(slope_max).subtract(slope_band).divide(slope_max.subtract(slope_min));
var vis_slope = {
    min:0,
    max:1,
    palette: ['#C7E9C0', '#F6E8C3', '#DFC27D', '#CD853F', '#BF812D']
};
Map.addLayer(slope_result, vis_slope, "slope", false);

/***********************************************************************/
// 降水强度
var precipitation = pie.ImageCollection('TPDC/CHINA_1KM_PRE_MONTH')
    .filterDate("2017-06-01", "2017-08-31")
    .select("B1")
    .mean()
    .clip(studyArea);
var pre_band = precipitation.select('B1')
var pre_value = precipitation.reduceRegion(pie.Reducer.minMax(), studyArea, 1000)
pre_value = pie.Dictionary(pre_value);
var pre_min = pie.Number(pre_value.get("B1_min"));
var pre_max = pie.Number(pre_value.get("B1_max"));
//计算公式 result = x-min/max-min
var pre_result = pre_band.subtract(pre_min).divide(pre_max.subtract(pre_min));
var vis_pre = {
    min:0,
    max:1,
    palette: ["#ADD8E6", "#87CEEB", "#87CEFA", "#6495ED", "#4169E1"]
};
Map.addLayer(pre_result, vis_pre, "pre", false);

/***********************************************************************/
//危险性计算
var danger = ((dem_result.multiply(0.332)).add(slope_result.multiply(0.308)))
    .add(pre_result.multiply(0.360))

//计算植被覆盖度,加载landsat8影像数据
var L8 = pie.ImageCollection("LC08/01/T1/LC08_123032_20170710")
    .filterBounds(studyArea)
    .select(["B5", "B4"])
    .filterDate("2017-6-1", "2017-10-1")
    .filter(pie.Filter.lt("cloudCover", 5))
    .first()
    .clip(studyArea);
var B4 = L8.select("B4");
var B5 = L8.select("B5");
var NDVI = (B5.subtract(B4)).divide(B5.add(B4)).rename("NDVI");

//计算FVC
var info = NDVI.reduceRegion(pie.Reducer.minMax(), studyArea, 1000)
info = pie.Dictionary(info);
var NDVI_min = pie.Number(info.get("NDVI_min"));
var NDVI_max = pie.Number(info.get("NDVI_max"));
var FVC = pie.Image(NDVI_max).subtract(NDVI).divide(NDVI_max.subtract(NDVI_min));

//加载FVC影像
var vis_fvc = {
    min:0, 
    max:1,
    palette: ['#006837', '#66BD63', '#FFCC33', '#D6604D', '#A50026']
};
Map.addLayer(FVC, vis_fvc, "FVC", false);

/***********************************************************************/
//地表产流能力
//加载landsat影像数据
var L8 = pie.ImageCollection("LC08/01/T1")
    .filterBounds(studyArea)
    .select(["B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1"])
    .filterDate("2017-6-1", "2017-11-1")
    .filter(pie.Filter.lt("cloudCover", 10))
    .median()
    .clip(studyArea);
//分类样本             
var featureCollection = pie.FeatureCollection('user/pieadmin/ROIpoint');
featureCollection = featureCollection.randomColumn('random');
//SVM监督分类
var sampleFeatureCollection = L8.sampleRegions(featureCollection, ["type", "random"], 50);
var sampleTrainingFeatures = sampleFeatureCollection.filter(pie.Filter.lte("random", 0.8));
var sampleTestingFeatures = sampleFeatureCollection.filter(pie.Filter.gt("random", 0.2));
var classifer = pie.Classifier.svm()
    .train(sampleTrainingFeatures, "type", ["B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1"]);
var resultImage = L8.classify(classifer, "GFclassify");
var classifer_result = resultImage.divide(1000);

/***********************************************************************/
//河网密度
var Rivernetwork_density = pie.Image('user/pieadmin/Den_river100')
    .select('B1')
    .clip(studyArea);
var vis_RND = {
    min:0,
    max:1,
    palette: ["#ADD8E6", "#87CEEB", "#87CEFA", "#6495ED", "#4169E1"]
};
var RND_band = Rivernetwork_density.select('B1');
var RND_minmax = Rivernetwork_density.reduceRegion(pie.Reducer.minMax(), studyArea, 30);
RND_minmax = pie.Dictionary(RND_minmax);
var RND_min = pie.Number(RND_minmax.get("B1_min"));
var RND_max = pie.Number(RND_minmax.get("B1_max"));
var RND_result = RND_band.subtract(RND_min).divide(RND_max.subtract(RND_min));
Map.addLayer(RND_result, vis_RND, "rnd", false);
/***********************************************************************/
//土壤类型
var Soiltype = pie.Image('user/pieadmin/soiltype')
    .select('B1')
    .clip(studyArea);

var vis_soil = {
    min:0,
    max:1,
    palette: ["#1A9850", "#66BD63", "#A6D96A", "#FFFFBF", "#FDAE61"]
};
var soiltype_band = Soiltype.select('B1');
//计算公式 result = (x/1000)-0.1
var soil_result = (soiltype_band.divide(1000)).subtract(0.1)
Map.addLayer(soil_result, vis_soil, "soil", false);
/***********************************************************************/
//脆弱性计算
var Vulnerability = FVC.multiply(0.207)
    .add(classifer_result.multiply(0.256))
    .add(RND_result.multiply(0.354))
    .add(soil_result.multiply(0.183))

//GDP的计算
var GDP2015 = pie.Image('user/pieadmin/GDP2015_100')
    .select("B1")
    .clip(studyArea);
var vis_GDP = {
    min:0,
    max:1,
    palette: ['#FCC5C0', '#FA9FB5', '#F768A1', '#DD3497', '#AE017E']
};
var gdp_band = GDP2015.select('B1');
var GDP2017 = gdp_band.multiply((681.7 - 568.4) / 568.4 + 1)
var gdp_minmax = GDP2017.reduceRegion(pie.Reducer.minMax(), studyArea, 30);
gdp_minmax = pie.Dictionary(gdp_minmax);
var GDP_min = pie.Number(gdp_minmax.get("B1_min"));
var GDP_max = pie.Number(gdp_minmax.get("B1_max"));
//计算公式 result =(x-min)/(max-min)
var GDP_result = (gdp_band.subtract(GDP_min)).divide(GDP_max.subtract(GDP_min));
Map.addLayer(GDP_result, vis_GDP, "gdp", false);

/***********************************************************************/
//到道路网的距离的计算
var road = pie.Image('user/pieadmin/Dist_road100')
    .select('B1')
    .clip(studyArea);
var road_band = road.select('B1');
var road_minmax = road_band.reduceRegion(pie.Reducer.minMax(), studyArea, 100);
road_minmax = pie.Dictionary(road_minmax);
var road_min = pie.Number(road_minmax.get("B1_min"));
var road_max = pie.Number(road_minmax.get("B1_max"));
var road_result = pie.Image(road_max).subtract(road_band).divide(road_max.subtract(road_min));
var vis_road = {
    min:0,
    max:1,
    palette: ['#D9D9D9', '#BDBDBD', '#969696', '#737373', '#525252']
};
Map.addLayer(road_result, vis_road, "road", false);

/***********************************************************************/
//人口密度
var pop_des = pie.ImageCollection("WorldPop/Global_100m_UNadj")
    .filterDate("2017-1-1", "2017-12-30")
    .first()
    .select('population')
    .clip(studyArea);
var pop_band = pop_des.select('population');
var pop_minmax = pop_des.reduceRegion(pie.Reducer.minMax(), studyArea, 100);
pop_minmax = pie.Dictionary(pop_minmax);
var pop_min = pie.Number(pop_minmax.get("population_min"));
var pop_max = pie.Number(pop_minmax.get("population_max"));
//计算公式 result = (x-min)/(max-min)
var pop_result = (pop_band.subtract(pop_min)).divide(pop_max.subtract(pop_min));

/***********************************************************************/
//暴露性计算
var Exposure = ((pop_result.multiply(0.411)).add(GDP_result.multiply(0.327)))
    .add(road_result.multiply(0.262))

/***********************************************************************/
//洪涝灾害风险计算
var FloodDisasterrisk_cal = ((danger.multiply(0.416)).add(Vulnerability.multiply(0.362)))
    .add(Exposure.multiply(0.222))

/**button模块 */
function generatePIEChart(image, chartOption) {
    var conditions = [
        {min:null, max:0.2},
        {min:0.2, max:0.4},
        {min:0.4, max:0.6},
        {min:0.6, max:0.8},
        {min:0.8, max:null},
    ];
    for (let i=0; i<conditions.length; i++) {
        var newImg;
        if (conditions[i].min == null) {
            newImg = image.lte(conditions[i].max);
        } else if (conditions[i].max == null) {
            newImg = image.gt(conditions[i].min);
        } else {
            newImg = image.gt(conditions[i].min).and(image.lte(conditions[i].max));
        }
        var areaImage = pie.Image().pixelArea().multiply(newImg);
        var data = areaImage.reduceRegion(pie.Reducer.sum(), studyArea, 1000);
        image = image.set("class_"+i, data.get("constant"));
    }
    image.getInfo(function(data) {
        let properties = data.properties;
        let xValues = [];
        let yValues = [];
        let labels = chartOption.legend
        for (let i=0; i<conditions.length; i++) {
            xValues.push(labels[i]);
            yValues.push(parseFloat((properties["class_"+i]/1000000).toFixed(2)));
        }
        let chart = ui.Chart.PIEArray.values({
            array: yValues,
            axis: 0,
            xLabels: xValues
        });
        chart = chart.setChartType("pie")
            .setSeriesNames(xValues)
            .setOptions({
                title: {
                    name: chartOption.title
                },
                xAxis: {
                    name: chartOption.seriesName
                }
            });
        print(chart);
    });
}

var productLayer = null;
var productLegend = null;

function addProductLegend(title, labels, colors) {
    if (productLegend != null) {
        Map.removeUI(productLegend);
    }
    // 图例
    var data = {
        title: title,
        colors: colors,
        labels: labels,
        step: 30
    };
    var style = {
        right: "150px",
        bottom: "10px",
        height: "70px",
        width: "350px"
    };
    productLegend = ui.Legend(data, style);
    Map.addUI(productLegend);
}

function addProductLayer(layer, vis, layerName) {
    if (productLayer != null) {
        Map.removeLayer(productLayer);
    }
    productLayer = Map.addLayer(layer, vis, layerName);
}

/**暴露性 */
var ExposureShow = ui.Button({
    label: '暴露性等级分布图',
    onClick: showExposureShow
})

function showExposureShow() {
    var vis_exposure = {
        min:0,
        max:1,
        palette: ["1A9850", "A6D96A", "FFFFBF", 'EF6548', 'D7301F']
    };
    addProductLayer(Exposure, vis_exposure, "Exposure");
    addProductLegend('暴露性等级',
        ['very low', 'low', 'medium', 'high', 'very high'],
        ["#1A9850", "#A6D96A", "#FFFFBF", '#EF6548', '#D7301F']);
    print("暴露性结果统计与展示");
    //暴露性结果统计与展示
    var pie_options_Exposure = {
        title: '暴露性结果统计图',
        legend: ["very low", "low", "medium", "high", "very high"],
        seriesName: "暴露性等级",
    }
    generatePIEChart(Exposure, pie_options_Exposure);
}
print(ExposureShow);

/**脆弱性 */
var VulnerabilityShow = ui.Button({
    label: '脆弱性等级分布图',
    onClick: showVulnerability
})

function showVulnerability() {
    var vis_Vulnerability = {
        min:0,
        max:1,
        palette: ["#1A9850", "#66BD63", "#A6D96A", "#F46D43", "#D73027"]
    };
    addProductLayer(Vulnerability, vis_Vulnerability, 'Vulnerability');
    addProductLegend('脆弱性等级',
        ['very low', 'low', 'medium', 'high', 'very high'],
        ["#1A9850", "#66BD63", "#A6D96A", "#F46D43", "#D73027"]);

    print("脆弱性结果统计与展示");
    //脆弱性结果统计与展示
    var pie_options_Vulnerability = {
        title: '脆弱性结果统计图',
        legend: ["very low", "low", "medium", "high", "very high"],
        seriesName: "脆弱性等级",
    }
    generatePIEChart(Vulnerability, pie_options_Vulnerability);
}
print(VulnerabilityShow);

/**危险性 */
var dangerShow = ui.Button({
    label: '危险性等级分布图',
    onClick: showdanger
})

function showdanger() {
    var vis_danger = {
        min:0,
        max:1,
        palette: ["#35978F", "#80CDC1", "#C7EAE5", "#FF7F50", "#D73027"]
    };
    addProductLayer(danger, vis_danger, 'Hazard');
    addProductLegend('危险性等级',
        ['very low', 'low', 'medium', 'high', 'very high'],
        ["#35978F", "#80CDC1", "#C7EAE5", "#FF7F50", "#D73027"]);

    print("危险性结果统计与展示");
    //危险性结果统计与展示
    var pie_options_danger = {
        title: '危险性结果统计图',
        legend: ["very low", "low", "medium", "high", "very high"],
        seriesName: "危险性等级",
    }
    generatePIEChart(danger, pie_options_danger);
}
print(dangerShow);
/**总指标 */
var FDRCShow = ui.Button({
    label: '洪涝灾害风险分布图',
    onClick: showfdrc
})

function showfdrc() {
    var FDRC = {
        min:0,
        max:1,
        palette: ['#2166AC', '#4393C3', '#92C5DE', '#D6604D', '#AE182B']
    };
    addProductLayer(FloodDisasterrisk_cal, FDRC, 'FloodDisasterrisk_cal');
    addProductLegend('风险性等级',
        ['very low', 'low', 'medium', 'high', 'very high'],
        ['#2166AC', '#4393C3', '#92C5DE', '#D6604D', '#AE182B']);

    print("洪涝灾害风险结果统计与展示");
    //洪涝灾害风险结果统计与展示
    var pie_options_FloodDisasterrisk = {
        title: '风险性结果统计图',
        legend: ["very low", "low", "medium", "high", "very high"],
        seriesName: "风险等级",
    }
    generatePIEChart(FloodDisasterrisk_cal, pie_options_FloodDisasterrisk);
}
print(FDRCShow);
  • 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.

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区

洪涝灾害风险分布图

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区

 危险性等级分布图

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区

 相应的饼图结果:

#冲刺创作新星#PIE-Engine:房山区洪涝灾害风险评价-鸿蒙开发者社区



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


回复
    相关推荐