# GEE
**Repository Path**: lclIzzxw/gee
## Basic Information
- **Project Name**: GEE
- **Description**: No description available
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2025-12-16
- **Last Updated**: 2026-03-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 1、基于 GEE 的 NDVI 交互式时序可视化与趋势分析工具
## 功能:
1. 数据预处理:自动加载 Landsat 8 数据并进行去云处理。
2. NDVI 计算:计算归一化植被指数。
3. 趋势分析 (Trend Map):利用线性回归计算 NDVI 的变化斜率(Slope),并在地图上可视化(变绿还是变黄)。
4. 交互式图表 (UI):点击地图任意位置,右侧面板会自动生成该点的 NDVI 长时序变化曲线,并叠加线性趋势线。
GEE生成青藏高原的NDVI影像,在图中任意位置点击会放回此地区的NDVI时序分析库
点击上图右下角可以放大图像(用于科研再合适不过了,注意此图可下载多种图片格式)
## 本代码有多图层
● Selected Point:选中点的可视化(通常是红点或标记,用来显示你点击的位置)
● NDVI Trend Slope:NDVI长期趋势斜率(一般通过Mann-Kendall或线性回归计算得到的每个像元NDVI时间序列的变化速率,单位通常是NDVI/年)
● NDVI Mean (Avg):多年平均NDVI(多时相NDVI的均值图,反映研究区总体植被覆盖水平,上有颜色的图就是为此图层)
● Boundary Outline:研究区/感兴趣区域的边界轮廓(通常是shapefile或FeatureCollection导入后显示的白色或黑色边框)
# 2、基于 GEE 的 Sentinel-2 NDMI 交互式时序分析工具
## (Interactive NDMI Analysis Tool based on Google Earth Engine)



## 基于 GEE 的 Sentinel-2 NDMI 交互式时序分析工具
## 📖 项目简介 (Introduction)
本项目是一个基于 **Google Earth Engine (GEE)** 平台的在线应用程序,旨在利用 **Sentinel-2 (哨兵2号)** 高分辨率遥感影像,对特定区域进行 **NDMI (归一化水分指数)** 的长时序监测与分析。
该工具旨在为生态监测、农业估产及植被含水量分析提供便捷的交互式平台。它支持自动加载预设的感兴趣区域(如海淀区),同时也支持用户手动绘制分析范围。
## ✨ 核心功能 (Key Features)
* **多模式区域选择**:
* **默认模式**:自动加载预上传的矢量 Asset (`projects/maxhecheng/assets/haidian`)。
* **交互模式**:支持用户在地图上手动绘制矩形或多边形,程序将自动优先分析绘制区域。
* **自动化数据处理**:
* 集成 Sentinel-2 去云算法 (基于 QA60 波段)。
* 自动计算 NDMI 指数。
* 生成指定时间窗口内的中值合成影像 (Median Composite)。
* **动态可视化与分析**:
* 提供 NDMI 时间序列折线图,支持查看特定日期的数值。
* 动态加载分级渲染的 NDMI 图层(干旱-湿润色带)。
* 包含交互式图例。
* **多格式数据导出**:
* **快速预览**:生成带地理参考的 PNG 缩略图下载链接。
* **科研数据**:支持 **Export to Drive**,导出 GeoTIFF 格式原始数据(便于后续导入 QGIS/ArcGIS 制作专题图)。
* **表格数据**:支持导出时间序列 CSV 文件。
## 🧮 算法原理 (Algorithm)
### 1. NDMI 计算公式
NDMI (Normalized Difference Moisture Index) 用于检测植被冠层的水分含量。
$$NDMI = \frac{(NIR - SWIR)}{(NIR + SWIR)}$$
在 Sentinel-2 数据中对应波段为:
$$NDMI = \frac{(Band 8 - Band 11)}{(Band 8 + Band 11)}$$
* **Band 8 (NIR)**: 近红外
* **Band 11 (SWIR)**: 短波红外
### 2. 去云处理
利用 Sentinel-2 的 `QA60` 波段位掩码技术,剔除云层和卷云干扰,确保合成影像的质量。
## 🚀 快速开始 (Usage)
### 运行环境
* 拥有 Google Earth Engine 账号。
* 浏览器推荐使用 Chrome 或 Edge。
### 操作步骤
1. **打开脚本链接**:[在此处填入你的 GEE Code Editor 分享链接]
2. **设置参数**:
* 在左侧面板输入 **开始日期** 和 **结束日期**。
3. **选择区域**:
* *情况 A*:若不进行任何操作,默认分析预设区域(海淀区)。
* *情况 B*:使用地图左上角的绘图工具画一个框,程序将分析你画的框。
4. **运行分析**:
* 点击绿色的 **"运行分析 (Run Analysis)"** 按钮。
5. **查看与下载**:
* 查看右侧地图渲染结果和左侧时间序列图表。
* 点击 **"创建导出任务"** 按钮,然后在 GEE 右侧 `Tasks` 面板中点击 `Run` 下载 GeoTIFF。
界面展示图
导出的PNG
NDMI平均趋势图(注意:可以下载为svg等图像)
## 🛠️ 技术栈 (Tech Stack)
* **Language**: JavaScript (GEE API)
* **Data Source**: Copernicus Sentinel-2 MSI: MultiSpectral Instrument, Level-2A
* **Frontend**: GEE UI Widgets (Panels, Charts, Buttons)
## 📂 项目结构
```text```
# 3、基于 GEE 的多源 Landsat 长时序影像融合与中值合成报告



## 1. 项目背景 (Background)
Landsat 系列卫星提供了长达 40 年以上的地球表面观测记录。然而,在进行长时序分析时,单一传感器往往无法覆盖所有时间段(如 L5 覆盖早期,L8/9 覆盖近期)。此外,不同传感器的波段定义和辐射特性存在差异。
本项目旨在基于 Google Earth Engine (GEE) 平台,构建一套自动化工作流,**无缝融合 Landsat 5, 7, 8, 9 四代卫星数据**,通过波段对齐和去云处理,生成高质量的研究区(AOI)中值合成影像(Median Composite)。
## 效果图
图像可以选择时间区间,点击生成可在gee上生成对应图像
点击创建导出任务,可以获得geotiff影像点击run可保存在Google云盘可以在Google 云盘下载
在Google云盘中找到文件保存位置
geotiff图像可以直接在qgis(或者airgis上加载,生成有图例,有标题的学术图片)
## 2. 数据源 (Data Sources)
本项目使用了 USGS Landsat Collection 2 Level-2 (表面反射率) 数据集:
| 卫星传感器 | 数据集 ID (GEE) | 时间覆盖 | 备注 |
| :--- | :--- | :--- | :--- |
| **Landsat 9** | `LANDSAT/LC09/C02/T1_L2` | 2021-至今 | 最新数据 |
| **Landsat 8** | `LANDSAT/LC08/C02/T1_L2` | 2013-至今 | 目前主力 |
| **Landsat 7** | `LANDSAT/LE07/C02/T1_L2` | 1999-至今 | 含 SLC-off 条带 |
| **Landsat 5** | `LANDSAT/LT05/C02/T1_L2` | 1984-2012 | 历史数据 |
* **研究区域 (AOI)**: `projects/maxhecheng/assets/haidian` (北京市海淀区矢量边界)
## 3. 技术路线与算法 (Methodology)
### 3.1 核心难点解决方案
为了实现多源融合,必须解决以下一致性问题:
1. **波段号不一致 (Band Misalignment)**:
* L8/L9 的近红外波段是 **B5**,而 L5/L7 是 **B4**。
* **解决方案**: 建立波段映射关系,将所有影像的波段统一重命名为标准名称:`['Blue', 'Green', 'Red', 'NIR', 'SWIR1', 'SWIR2']`。
2. **定量化差异 (Scale Factors)**:
* Collection 2 数据以整数形式存储。
* **解决方案**: 应用线性缩放公式还原物理值:
$$SR = Pixel \times 0.0000275 - 0.2$$
3. **去云掩膜 (Cloud Masking)**:
* 利用 `QA_PIXEL` 波段的位操作 (Bitwise Operation) 识别云和云影。
### 3.2 处理流程图
```mermaid
graph TD
A[开始: 输入时间范围 & AOI] --> B{选择可用数据源}
B -->|1984-2012| C[Landsat 5 Collection]
B -->|1999-2022| D[Landsat 7 Collection]
B -->|2013-至今| E[Landsat 8 Collection]
B -->|2021-至今| F[Landsat 9 Collection]
C & D --> G[预处理 L5/7]
E & F --> H[预处理 L8/9]
subgraph 预处理逻辑
G --> G1[去云 QA Mask]
G --> G2[应用缩放因子]
G --> G3[波段重命名 (B1->Blue...)]
H --> H1[去云 QA Mask]
H --> H2[应用缩放因子]
H --> H3[波段重命名 (B2->Blue...)]
end
G3 & H3 --> I[数据集合并 (Merge Collection)]
I --> J[中值合成 (Median Reducer)]
J --> K[裁剪至 AOI]
K --> L[输出结果: 可视化 & 导出 GeoTIFF]
.
├── code.js # GEE 核心脚本代码
├── assets/ # (说明) 存放矢量边界数据
│ └── haidian # 默认分析区域 Asset
└── README.md # 项目说明文档
```
# 4、Landsat 8 地表温度(LST) 分地物时空分析工具
> (Spatiotemporal Analysis of LST by Land Cover Types based on GEE)



## 📖 项目简介 (Introduction)
本项目是一个基于 **Google Earth Engine (GEE)** 的在线分析工具,旨在研究不同地表覆盖类型(Land Cover Types)对地表温度(LST)的影响。
传统的地表温度分析通常只关注整个区域的均值,忽略了地物差异。本工具利用 **ESA WorldCover 10m** 高分辨率土地覆盖产品,自动提取研究区内的**森林、建筑、农田、水体、草地**五类典型地物,并基于 **Landsat 8** 热红外波段计算各年份、各月份的温度变化趋势。
## ✨ 核心功能 (Key Features)
* **无需人工训练分类**:直接集成 ESA WorldCover 数据,自动生成高精度地物掩膜 (Mask)。
* **五类地物对比**:
* 🌲 **森林 (Trees)**
* 🏙️ **建筑 (Built-up)**
* 🌾 **农田 (Cropland)**
* 💧 **水体 (Water)**
* 🌿 **草地 (Grassland)**
* **LST 反演与统计**:自动进行去云处理、热红外辐射定标,并转换为摄氏度 (°C)。
* **多维数据可视化**:
* **时序图表**:生成五条折线,直观展示不同地物随季节的温度差异(热岛效应分析)。
* **空间分布**:加载特定月份的 LST 均值影像。

* **灵活导出**:
* 支持导出 **GeoTIFF** 格式的月度温度分布图。(点击上图的"导出geotiff",在tasks里面就有一个图形下载(run),点击后就可以保存到Google云盘下载后进而可以导入QGIS和ArcGIS)

* 支持导出 **CSV/Excel** 格式的时间序列统计数据。


注意这里可以切换图层且可以切换图层的透明度


## 🧮 数据源与方法 (Data & Methodology)
### 系统架构与流程

### 1. 数据集 (Datasets)
| 数据类型 | 数据源 ID (GEE) | 用途 | 分辨率 |
| :--- | :--- | :--- | :--- |
| **地表温度** | `LANDSAT/LC08/C02/T1_L2` | 提取 `ST_B10` 波段计算 LST | 30m (重采样) |
| **土地覆盖** | `ESA/WorldCover/v100` | 提取地物分类标签 | 10m |
### 2. 算法原理 (Algorithm)
#### 2.1 地物提取
利用 ESA WorldCover 的 `Map` 值进行重分类掩膜:
* Value `10` → 🌲 森林
* Value `30` → 🌿 草地
* Value `40` → 🌾 农田
* Value `50` → 🏙️ 建筑 (不透水面)
* Value `80` → 💧 水体
#### 2.2 温度反演公式
将 Landsat 8 的数字量化值 (DN) 转换为摄氏度:
$$LST (°C) = (DN \times 0.00341802 + 149.0) - 273.15$$
#### 2.3 区域统计
对于每一景影像 $Image_i$,计算特定地物 $Class_k$ 掩膜区域内的像素均值:
$$MeanLST_{i,k} = \frac{1}{N} \sum_{p \in ROI \cap Mask_k} LST(p)$$
## 🚀 快速开始 (Usage)
### 环境要求
* Google Earth Engine 账号
* 现代浏览器 (Chrome/Edge)
### 操作步骤
1. **打开代码链接**:(在此填入你的 GEE Link)
2. **设置区域**:
* *默认*:自动加载海淀区。
* *自定义*:使用地图左上角的绘图工具画一个框,工具将优先分析手绘区域。
3. **配置参数**:
* 设置 **开始日期** 和 **结束日期** (例如 `2023-01-01` 至 `2023-12-31`)。
* 输入 **指定月份** (例如 `2023-07`) 用于导出影像。
4. **运行分析**:点击绿色的 **"开始分析 (Run Analysis)"** 按钮。
5. **获取结果**:
* **查看图表**:左下角面板将显示五色折线图。
* **下载数据**:点击图表右上角的弹出图标下载 CSV。
* **下载影像**:点击右侧面板的 "导出" 按钮,在 Tasks 中下载 GeoTIFF。
## 📊 典型分析结果示例
通常情况下,图表将展示明显的**城市热岛效应**与**冷岛效应**:
* 📈 **高温组**:建筑用地 (Built-up) 通常温度最高,夏季尤为明显。
* 📉 **低温组**:水体 (Water) 和 森林 (Forest) 温度最低,起到降温作用。
* 〰️ **波动组**:农田 (Cropland) 受季节与耕作影响,温度波动较大(如裸土期温度高,灌溉期温度低)。
# 5、Sentinel-1 SAR 地震滑坡变化检测系统:2022 泸定地震案例
> (Sentinel-1 SAR Change Detection System: 2022 Luding Earthquake Case)



## 📖 项目简介 (Introduction)
本项目基于 **Google Earth Engine (GEE)** 平台,利用全天候、全天时的 **Sentinel-1 合成孔径雷达 (SAR)** 数据,构建了一套针对地质灾害的变化检测系统。
> 原先想做汶川地震,但是汶川2008年时并没有sentinal-1卫星
当前配置专门针对 **2022年9月5日四川泸定 6.8 级地震**。由于地震发生在多云雾的高山峡谷地区,光学卫星(如 Landsat/Sentinel-2)往往受云层遮挡无法及时获取影像,而 SAR 雷达影像具有穿透云雾的能力,是第一时间监测地震诱发滑坡(Landslides)、崩塌(Collapse)及堰塞湖的理想工具。
## ✨ 核心功能 (Key Features)
* **卷帘对比分析 (Split Panel)**:
* 集成交互式卷帘工具,左侧显示**震前 (Pre-event)** 影像,右侧显示**震后 (Post-event)** 变化合成影像,支持毫秒级同步拖动对比。
* **RGB 变化检测算法 (RGB Composite)**:
* 利用 RGB 假彩色合成技术,将前后时相的雷达回波强度差异转化为直观的颜色(红色/青色),快速识别受灾区域。
* **多时相去噪合成**:
* 采用中值 (Median) 合成算法,有效去除 SAR 影像特有的斑点噪声 (Speckle Noise)。
* **数据导出**:
* 支持导出 GeoTIFF 格式的**变化差异图 (Difference Map)**,便于后续在 ArcGIS/QGIS 中进行滑坡编目。
## 📍 案例设置 (Case Study Settings)
* **目标事件**:四川泸定 6.8 级地震
* **震发时间**:2022年9月5日
* **研究区域 (AOI)**:`projects/maxhecheng/assets/luding`
* **时间窗口**:
* 📅 **震前 (Pre)**:2022-08-01 至 2022-09-04
* 📅 **震后 (Post)**:2022-09-06 至 2022-10-06
## 🧮 算法原理 (Methodology)
### 1. 数据源
使用 `COPERNICUS/S1_GRD` 数据集 (Sentinel-1 Ground Range Detected)。
* **极化方式**:`VH` (Vertical transmit, Horizontal receive)。VH 极化对植被结构和体积散射更敏感,能有效区分滑坡发生前后的地表粗糙度变化。
* **轨道方向**:`DESCENDING` (降轨)。针对川西南北走向的山脉,降轨数据通常能获得较好的观测几何。
### 2. RGB 变化检测合成
为了直观展示变化,我们构建了以下假彩色合成方案:
| 通道 (Channel) | 数据源 (Source) | 物理意义 |
| :--- | :--- | :--- |
| **R (Red)** | **震后影像 (Post-event)** | 震后回波强度 |
| **G (Green)** | **震前影像 (Pre-event)** | 震前回波强度 |
| **B (Blue)** | **震前影像 (Pre-event)** | 震前回波强度 |
### 3. 结果解译指南 (Interpretation)
通过上述合成方式,图像颜色代表了特定的地质变化:
* 🔴 **红色 / 粉色 (Red/Pink)**:**后向散射增强 (Backscatter Increase)**
* **原因**:地震导致原本覆盖植被(较平滑/体积散射)的山体发生滑坡,暴露出**粗糙的岩石和堆积体**。粗糙表面在雷达波下会产生更强的回波。
* **结论**:**滑坡、崩塌、建筑物倒塌废墟**。
* 🔵 **青色 / 蓝色 (Cyan/Blue)**:**后向散射减弱 (Backscatter Decrease)**
* **原因**:原本是陆地或植被的区域被水淹没(水体发生镜面反射,回波极低),或者是形成了极为平滑的泥流。
* **结论**:**堰塞湖、水体淹没区**。
* ⚪ **灰色 (Gray)**:**无变化 (No Change)**
* **原因**:震前震后雷达强度基本一致。


## 🚀 快速使用 (Usage)
1. **加载脚本**:将代码复制到 GEE Code Editor。
2. **确认参数**:
* 左侧面板已默认填入泸定地震时间(2022年8月 vs 9月)。
* 如需分析其他地震,请手动修改日期和 ROI。
3. **运行分析**:点击红色的 **"开始分析 (Analyze)"** 按钮。
4. **交互判读**:
* 拖动地图中间的分割线。
* 寻找**红色斑块**,这些通常是高位崩塌或滑坡源头。
5. **下载结果**:点击左侧底部的 "数据导出" 按钮,在 Tasks 面板下载 `.tif` 文件。
以下是下载在QGIS中打开的样子

所有亮白/发白的地方 = 地震把山震碎了、房子倒了
所有纯黑小点点 = 地震后突然出现的水(堰塞湖)
灰色区域 = 平安无事

# 6、RSEI 生态环境质量智能评估系统 (GEE App)

> **平台:** Google Earth Engine (GEE)
> **核心算法:** 主成分分析 (PCA) / 遥感生态指数 (RSEI)
## 📖 项目简介
本项目是一个基于 Google Earth Engine 的自动化遥感生态指数 (RSEI) 计算工具。它集成了 **绿度、湿度、热度、干度** 四大生态指标,利用 **主成分分析 (PCA)** 技术自动构建 RSEI 模型。
**相较于传统版本,本代码解决了以下痛点:**
1. **稳定性修复**: 彻底解决了 GEE 中常见的 `Dimensions mismatch` (矩阵维度不匹配) 错误,采用“客户端权重计算 + 代数加权法”,确保 PCA 永不报错。
2. **可视化增强**: 地图支持 5 层叠加显示 (RSEI + 4个分量),并配备了专属图例。
3. **多维图表**: 内置 3 类统计图表(直方图、均值对比图、分布曲线图),一键分析生态短板。
4. **智能校正**: 自动检测特征向量方向,确保 RSEI 数值逻辑正确 (数值越高,生态越好)。
-----
## 🛠️ 主要功能
### 1\. 四大生态指标自动计算
脚本自动处理 Landsat 8 影像,计算以下指标:
* **🟢 绿度 (Greenness):** 使用 **NDVI** (归一化植被指数) 表征植被覆盖。
* **💧 湿度 (Wetness):** 使用 **Tasseled Cap Wet** (缨帽变换湿度分量) 表征土壤/植被含水量。
* **🔥 热度 (Heat):** 使用 **LST** (地表温度) 表征城市热岛效应。
* **🏜️ 干度 (Dryness):** 使用 **NDBSI** (建筑指数 SI + 裸土指数 IBI) 表征地表硬化程度。
### 2\. 交互式分析面板
* **时间滑块**: 自由选择年份 (2014-2023),默认筛选夏季 (6-9月) 影像以获得最佳植被表现

* **图层管理**: 可在地图上自由切换查看单一分量,通过颜色直观判断区域是“太热”还是“太干”。

* **图表看板**:
* **RSEI 分布图**: 了解整体生态得分分布。

* **分量均值对比**: 快速识别该区域的主要生态制约因素。

* **数值分布曲线**: 详细查看各指标的数据分布形态。

### 3\. 结果导出
支持一键将计算好的 RSEI 结果导出为 **GeoTIFF** 格式至 Google Drive,保留地理坐标,方便在 ArcGIS/QGIS 中进一步制图。

-----
## 🚀 快速开始
### 1\. 设置分析区域 (ROI)
代码默认使用了我的测试 Asset ID,**请务必修改为你自己的区域**,否则可能无法运行或权限报错。
找到代码第 **13** 行:
```javascript
// ❌ 原始代码 (可能无权限)
var roi = ee.FeatureCollection("projects/maxhecheng/assets/haidian");
// ✅ 修改方式 1: 使用你上传的 Shapefile (Asset ID)
var roi = ee.FeatureCollection("users/你的用户名/你的文件名");
// ✅ 修改方式 2: 使用简单的几何点缓冲区 (测试用)
var roi = ee.Geometry.Point([116.3, 39.95]).buffer(10000);
```
### 2\. 运行代码
1. 将完整代码复制到 [GEE Code Editor](https://code.earthengine.google.com/)。
2. 点击上方的 **Run** 按钮。
3. 在右侧面板选择年份,点击 **"🚀 开始全指标分析"**。
-----
## 📊 结果解读指南
### 图层颜色说明
| 图层 | 颜色条 | 含义 |
| :--- | :--- | :--- |
| **RSEI (生态指数)** | 红 ➝ 绿 | **绿色**越深,生态质量越**好** |
| **绿度 (NDVI)** | 白 ➝ 绿 | **绿色**越深,植被越茂密 |
| **湿度 (Wet)** | 灰 ➝ 蓝 | **蓝色**越深,水分越充足 |
| **热度 (LST)** | 蓝 ➝ 红 | **红色**越深,地表温度越**高** (负面) |
| **干度 (Dry)** | 绿 ➝ 红 | **红色**越深,建筑/裸土越**多** (负面) |
### 图表分析技巧
* **柱状图 (均值对比)**:
* 如果 **干度 (Dry)** 柱子最高:说明该区域建筑密度大,硬化严重。
* 如果 **热度 (Heat)** 柱子最高:说明热岛效应是主要问题。
* 如果 **绿度 (Green)** 柱子很低:说明缺绿。
* **曲线图**:
* 理想的生态城市,绿度和湿度曲线应偏右 (高值),热度和干度曲线应偏左 (低值)。
### GEE界面总览

-----
## ⚠️ 常见问题 (FAQ)
**Q: 为什么提示 "No images found"?**
A:可能是该年份在选定区域云量过多 (代码默认过滤 \>30% 云量)。
* **解决方法**: 尝试更换年份,或在代码中调整 `CLOUD_COVER` 阈值,或放宽日期范围。
**Q: 为什么 RSEI 只有 0 或 1?**
A: 这种情况通常是极端值归一化导致的。
* **解决方法**: 代码中已设置 `bestEffort: true` 和较大的 `scale` 来缓解此问题。如果依然出现,说明区域内可能有异常像素(如大面积水体或云)。
**Q: 为什么 PC1 计算不会报错了?**
A: 传统写法直接在 Server 端进行矩阵相乘,容易因像素对齐问题导致 `Dimensions mismatch`。本版本采用了**混合计算法**:先在 Client 端获取特征向量权重,再用简单的代数加权公式生成 PC1,稳定性提升 100%。
-----
# 7、VIIRS 夜间灯光监测工具
这是一个基于 **Google Earth Engine (GEE)** 的交互式应用程序,用于监测、分析和下载 NOAA VIIRS 月度夜间灯光数据。该工具集成了动态可视化、时序分析、GIF 动图生成以及**批量数据导出到 Google Drive** 的功能。
## ✨ 主要功能

1. **自定义时间范围**: 支持用户输入任意年份范围(2014年至今),一键更新面板数据。
>注意不一定是最新的今天,因为 GEE 数据更新会有一定延迟

2. **交互式图层浏览**:
* **年份滑块**: 加载指定年份的所有月度数据。
* **月份滑块**: 快速切换当前年份下的月份图层,查看细节。

注意图层处也可以选择显示某年某月的数据

3. **时序趋势分析**: 集成交互式图表,点击图表上的数据点,地图会自动跳转到对应的年份和月份。
4. **GIF 动图生成**:
* 自动生成所选时间段内的灯光变化动图。
* **直接下载链接**: 提供生成的 `.gif` 文件下载链接,无需通过 Drive 即可保存预览。
*

5. **数据批量导出 (增强功能)**:
* **按月批量导出**: 一键将选中年份的所有月度影像导出到 Google Drive (Tasks)。
* **均值导出**: 导出整个时间段内的平均灯光强度图。
*


## 🛠️ 数据集信息
* **数据源**: `NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG`
* **波段**: `avg_rad` (平均辐射亮度)
* **分辨率**: 约 500米
* **可视化阈值**: 0 (黑) - 60 (白)
## 🚀 快速开始
### 1\. 必要的配置 (重要)
代码中使用了自定义的感兴趣区域 (ROI)。在运行代码前,请务必修改 **第 8 行** 的 `roi` 变量为你自己的资产路径或几何图形。
```javascript
// 修改前
var roi = ee.FeatureCollection("projects/maxhecheng/assets/chengdu");
// 修改示例 (使用几何图形)
// var roi = ee.Geometry.Polygon([...]);
// 或者使用你自己的 table assets
// var roi = ee.FeatureCollection("users/your_username/your_shapefile");
```
### 2\. 使用指南
#### 🕒 设置时间
在左侧面板顶部输入**开始年份**和**结束年份**,点击 **`🔄 更新并刷新`** 按钮。系统将重新计算图表并加载数据。
#### 🗺️ 浏览地图
* 拖动 **年份滑块** 加载特定年份的数据。
* 拖动 **月份滑块** 在地图上切换 1-12 月的显示。
#### 📊 趋势分析
点击左侧面板下方的折线图。点击图表上的任意一点,地图会自动跳转到该时间点,方便对比异常值。
#### 💾 数据下载
* **导出当前年份**: 点击 `📥 导出当前选中年份的所有月度数据`。
* *操作*: 此时右侧 **Tasks** 面板会出现 12 个任务,点击 `Run` 即可保存到 Google Drive 的 `VIIRS_Export_YYYY` 文件夹中。
* **导出均值**: 点击 `📥 导出整个时段的平均值图` 保存多主要时段的平均影像。
#### 🎞️ 动图下载
地图右下角会自动生成预览动图。点击下方的蓝色链接 **`⬇️ 点击下载 .gif 动图`** 即可直接将动图保存到本地。
## 📂 输出文件说明
| 导出类型 | 文件命名格式 | 存储位置 (Drive) |
| :--- | :--- | :--- |
| **月度数据** | `VIIRS_YYYY_MM.tif` | 文件夹: `VIIRS_Export_YYYY` |
| **均值数据** | `VIIRS_Mean_StartYear_EndYear.tif` | 文件夹: `VIIRS_Export_Mean` |
## ⚠️ 注意事项
1. **Tasks 面板**: 点击导出按钮后,必须去 GEE 编辑器右侧的 `Tasks` 选项卡点击 `Run` 才能真正开始下载。
2. **GIF 生成速度**: 如果研究区域 (ROI) 非常大,生成 GIF 下载链接可能需要几秒钟到几分钟的时间。
3. **数据缺失**: 如果某一年份 NOAA 没有数据(或尚未发布),控制台会打印 "⚠️ 无数据" 的提示。
# 8、 基于 GEE 通过 NDVI 进行作物产量预测
**GEE Crop Yield Prediction Professional Platform**
这是一个基于 **Google Earth Engine (GEE)** 云计算平台开发的交互式农业监测工具。该平台集成了多源遥感数据(Sentinel-2 与 Landsat 8/9),通过自动化的去云处理和植被指数计算,实现对特定区域作物的长势监测与产量潜力估算。
## ✨ 核心功能
* **多源卫星支持**: 支持 **Sentinel-2** (10m, 5天重访) 和 **Landsat 8/9** (30m, 16天重访) 数据无缝切换。
* **自动化预处理**: 内置针对不同传感器的 QA 波段去云算法,自动剔除云和云影干扰。
* **动态产量建模**: 基于生长季最大 NDVI (Max Value Composite) 的产量估算模型。
* **交互式分析面板**:
* **实时图表**: 自动生成 NDVI 时序生长曲线、产量分布直方图。
* **统计指标**: 自动计算并显示区域内的平均产量(吨/公顷)。
* **动态图例**: 地图左下角根据数据自动渲染图例组件。

## 🛠️ 算法与数据处理
### 1\. 数据清洗机制
脚本根据选择的卫星源自动匹配处理流程:
* **Sentinel-2**: 使用 `QA60` 波段。
* [cite_start]逻辑: 屏蔽 Bit 10 (不透明云) 和 Bit 11 (卷云) [cite: 10, 11, 12]。
* [cite_start]阈值: 过滤云量 \> 20% 的影像 [cite: 14]。
* **Landsat 8/9**: 使用 `QA_PIXEL` 波段。
* [cite_start]逻辑: 屏蔽 Bit 3 (云) 和 Bit 4 (云影) [cite: 17]。
* [cite_start]校正: 应用 Scale Factor (`0.0000275 * DN - 0.2`) 转换为地表反射率 [cite: 18]。
### 2\. 产量预测模型 (核心逻辑)
本平台采用基于植被指数的经验回归模型:
1. [cite_start]**特征提取**: 计算时间窗口内的 **最大 NDVI** (`seasonalMaxNDVI`),代表作物生长最旺盛时期的状态 [cite: 26]。
2. [cite_start]**非耕地掩膜**: 剔除 NDVI \< 0.25 的像素(水体、裸土、建筑)[cite: 28]。
3. **估算公式 (示例)**:
$$Yield (t/ha) = 12.5 \times NDVI_{max} - 1.5$$
[cite_start]*(注:此为演示参数,实际应用请参考“开发者自定义指南”进行修改)* [cite: 27]。
-----
## 🚀 快速使用指南
1. **启动平台**: 在 GEE Code Editor 中运行脚本。
2. **设置参数** (左侧面板):
**Region**: 选择预设的示范区(如:河南驻马店-冬小麦)。
**Satellite**: 选择数据源(推荐 Sentinel-2 以获得更高清晰度)。
**Date Range**: 输入作物生长季的开始与结束日期 (格式 YYYY-MM-DD)。
3. **执行分析**: 点击 **"执行分析 / Run Analysis"** 按钮 。
4. **查看结果**:
* **地图**: 查看产量空间分布(红=低产,绿=高产)。
**图表**: 底部面板显示生长曲线与产量分布。
**数据**: 面板显示具体的“区域平均产量”数值。
-----
## 🔧 开发者自定义指南 (修改源码)
本节详细说明如何修改代码以适配您自己的研究区域和农学模型。
### 4.1 如何自定义研究区域 (ROI)
默认代码使用矩形坐标。您可以通过修改 `rois` 对象来添加新区域。

**步骤:**
1. 找到代码顶部的 **14 - 18 行** 左右的 `var rois = { ... };` 部分。
```javascript
var rois = {
'河南驻马店 (冬小麦)': ee.Geometry.Rectangle([114.0, 32.8, 114.2, 33.0]),
'黑龙江建三江 (水稻)': ee.Geometry.Rectangle([132.5, 47.1, 132.7, 47.3]),
'山东德州 (夏玉米)': ee.Geometry.Rectangle([116.2, 37.3, 116.4, 37.5])
};
```
2. **方法 A (添加坐标)**: 如果您知道经纬度范围。
```javascript
var rois = {
// 格式: [最小经度, 最小纬度, 最大经度, 最大纬度]
'我的自定义区域': ee.Geometry.Rectangle([115.0, 34.0, 115.5, 34.5]),
// ...保留其他区域
};
```
3. **方法 B (使用 Shapefile)**: 如果您上传了矢量文件到 Assets。
```javascript
var rois = {
// 必须使用 .geometry() 获取边界
'我的县域边界': ee.FeatureCollection("users/您的用户名/您的文件名").geometry(),
};
```
4. 修改后,重新运行代码,下拉菜单中即会出现新选项。
### 4.2 如何修改产量预测公式
默认公式仅为线性演示。请根据您的地面实测数据进行修改。
**步骤:**
1. 定位到 `runAnalysis` 函数内部,约 **第 184-186 行** 。
2. 找到以下代码段:
```javascript
var predictedYield = seasonalMaxNDVI.expression(
'12.5 * NDVI - 1.5', {'NDVI': seasonalMaxNDVI}
).rename('Yield_Prediction');
```
3. **修改场景示例**:
* **场景 1: 调整线性系数** (例如:$y = 20x + 5$)
将 `'12.5 * NDVI - 1.5'` 修改为 `'20 * NDVI + 5'`。
* **场景 2: 二次多项式模型** (例如:$y = -10x^2 + 15x$)
修改为 `'(-10 * NDVI * NDVI) + (15 * NDVI)'`。
* **场景 3: 指数模型** (例如:$y = 5 \times e^{2x}$)
修改为 `'5 * exp(2 * NDVI)'`。
### 4.3 如何调整可视化阈值
如果修改公式后,地图显示的颜色全红或全绿,说明预测值超出了预设的显示范围 (2-10 t/ha)。
**步骤:**
1. 定位到 **第 195 行** 左右:
```javascript
var yieldVis = {min: 2, max: 10, palette: [...]};
```
2. 根据您的产量范围修改 `min` (最小值) 和 `max` (最大值)。
* *例如:如果是单产较高的玉米,可能需要设置为 `{min: 5, max: 15}`。*




-----
## ⚠️ 注意事项
1. **云量影响**: 如果选定的时间窗口内阴雨天气过多,Sentinel-2 可能因云量过滤导致部分区域出现空洞(无数据)。此时建议:
* 扩大时间窗口。
* 切换为 Landsat 卫星(重访周期不同,可能正好有晴空数据)。
2. [cite_start]**尺度效应**: 图表统计中的 `.scale(30)` 参数 [cite: 34] 决定了计算精度。对于极大区域(如全省),建议将其调大(如 100或500),以避免 GEE 计算超时 (Computation Time Out)。
3. **模型适用性**: 本工具提供的仅为计算框架。**严禁直接使用默认参数 (12.5, -1.5) 进行真实的农业投产决策**,必须结合当地农学实验数据进行参数本地化校准。
-----
# 9、基于 GEE 的区域蒸散发时序分析与动态评估系统
基于 Google Earth Engine (GEE) Code Editor 的交互式脚本,用于区域蒸散(ET)监测。支持多种数据集、动态图例、投影修复、时序图表、均值影像显示以及动画 GIF 生成。

## 主要特性
- **支持多种ET数据集**
- MOD16A2GF(MODIS 全球 ET/PET)
- PML_V2(高精度 ET 及组分:ET_water、Ec、Es、Ei、GPP)
- **区域加载优化**:从 Assets 加载矢量边界,自动简化几何并修复投影问题,避免常见报错
- **动态图例**:每次可视化时自动生成并更新图例(包含单位和数值标签)
- **交互式UI面板**:清晰的分区操作(区域加载 → 时间选择 → 数据/波段选择 → 分析)
- **核心功能**
- 计算并显示指定时段的均值影像
- 生成区域内时序变化折线图
- 提供均值影像 GeoTIFF 下载链接
- 生成并下载动画 GIF(带图例)
- **稳定性增强**:强制重投影为 EPSG:4326,解决部分数据集投影不一致导致的错误
| 数据源名称 | 数据集 ID | 可用波段 (Bands) | 分辨率 | 说明 |
| :--------- | :----------------------------- | :-------------------------------------------------- | :----- | :----------------------- |
| MOD16A2 | MODIS/061/MOD16A2GF | ET (总蒸散发)
PET (潜在蒸散发) | 500m | NASA 经典全球ET产品 |
| PML_V2 | CAS/IGSNRR/PML/V2_v018 | ET_water (水体蒸发)
Ec (植被截留)
Es (土壤蒸发)
Ei (冠层蒸腾)
GPP (初级生产力) | 500m | 结合彭曼公式的高精度产品 |

## 使用方法
1. 打开 [Google Earth Engine Code Editor](https://code.earthengine.google.com/)
2. 新建一个脚本,将下方完整代码复制粘贴进去
3. 点击 **Run** 运行脚本
4. 左侧将出现控制面板,按照顺序操作即可:
### 操作步骤
1. **区域选择**


- 在文本框中输入你的 Assets 矢量表 ID(如 `users/yourname/your_region`)
- 点击 **“加载并修复区域几何”**
- 成功后地图会居中显示红色边界
2. **时间与数据选择**
- 使用两个 DateSlider 分别设置起始和结束时间(默认 2022 年上半年)
- 选择数据集(默认 MOD16A2)
- 选择需要显示的波段(会根据数据集自动更新选项)

3. **执行分析**
- 点击 **“执行分析”**:
- 显示时段均值影像
- 自动生成动态图例
- 显示区域平均值时序图
- 提供 GeoTIFF 下载链接

- 点击 **“生成动图”**:
- 生成时间序列动画 GIF
- 显示缩略图并提供下载链接

## 注意事项
- 确保你的 Assets 矢量表已共享给 Earth Engine(至少读取权限)
- 大区域或长时间范围可能导致计算超时,建议先用小区域测试
- PML_V2 数据集的 GPP 波段单位特殊(gC/m²/8day),脚本已自动处理
- 动图生成时使用了 EPSG:3857 投影以获得更好的视觉效果
- 脚本已尽量优化稳定性,如仍出现投影错误,可尝试进一步降低 `simplify(100)` 的容差值
## 代码说明(可选阅读)
- `DATA_CONFIG`:集中管理数据集参数,便于后续扩展
- `updateLegend()`:动态创建/移除图例,避免图例叠加
- `processCol()`:统一处理集合,包括强制重投影和单位缩放
- 所有可视化参数均可根据需要调整(位于 `DATA_CONFIG` 或 `COMMON_PALETTE`)
# Sentinel-2 水体叶绿素 a (Chl-a) 质量浓度反演工具
[](https://earthengine.google.com/)
[](https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED)
## 项目简介
本工具是一个基于 **Google Earth Engine (GEE)** 平台的交互式遥感监测系统,利用 **Sentinel-2** 多光谱影像,通过 **NDCI (Normalized Difference Chlorophyll Index)** 算法反演水体叶绿素 a (Chl-a) 质量浓度。
主要功能包括:
- 动态时间范围选择
- 用户自定义感兴趣区域 (ROI) 绘制
- 自动去云处理与水体掩膜提取
- 叶绿素 a 浓度空间分布可视化
- 时间序列趋势图表分析
- 区域统计信息显示
- 结果导出至 Google Drive (GeoTIFF 格式)
适用于湖泊、河流、水库等内陆水体的富营养化监测与水质评估。
## 算法原理
### 1. 去云处理
使用 Sentinel-2 的 QA60 波段去除浓云与卷云影响,同时将反射率乘以 0.0001 进行尺度转换。
### 2. 水体提取
采用 **MNDWI (Modified Normalized Difference Water Index)**:
```
MNDWI = (Green - SWIR1) / (Green + SWIR1)
```
水体阈值:MNDWI > 0
### 3. 叶绿素 a 反演
采用 **NDCI (Normalized Difference Chlorophyll Index)**:
```
NDCI = (Red Edge - Red) / (Red Edge + Red) // 对应 Sentinel-2 的 B5 和 B4
```
经验线性模型(针对中国典型内陆水体):
```
Chl-a (mg/m³) = NDCI × 14.5 + 15.0
```
> 注意:该经验公式基于特定区域实测数据拟合,仅供参考。不同水体类型可能需要重新校准。
## 使用说明
### 第一步:设置时间范围
在左侧控制面板中修改起始日期和结束日期(格式:`YYYY-MM-DD`)。
默认范围:2023-01-01 至 2023-12-31

### 第二步:绘制感兴趣区域 (ROI)
1. 点击地图左侧绘图工具栏(矩形、多边形等)
2. 在地图上绘制或选择监测区域
3. 如不绘制,默认使用当前地图视口范围(本次以翻阳湖为例)

三图层展示


### 第三步:执行分析
点击 **🚀 执行分析** 按钮,系统将自动:

- 筛选云量 < 20% 的影像
- 计算中值合成影像
- 显示真彩色、水体指数、Chl-a 浓度图层
- 生成时间序列趋势图

- 计算区域平均浓度
- 添加浓度图例
### 第四步:导出结果
分析完成后会出现 **💾 导出分析结果** 按钮,点击即可将 Chl-a 浓度栅格导出至 Google Drive。

## 可视化参数
### Chl-a 浓度图层配色方案
| 浓度范围 (mg/m³) | 等级 | 颜色 |
|------------------|--------|-----------|
| 0 - 10 | 极低 | 深蓝 |
| 10 - 20 | 低 | 青色 |
| 20 - 30 | 中 | 绿色 |
| 30 - 40 | 较高 | 黄色 |
| 40 - 50 | 高 | 橙色 |
| 50+ | 极高 | 红色 |

## 在Qgis中成像
## 注意事项
- 大区域 + 长时段可能导致计算超时,建议:
- 缩小时间范围
- 减小 ROI 面积
- 工具已优化 `scale` 和 `maxPixels`,可处理较大水域
- 冬季或高纬度地区影像较少,可能无数据返回
- 结果仅为遥感反演估算值,建议结合实地采样验证
# 11、GLC_FCS30D 2020 年土地覆盖分析工具
## 项目概述
本项目是一个基于 **Google Earth Engine (GEE) JavaScript** 的交互式土地覆盖分析工具,使用 **GLC_FCS30D** 2020 年全球 30m 分辨率土地覆盖数据集,对指定区域(示例中为北京市海淀区)进行可视化、统计与导出。
主要功能包括:
- 支持**精细分类(35 类)**与**主要大类(14 类)**两种显示模式
- 交互式地图显示与图例
- 面积统计并绘制**饼图(占比)**与**柱状图(面积)**
- 一键导出裁剪后的 TIF 影像与 CSV 统计表格
## 示例运行结果(海淀区)
### 图1:GLC_FCS30D 2020 年土地覆盖地图(精细分类)

(绿色区域主要为常绿/落叶林,黄色为旱地农田,灰色/红色为城市不透水面)
### 图2:土地覆盖占比饼图(主要大类简化后)

主要类别占比(示例数据):
- 旱地农田:20.1%
- 城市/不透水:48.5%
- 灌溉农田:10.2%
- 落叶阔叶(密):8.2%
- 其他类别占比合计约 13%
### 图3:各类别面积柱状图

城市/不透水面积最高(约 208 km²),旱地农田次之(约 86 km²),草本覆盖约 43 km²。
### 图4:统计表格(CSV 示例)


| 类别 | 面积 (km²) |
|--------------|---------------|
| 旱地农田 | 86.411835 |
| 草本覆盖 | 86.4116876 |
| 灌溉农田 | 43.80251701 |
| 城市/不透水 | 208.7849357 |
| ... | ... |
(实际数据以导出的 CSV 为准)
## 代码说明
### 1. 数据源加载
```javascript
var dataset = ee.ImageCollection("projects/sat-io/open-datasets/GLC-FCS30D/annual");
var lc2020 = dataset.mosaic().select('b21'); // 选取2020年波段
```
### 2. 分类体系与可视化参数
精细分类(35 类):使用原始分类值(10~220),定义了完整的颜色调色板 palette 与中文名称 classNamesCN
主要大类(14 类):通过 remap() 将 35 类合并为 14 个主要类别,便于宏观分析
### 3. 研究区(AOI)设置(代码 第 46行)
```javascript
JavaScriptvar aoiFc = ee.FeatureCollection('projects/maxhecheng/assets/haidian'); // 请替换为自己的资产路径
var aoi = aoiFc.geometry();
修改提示:将上述路径更换为您自己的行政区划或自定义区域资产。
```
### 4. 交互界面(UI Panel)
图层选择下拉框(精细/主要分类)
“统计面积并绘图”按钮:计算各类别面积并生成饼图+柱状图
- 导出按钮:
- 导出 TIF 影像(30m 分辨率,裁剪至 AOI)
- 导出 CSV 统计表格(类别 + 面积 km²)

### 5. 核心统计函数(generateStats)
关键改进点:
使用` updateMask(img.gt(0)) `排除值为 0 的像元,避免统计错误
`ee.Reducer.sum().group()` 按类别汇总面积
通过字典 `idToNameDict / majorIdToNameDict` 将类别 ID 转换为中文名称
使用` bestEffort: true `防止大区域计算内存溢出
### 6. 图例动态刷新
根据当前显示模式自动更新右下角图例。
使用方法
打开` Google Earth Engine Code Editor`https://code.earthengine.google.com/
新建脚本,粘贴全部代码
修改 AOI 路径 为您自己的区域资产```(代码 第 46行)```
```javascript
JavaScriptvar aoiFc = ee.FeatureCollection('projects/maxhecheng/assets/haidian'); // 请替换为自己的资产路径
var aoi = aoiFc.geometry();
修改提示:将上述路径更换为您自己的行政区划或自定义区域资产。
```
```年份切换```b21 是 20 年 , b20 是 19 年
GLC_FCS30D数据集的波段与年份对应关系:
b1 = 2002年
b2 = 2003年
...
b21 = 2020年(当前设置)
b22 = 2021年
```javascript
// b21 波段代表 2020 年
var lc2020 = dataset.mosaic().select('b21');
```
点击 Run 运行
在左侧面板选择图层、点击统计按钮查看结果
使用导出按钮将影像或表格保存到 Google Drive
### 7.完整代码
```javascript
// ===============================================================
// GLC_FCS30D 2020年 土地覆盖分析工具
// ===============================================================
// 1. 数据源初始化:GLC_FCS30D annual 瓦片拼接
var dataset = ee.ImageCollection("projects/sat-io/open-datasets/GLC-FCS30D/annual");
// b21 波段代表 2020 年
var lc2020 = dataset.mosaic().select('b21');
// ==================== 2. 定义可视化参数与中文名称 ====================
// --- A. 精细分类 (35类) ---
var palette = [
'#ffff64', '#ffff64', '#aaf0f0', '#006400', '#704489', '#9d6969', '#00ff00', '#00d000',
'#8fad8f', '#006400', '#00a000', '#003c00', '#285000', '#286400', '#788200', '#8ca000',
'#be9600', '#966400', '#ffb432', '#ffdcd2', '#ff0000', '#a0a0a0', '#003c00', '#c31400',
'#fff5d7', '#d7d7d7', '#a0a0a0', '#ffc0c0', '#003c00'
];
var classIds = [
10, 11, 12, 20, 51, 52, 61, 62, 71, 72, 81, 82, 91, 92,
120, 121, 122, 130, 140, 150, 160, 170, 180, 190, 200, 201, 202, 210, 220
];
var classNamesCN = [
'旱地农田', '草本覆盖', '乔木/灌木', '灌溉农田', '常绿阔叶(疏)', '常绿阔叶(密)',
'落叶阔叶(疏)', '落叶阔叶(密)', '常绿针叶(疏)', '常绿针叶(密)', '落叶针叶(疏)', '落叶针叶(密)',
'混交林(疏)', '混交林(密)', '灌木地', '常绿灌木', '落叶灌木', '草地', '地衣苔藓', '稀疏植被',
'淡水淹没林', '咸水淹没林', '淹没灌木/草', '城市/不透水', '裸地', '固结裸地', '未固结裸地',
'水体', '冰雪'
];
var idToNameDict = ee.Dictionary.fromLists(classIds.map(function(n){ return String(n) }), classNamesCN);
// --- B. 主要大类 (14类简化) ---
var majorRemap = lc2020.remap(
classIds,
[1,1,1,2,3,3,4,4,5,5,6,6,7,7,8,8,8,9,10,11,12,12,12,13,14,14,14,15,16], 0
);
var majorPalette = [
'#ffff64', '#aaf0f0', '#006400', '#00ff00', '#8fad8f', '#00a000', '#285000',
'#788200', '#ffb432', '#ff0000', '#c31400', '#fff5d7', '#ffc0c0', '#d7d7d7'
];
var majorNamesCN = [
'农田', '灌溉农田', '常绿阔叶', '落叶阔叶', '常绿针叶', '落叶针叶', '混交林',
'灌木/草地', '稀疏/苔藓', '淹没植被', '城市', '裸地', '水体', '冰雪'
];
// 构建简化的字典用于统计
var majorIdList = [1,2,3,4,5,6,7,8,9,12,13,14,15,16];
var majorIdToNameDict = ee.Dictionary.fromLists(majorIdList.map(function(n){ return String(n) }), majorNamesCN);
// ==================== 3. 区域设置 (AOI) - 极简模式 ====================
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 请在这里修改你的路径 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
var aoiFc = ee.FeatureCollection('projects/maxhecheng/assets/haidian');
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
var aoi = aoiFc.geometry();
Map.centerObject(aoiFc, 10);
// ==================== 4. UI 面板 ====================
var panel = ui.Panel({style: {width: '400px', padding: '10px'}});
ui.root.insert(0, panel);
panel.add(ui.Label('GLC_FCS30D 2020 土地覆盖', {fontSize: '18px', fontWeight: 'bold'}));
// 图层切换
var layerSelect = ui.Select({
items: ['精细分类 (35类)', '主要大类 (14类)'],
value: '精细分类 (35类)',
onChange: updateMap
});
panel.add(ui.Label('图层选择:'));
panel.add(layerSelect);
// 统计按钮
var chartPanel = ui.Panel();
var btnStats = ui.Button('📊 统计面积并绘图', generateStats);
panel.add(btnStats);
panel.add(chartPanel);
// 导出按钮
panel.add(ui.Label('数据导出:', {fontWeight: 'bold', margin: '10px'}));
var btnExpImg = ui.Button('导出 TIF 影像', function() {
Export.image.toDrive({
image: lc2020.clip(aoi),
description: 'GLC2020_Export',
folder: 'GEE_Exports',
region: aoi,
scale: 30,
maxPixels: 1e13
});
print('影像导出任务已创建');
});
var btnExpTab = ui.Button('导出 CSV 表格', function() {
generateStats(true); // 调用统计并触发导出
print('表格导出任务已创建');
});
panel.add(ui.Panel([btnExpImg, btnExpTab], ui.Panel.Layout.flow('horizontal')));
// ==================== 5. 逻辑函数 ====================
function updateMap() {
Map.layers().reset();
Map.addLayer(aoiFc.style({color: 'red', fillColor: '00000000', width: 2}), {}, 'AOI');
var mode = layerSelect.getValue();
if (mode === '主要大类 (14类)') {
Map.addLayer(majorRemap.clip(aoi), {min: 1, max: 16, palette: majorPalette}, '主要分类');
updateLegend(majorNamesCN, majorPalette);
} else {
Map.addLayer(lc2020.clip(aoi), {min: 10, max: 220, palette: palette}, '精细分类');
updateLegend(classNamesCN, palette);
}
}
// 简单的图例刷新
var legendPanel = ui.Panel({style: {position: 'bottom-right', padding: '8px', backgroundColor: 'white'}});
Map.add(legendPanel);
function updateLegend(names, colors) {
legendPanel.clear();
legendPanel.add(ui.Label('图例', {fontWeight: 'bold'}));
for (var i = 0; i < names.length; i++) {
if(i >= colors.length) break;
legendPanel.add(ui.Panel([
ui.Label('', {backgroundColor: colors[i], padding: '8px', margin: '0 8px 0 0'}),
ui.Label(names[i])
], ui.Panel.Layout.flow('horizontal')));
}
}
// 统计核心 (含Pie Chart string修复)
function generateStats(isExport) {
if(!isExport) {
chartPanel.clear();
chartPanel.add(ui.Label('计算中...'));
}
var mode = layerSelect.getValue();
var isMajor = mode === '主要大类 (14类)';
var img = isMajor ? majorRemap : lc2020;
// ================= 修复代码开始 =================
// 将值为 0 的像元设为透明(不参与统计),防止字典查找报错
img = img.updateMask(img.gt(0));
// ================= 修复代码结束 =================
var areaImg = ee.Image.pixelArea().divide(1e6).addBands(img.rename('class'));
var stats = areaImg.reduceRegion({
reducer: ee.Reducer.sum().group({groupField: 1, groupName: 'classId'}),
geometry: aoi,
scale: 30,
maxPixels: 1e13,
bestEffort: true // 建议加上这个,防止大面积计算时内存溢出
});
var groupList = ee.List(stats.get('groups'));
var chartFc = ee.FeatureCollection(groupList.map(function(item) {
var d = ee.Dictionary(item);
// 将数字转为整数再转字符串,确保格式匹配(如 10.0 -> "10")
var cIdStr = ee.Number(d.get('classId')).format('%d');
var dictToUse = isMajor ? majorIdToNameDict : idToNameDict;
// 使用 get 的第二个参数作为默认值,彻底防止报错
var name = dictToUse.get(cIdStr, '未定义类别');
return ee.Feature(null, {'类别': name, '面积(km²)': d.get('sum'), 'Label': name});
}));
if (isExport === true) {
Export.table.toDrive({
collection: chartFc,
description: 'GLC2020_Stats',
folder: 'GEE_Exports',
fileFormat: 'CSV',
selectors: ['类别', '面积(km²)']
});
return;
}
// 绘图
var pieChart = ui.Chart.feature.byFeature(chartFc, 'Label', '面积(km²)')
.setChartType('PieChart')
.setOptions({title: '占比', colors: isMajor ? majorPalette : palette});
var colChart = ui.Chart.feature.byFeature(chartFc, 'Label', '面积(km²)')
.setChartType('ColumnChart')
.setOptions({title: '面积统计', legend: {position: 'none'}, colors: ['#1E90FF']});
chartPanel.clear();
chartPanel.add(pieChart);
chartPanel.add(colChart);
}
// 初始化运行
updateMap();
```