#冲刺创作新星#PIE-Engine陕北荒漠化计算 原创

此星光明
发布于 2022-9-25 10:27
浏览
0收藏

这里我们利用ndvi进行荒漠化处理,我们这里将ndvi小于0.1的地方进行掩膜掉,将剩余部分作为作为荒漠化的区域。这里选择时间的筛选我们将4月到10月的的时间作为研究时间。这里我们有几个函数需要需要先了解一下,首先是我们了解画polygon的函数,另外就是image的掩膜,另外一个就是像素统计函数

pie.Geometry.Polygon(coords,proj)

多边形构造Geometry。

方法参数:

  • geometry(Geometry)

geometry实例。

  • coords(Array)

给定坐标系下的多个点构成的坐标序列。

  • proj(Projection, optional)

坐标系对象,null表示默认为EPSG:4326。

返回值:Geometry.Polygon

updateMask(value)

Image掩膜运算,参数image需要是一个0和1的二值图,返回一个Image对象。

这里的括号中我们所需要的是

方法参数:

  • image(Image)

Image实例。

  • value(Image|Double)

Image对象或数值。

返回值:Image

reduceRegion(reducer,geometry,scale)

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

方法参数:

  • image(Image)

Image实例。

  • reducer(Reducer)

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

  • geometry(Geometry)

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

  • scale(Number)

统计采样比例。

返回值:Dictionary

playLayersAnimation(layers,time,loop,callFunc)

将指定的图层列表设置动画图层。

方法参数:

  • layers(List|Object)

图层的名称列表或者图层的配置信息,使用图层配置需要配置layer(图层的数据)、name(图层名称)、style(图层样式)。

  • time(Number)

动画循环时间。

  • loop(Number)

动画循环次数,-1是无限循环。

  • callFunc(Function)

动画每一帧回调方法

返回值:null

ui.Legend(data,style,type,onClick)

图例的构造方法。

方法参数:

  • ui(ui)

调用者:ui对象。

  • data(Object)

图例的组成样式数据。

  • style(Object)

在地图上的位置,数据为对象。right:距离右侧的位置,bottom:距离下面的位置,width:宽(无则自适应),height:高(无则自适应)

  • type(String)

图例的类型:continue或者classify。默认是continue类型,classify就是continue中step=1的特殊情况。

  • onClick(Function)

点击回调方法。

返回值:ui.Legend

代码:

var geometry = pie.Geometry.Polygon([[[109.7, 38.8], [110.3, 38.8], [110.3, 38.4], [109.7, 38.4], [109.7, 38.8]]], null);
var roi = pie.FeatureCollection(pie.Feature(geometry));
Map.addLayer(roi, { color: "ff00ffff", fillColor: "00000000" }, "roi", true);  //加载显示ROI图层
Map.centerObject(geometry, 9);  //定义地图显示中心及显示层级
// 指定年份数据的荒漠化指数Albedo指数提取
function processImage(year, roi) {
    var id = "LC08/01/T1";
    var l8Col = pie.ImageCollection(id)
        .filterBounds(roi)  //按范围过滤影像
        .filterDate(year + "-04-01", year + "-10-01")  //按日期过滤影像
        .select(["B4", "B5", "BQA"])  //选择影像的B4、B5和BQA波段
        .map(function (image) {   //map函数针对ImageCollection中的每个Image进行循环计算。
            var b4 = image.select("B4");
            var b5 = image.select("B5");
            //归一化植被指数计算
            var ndvi = (b5.subtract(b4)).divide(b5.add(b4));  //ndvi计算,ndvi=(b4-b5)/(b4+b5)
            //荒漠化指数Albedo=aNDVI+b     a、b取值由实验区成图效果所定
            var albedo = ndvi.multiply(1.00001).add(0.000003);
            //QA去云
            var qa = image.select("BQA");
            var cloudMask = qa.bitwiseAnd(1 << 4).eq(0);
            //去云和提取植被指数<0.1区域
            albedo = albedo.updateMask(cloudMask)
                .updateMask(albedo.lt(0.1));
            return albedo.rename("Albedo");//对图层重命名,方便后面选择,不重命名的话,select时是“B4”
        });
    //采用最大值直接融合,最后做一次裁剪
    var yearImg = l8Col.select("Albedo").max().clip(roi);
    return yearImg; //返回Image对象
}
// 2017-2019年陕北区域荒漠化指数提取及显示
var img1 = processImage(2015, geometry);
Map.addLayer(img1, { min: -1, max: 1, palette: "c7c7c7" }, "2015", false);//grey
var img2 = processImage(2016, geometry);
Map.addLayer(img1, { min: -1, max: 1, palette: "ffff00" }, "2016", false);//yellow
var img3 = processImage(2017, geometry);
Map.addLayer(img1, { min: -1, max: 1, palette: "0000ff" }, "2017", false);//blue
var img4 = processImage(2018, geometry);
Map.addLayer(img2, { min: -1, max: 1, palette: "00ff00" }, "2018", false);//green
var img5 = processImage(2019, geometry);
Map.addLayer(img3, { min: -1, max: 1, palette: "ff0000" }, "2019", false);//red
// 计算2015-2019年荒漠化面积 (Albedo<0.1定义为荒漠)
function calcArea(yearImg, roi) {
    var areaImage = yearImg.pixelArea().multiply(yearImg.lt(0.1));
    var s = areaImage.reduceRegion(pie.Reducer.sum(), roi, 30);
    return s;
}
// 陕北地区2015-2019年荒漠化面积变化多图表对比
var line_options = {
    title: '陕北地区2015-2019年荒漠化面积变化',
    legend: ['荒漠面积'],
    xAxisName: "日期(年)",
    yAxisName: "荒漠面积(平方千米)",
    chartType: "line",
    yScale: 1 / 100
};
//我们这里分别建造5个面积的列表作为y轴列表
var areaValues = [   //定义数组,调用构造函数计算各个年份荒漠化面积
    calcArea(img1, geometry),
    calcArea(img2, geometry),
    calcArea(img3, geometry),
    calcArea(img4, geometry),
    calcArea(img5, geometry)
];

//简历X轴的时间序列列表
var xSeries = [2015, 2016, 2017, 2018, 2019];   //定义数组,作为统计图x轴显示
print("2015年", areaValues[0]);
print("2016年", areaValues[1]);
print("2017年", areaValues[2]);
print("2018年", areaValues[3]);
print("2019年", areaValues[4]);

//这里是为了加载不同图层的图层名称,作为我们的加载动画的结果
var layerNames = [];
layerNames.push("2015" + "");
layerNames.push("2016" + "");
layerNames.push("2017" + "");
layerNames.push("2018" + "");
layerNames.push("2019" + "");
Map.playLayersAnimation(layerNames, 2, 100); //动态显示
ChartImage(areaValues, xSeries, line_options); //显示折线图

//这里我们注意Yscale的1 / 1000000
var column_options = {
    title: '陕北荒漠化2015-2019年面积变化',
    legend: ["荒漠化面积"],
    yAxisName: "荒漠化面积(平方千米)",
    xAxisName: "日期(年)",
    chartType: "column",
    yScale: 1 / 1000000
};
ChartImage(areaValues, xSeries, column_options);  //显示柱状图

var data = {     //定义图例的样式数据,其类型为对象
    title: "年份",
    colors: [
        '#c7c7c7', '#ffff00', '#0000ff', '#00ff00', '#ff0000'],
    labels: ["2015", "2016", "2017", "2018", "2019"],
    step: 1
};

var style = {  //定义图例在地图上的位置,其类型为对象
    top: "45%",
    left: "20%",
    width: "350px",
    height: "70px"
};
var legend = ui.Legend(data, style); //生成图例对象,传入图例的组成样式数据、在地图上的位置数据,数据为对象。
Map.addUI(legend);  //加载显示图例,传入图例对象

荒漠化面积结果:
#冲刺创作新星#PIE-Engine陕北荒漠化计算-鸿蒙开发者社区
#冲刺创作新星#PIE-Engine陕北荒漠化计算-鸿蒙开发者社区

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