遥感物候检测

NOVA Invasives

利用 Sentinel-2 卫星的物候信号差异,在 Google Earth Engine 上识别葛藤、芦苇等入侵物种的分布区域。

研究区域

5 个监测点位

点击地图上的圆点查看每个地点的入侵物种、GEE 坐标代码和检测特征。绿色虚线框是整个研究区域(北弗吉尼亚 bounding box)。

Loading map…
葛藤热点常春藤热点芦苇湿地本土森林对照

检测原理

为什么卫星能看出入侵植物?

关键在于物候差异:入侵植物和本土植物的发芽 / 落叶时间不同,这个时间差在卫星时间序列里清晰可见。

NDVI 是什么

NDVI = (NIR − RED) / (NIR + RED)

植物叶子吸收红光做光合作用,同时强烈反射近红外光。NDVI 把这个比值归一化到 [-1, +1],值越高代表植被越茂密。Sentinel-2 用 B8(近红外)和 B4(红光)来计算。

水体< 0
裸土0–0.2
稀疏植被0.2–0.5
茂密植被> 0.5

物候检测窗口

早春 (3–4月) · 晚秋 (10–11月)

入侵灌木比本土落叶树早 2–3 周发芽,晚 2–3 周落叶。在这两个窗口期,入侵植物的 NDVI 显著高于周围本土植被,形成可检测的信号。

早春窗口3–4月
夏季高峰6–8月
晚秋窗口10–11月
冬季(常绿异常)12–2月
01_ndvi_concept.png
NDVI concept

模拟分析

物候曲线对比

用模拟数据验证核心假设:橙色阴影区(早春)和棕色阴影区(晚秋)是入侵植物和本土植物 NDVI 差异最大的检测窗口。

02_phenology_comparison.png
Phenology comparison

葛藤

Kudzu

夏季 NDVI 异常高 (>0.8)

全年

秋橄榄 / 忍冬

Autumn Olive / Bush Honeysuckle

早春比本土植物早 2-3 周发芽

3–4 月

芦苇

Phragmites australis

NIR 波段反射率持续偏高

夏末

常春藤

English Ivy

冬季保持高 NDVI(常绿)

12–2 月

真实数据

5 个站点的 NDVI 时间序列(Sentinel-2 真实测量)

来自 Google Earth Engine 的实测数据:2019–2024 年共 360 个月度观测点。切换「月度物候」可以看到多年平均的物候曲线,「完整时间序列」展示原始时间序列。点击图例可隐藏特定站点。

加载 NDVI 数据中…

数据源: COPERNICUS/S2_SR_HARMONIZED · 500m 缓冲区 · 月度中位数合成 · 云量<30%

分类结果

基于物候特征的自动分类

用规则分类器(无需训练数据)对每个站点的 4 个季节性 NDVI 特征做判断。规则来自生态学先验:早春提前发芽、晚秋推迟落叶、冬季常绿、夏季爆发——任何一个超过本土对照的阈值就标记为入侵。

戴克沼泽 / 芦苇

本土植被
  • 所有指标与本土对照接近

早春

0.388

夏峰

0.659

晚秋

0.504

冬季

0.316

大瀑布 / 葛藤

本土植被
  • 所有指标与本土对照接近

早春

0.250

夏峰

0.573

晚秋

0.415

冬季

0.199

亨特利湿地 / 芦苇

落叶入侵灌木 (秋橄榄/忍冬型)
  • 早春比对照高 +0.16 (提前发芽)
  • 晚秋比对照高 +0.17 (推迟落叶)

早春

0.525

夏峰

0.847

晚秋

0.672

冬季

0.388

本土森林(对照)

本土植被
  • 所有指标与本土对照接近

早春

0.363

夏峰

0.559

晚秋

0.497

冬季

0.318

斯科茨朗 / 常春藤

本土植被
  • 所有指标与本土对照接近

早春

0.458

夏峰

0.625

晚秋

0.542

冬季

0.385

05_phenology_signatures.png
Seasonal NDVI signatures
06_classification.png
Classification summary

⚠️ 真实数据的解读

目前只有 Huntley Meadows 被分类为入侵植被。其他几个已知热点(Great Falls 的葛藤、Scotts Run 的常春藤、Dyke Marsh 的芦苇)没有被检测出来——这说明 500m 缓冲区可能太大,把入侵斑块和周围本土植被的信号混在一起平均掉了。下一步可以:(1) 缩小缓冲区到 100m;(2) 在更精细的位置打点;(3) 加入纹理特征 / 短波红外波段。

项目脚本

分析 Pipeline

4 个 Python 脚本构成完整的分析流程,每个脚本对应一个阶段。

01

理解 NDVI 概念

01_explore_ndvi_concept.py

用模拟数据画出 NDVI 的定义,以及入侵植物 vs 本土植物的物候曲线。

为什么这么做:在跑真实卫星数据之前,先搞清楚「我们在测量什么」——不需要 GEE 账号就能运行。

输出: 01_ndvi_concept.png · 02_phenology_comparison.png · 03_study_area_map.html

02

GEE 提取真实 NDVI

02_gee_ndvi_timeseries.py

连接 Google Earth Engine,对 5 个研究点提取 2019–2024 年 Sentinel-2 的月度 NDVI 时间序列。

为什么这么做:Sentinel-2 每 5 天过顶一次,6 年下来有几百张图。GEE 在云端并行处理,本地不需要下载任何原始影像。

输出: ndvi_timeseries_nova.csv · 04_gee_ndvi_timeseries.png

03

STAC API 下载 Landsat

03_download_landsat_stac.py

通过 USGS STAC API 下载 Landsat 8/9 的原始波段数据,计算三个季节的 NDVI 地图。

为什么这么做:STAC API 不需要 GEE 账号,是 GEE 的备选方案;Landsat 30m 分辨率适合区域尺度分析。

输出: data/*.tif · outputs/ndvi_*.png

04

物候分类

04_phenology_analysis.py

用早春 / 晚秋的 NDVI 差异特征,给每个站点做规则分类,输出 JSON 给 dashboard。

为什么这么做:这是项目目标:把时间序列信号转化成「这里是不是入侵植物」的判断。

输出: phenology_features.csv · classification.json · 05/06_*.png

GEE 核心工作流 (02_gee_ndvi_timeseries.py)
# 1. 加载 Sentinel-2 数据集(GEE 懒加载,不下载数据)
collection = (
    ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
    .filterBounds(roi)              # ① 只要北弗吉尼亚范围的影像
    .filterDate("2022-03-01", "2022-04-30")  # ② 只要早春
    .filter(ee.Filter.lt("CLOUDY_PIXEL_PERCENTAGE", 30))  # ③ 去云
)

# 2. 对每张图计算 NDVI(在 GEE 云端并行执行)
def add_ndvi(image):
    return image.addBands(
        image.normalizedDifference(["B8", "B4"]).rename("NDVI")
    )

# 3. 合成 + 提取统计值(转化为本地数字)
ndvi_median = collection.map(add_ndvi).select("NDVI").median()
stats = ndvi_median.reduceRegion(
    reducer=ee.Reducer.mean(),
    geometry=roi,    # 500m 缓冲区
    scale=10,        # Sentinel-2 原始分辨率
).getInfo()          # ← 只在这一步才真正触发 GEE 计算

技术栈

Sentinel-2 SRLandsat 8/9NDVI 时间序列物候检测GEE Python API

数据来源: Copernicus Sentinel-2 · USGS Landsat · EDDMapS · iNaturalist

研究区域: Northern Virginia (38.70°N–39.00°N, 77.00°W–77.55°W)