PIE-engine 教程 ——NDVI和FVC计算时序分析以2013年-2020年福州市为例

简介: PIE-engine 教程 ——NDVI和FVC计算时序分析以2013年-2020年福州市为例

   本教程我们将分析植被覆盖度动态分布,再计算FVC的时候,我们首先要计算NDVI,然后通归一化处理,这个过程主要是计算最大值最小值的获取,植被覆盖度根据像元二分模型计算FVC=(NDVI-NDVImin)/(NDVImax-NDVImin)

植被覆盖率指某一地域植物垂直投影面积与该地域面积之比,用百分数表示。森林覆盖率,亦称森林覆被率指一个国家或地区森林面积占土地面积的百分比,是反映一个国家或地区森林面积占有情况或森林资源丰富程度及实现绿化程度的指标,又是确定森林经营和开发利用方针的重要依据之一。

这里用的两个reduce数据,

max()

返回一个输出其输入的最大值的Reducer。如果numInputs大于1,则还输出附加输入的相应值。

方法参数:

- numInputs(Int,默认1)

输入的数量。

返回值:Reducer

min()

返回一个输出其输入的最小值的Reducer。如果numInputs大于1,则还输出附加输入的相应值。

方法参数:

- numInputs(Int,默认1)

输入的数量。

返回值:Reducer

mean()

返回一个计算其输入的(加权)算术平均值的Reducer。

方法参数:

返回值:Reducer

filter(filter)

对影像集合进行指定过滤规则的过滤,然后返回过滤后的影像集合。

方法参数:

- imageCollection(ImageCollection)

ImageCollection实例。

- filter(Filter)

过滤规则对象。

返回值:ImageCollection

这里我们再使用filter的过程中可以筛选的不仅仅是日期,可以作为单个的年份的筛选

first()

获得影像集合的第一个Image对象。

方法参数:

- imageCollection(ImageCollection)

ImageCollection实例。

返回值:Image

代码:

//第一步:划定研究区域福州市
var china = pie.FeatureCollection("NGCC/CHINA_CITY_BOUNDARY");
// print(china);
var FZ = china.filter(pie.Filter.eq("name", "福州市"));
Map.addLayer(FZ, { color: "ffff00ff", fillColor: "00000000" }, "福州市");
Map.centerObject(FZ, 8);
var geometry = FZ.getAt(0).geometry();
//第二步:筛选数据,提取2013-2020年NDVI年最大值影像
//1、调用Landsat8 TOA数据集并设定筛选条件,构建NDVI计算公式
function processImage(year, geometry) {
    /*初始化影像并且按照空间、时间过滤*/
    var l8Col = pie.ImageCollection("LC08/01/T1")
        .filterBounds(geometry)
        .filterDate(year + "-03-01", year + "-07-31")
        .select(["B5", "B4", "BQA"])
        .map(function (image) {
            var b4 = image.select("B4");
            var b5 = image.select("B5");
            //计算NDVI植被指数
            var ndvi = (b5.subtract(b4)).divide(b5.add(b4));
            //QA波段去云
            var qa = image.select("BQA");
            var cloudMask = qa.bitwiseAnd(1 << 4).eq(0);
            //去云和提取植被覆盖区域
            ndvi = ndvi.updateMask(cloudMask)
                .updateMask(ndvi.gt(0));
            return ndvi;
        });
    //提取研究区域每年NDVI最大值
    var yearImg = l8Col.select("B5").max().clip(geometry);
    return yearImg;
};
//2、设置NDVI显示参数
var visParams = {
    min: -0.2,
    max: 0.8,
    palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
        '3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
//3、提取福州市2013-2020年NDVI年最大值影像并显示
var layerNames = [];
var NDVIs = [];
for (var i = 0; i < 8; i++) {
    var year = 2013 + i;
    var key = year.toString();
    layerNames.push(key);
    //统计每一年的NDVI均值影像
    var NDVI = processImage(year, geometry);
    NDVIs.push(NDVI);
    //将NDVI数据添加到地图上显示
    Map.addLayer(NDVI, visParams, "NDVI_" + key, false);
};
//第三步:提取福州市2013-2020年FVC影像,根据像元二分模型计算FVC=(NDVI-NDVImin)/(NDVImax-NDVImin)
//1、设定区域内2013-2020年每年的NDVI最大值、最小值以及FVC计算方法
function calFVCs(NDVI, geometry) {
    var NDVI_max = NDVI.reduceRegion(pie.Reducer.max(), geometry, 1000).get("B5").getInfo();
    var NDVI_min = NDVI.reduceRegion(pie.Reducer.min(), geometry, 1000).get("B5").getInfo();
    var FVC = (NDVI.subtract(NDVI_min)).divide(pie.Number(NDVI_max).subtract(NDVI_min));
    return FVC;
};
//2、提取区域内2013-2020年每年FVC影像并显示
var FVCs = [];
for (var j = 0; j < 8; j++) {
    var year = 2013 + j;
    var key1 = year.toString();
    //提取每年的FVC影像
    var FVC = calFVCs(NDVIs[j], geometry);
    FVC = FVC.set("year", year);
    FVCs.push(FVC);
    //在地图上显示FVC影像
    Map.addLayer(FVC, visParams, "FVC_" + key1);
};
print(FVCs);
//第四步:添加图例显示
/**
 * 图例配置数据
 * title:图例的名称
 * colors:图例的颜色
 * labels:图例分类名称
 * step:需要分的总步长
 */
var data = {
    title: "植被覆盖",
    colors: ['#FFFFFF', '#CE7E45', '#DF923D', '#F1B555', '#FCD163', '#99B718', '#74A901',
        '#66A000', '#529400', '#3E8601', '#207401', '#056201', '#004C00', '#023B01',
        '#012E01', '#011D01', '#011301'],
    labels: ["低覆盖", "中低覆盖", "中覆盖", "中高覆盖", "高覆盖"],
    step: 30,
};
var style = {
    right: "200px",
    bottom: "10px",
    height: "70px",
    width: "350px",
};
var legend = ui.Legend(data, style);
// 地图上显示图例组件
Map.addUI(legend);
//第五步:统计指定区域内2013年-2020年每年的FVC均值,并绘制FVC动态变化曲线
//1、定义区域内FVC均值计算方法
function calFVCmeans(FVCImg, geometry) {
    var FVC_mean = FVCImg.reduceRegion(pie.Reducer.mean(), geometry, 1000);
    return FVC_mean;
}
//2、构建FVC影像集合
var FVCImgs = pie.ImageCollection().fromImages(FVCs);
print(FVCImgs);
//3、计算区域内FVC均值
var FVCmeans = [];
for (var m = 0; m < FVCs.length; m++) {
    var year = 2013 + m;
    var FVCImg = FVCImgs.filter(pie.Filter.eq("year", year)).first();
    var FVC_mean = calFVCmeans(FVCImg, geometry);
    print(year + "FVC均值为", FVC_mean);
    FVCmeans.push(FVC_mean);
}
//4、绘制福建省2013-2020年植被指数变化折线图
var xSeries = layerNames;
var line_options = {
    title: '福州市2013年-2020年植被覆盖动态变化',
    legend: ['FVC均值'],
    xAxisName: "日期",
    yAxisName: "植被覆盖度",
    chartType: "line",
    smooth: true //是否平滑
};
ChartImage(FVCmeans, xSeries, line_options);
//第六步:创建2013-2020年FVC影像导出批量任务,用于导出影像集合到个人仓库下,方便后续的直接使用
//1、构建FVC影像集合
for (var k = 0; k < FVCs.length; k++) {
    var year = 2013 + k;
    var image = FVCImgs.filter(pie.Filter.eq("year", year)).first();
    //2、导出2013-2020年每年FVC影像   
    Export.image({
        image: image,
        description: "FVC_" + year,
        assetId: "FVC_" + year,
        region: geometry,
        scale: 1000
    })
};

结果:

image.png

 

image.png


相关文章
|
4月前
|
Java 数据库 Sentinel
服务保护、分布式事务 学习目标
本课程深入讲解微服务保护与分布式事务控制,涵盖雪崩问题、熔断降级、限流、线程隔离等核心机制,基于Sentinel实现服务容错;结合Seata实现AT模式的分布式事务管理,掌握CAP原理与实际应用方案。
|
JSON 数据可视化 数据格式
PIE-engine 教程 ——长时间序列NDVI影像计算和chart时序图加载(2017年锦州全年植被指数展示)
PIE-engine 教程 ——长时间序列NDVI影像计算和chart时序图加载(2017年锦州全年植被指数展示)
858 0
PIE-engine 教程 ——长时间序列NDVI影像计算和chart时序图加载(2017年锦州全年植被指数展示)
|
JSON 监控 物联网
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
|
定位技术
ENVI: 如何创建GLT文件并基于GLT对图像进行几何校正?
ENVI: 如何创建GLT文件并基于GLT对图像进行几何校正?
1896 0
|
Shell
一个能够生成 Markdown 表格的 Bash 脚本
【8月更文挑战第20天】这是一个使用Bash脚本生成Markdown表格的示例。脚本首先设置表头与内容数据,然后输出Markdown格式的表格。用户可以根据需要自定义表格内容。使用时,只需将脚本保存为文件(如 `generate_table.sh`),赋予执行权限,并运行它,即可在终端看到生成的Markdown表格。
330 2
|
存储 关系型数据库 数据库
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
迎峰而上:汇联易依托阿里云RDS通用云盘,加速业务智能化升级
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
|
机器学习/深度学习 算法 固态存储
10分钟学会使用YOLO及Opencv实现目标检测(下)|附源码
本文介绍使用opencv和yolo完成视频流目标检测,代码解释详细,附源码,上手快。
9658 1
|
人工智能 程序员 测试技术
AI程序员Devin在软件开发中的性能评估
【2月更文挑战第29天】AI程序员Devin在软件开发中取得突破,成功解决SWE-bench基准测试13.86%的问题,超出未辅助基线1.96%。展示强大编程能力,但处理复杂任务成功率仅4.80%,表明局限性。Devin能执行多步计划和自我纠错,但在理解复杂逻辑和用户偏好上需改进。在测试驱动开发场景下,成功通过率提升至23%,显示出合作潜力。然而,AI在软件工程领域仍有很大改进空间。
486 1
AI程序员Devin在软件开发中的性能评估
|
存储 关系型数据库 MySQL
深入MySQL:事务日志redo log详解与实践
【8月更文挑战第24天】在MySQL的InnoDB存储引擎中,为确保事务的持久性和数据一致性,采用了redo log(重做日志)机制。redo log记录了所有数据修改,在系统崩溃后可通过它恢复未完成的事务。它由内存中的redo log buffer和磁盘上的redo log file组成。事务修改先写入buffer,再异步刷新至磁盘,最后提交事务。若系统崩溃,InnoDB通过redo log重放已提交事务并利用undo log回滚未提交事务,确保数据完整。理解redo log工作流程有助于优化数据库性能和确保数据安全。
1288 0