
#冲刺创作新星#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.
洪涝灾害风险分布图
危险性等级分布图
相应的饼图结果:
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-10-27 15:50:33修改
赞
收藏
回复
分享
微博
QQ
微信
举报
举报
微信扫码分享
删除帖子
删除 取消

回复
相关推荐