Files
smart-crop-ui/src/FIELD_SATELLITE_IMAGERY_COMPLETE.md

19 KiB
Raw Blame History

🛰️ 地块影像系统 - 时序遥感影像服务完整实现

系统概述

已开发完成时序遥感影像分析系统集成多个卫星数据源Sentinel-2、Landsat-8、天地图、高分系列提供影像查看、时序对比、趋势分析等功能支持作物长势监测和精准农业决策。


📦 核心模块

1. 遥感影像服务 (/lib/satelliteImageService.ts)

完整的遥感影像数据处理服务:

// 核心类
- SatelliteImageService    // 遥感影像服务
  - getFieldImages()        // 获取地块历史影像
  - getTianDiTuImage()      // 获取天地图影像
  - calculateNDVI()         // 计算NDVI
  - calculateEVI()          // 计算EVI
  - calculateSAVI()         // 计算SAVI
  - compareImages()         // 影像对比
  - analyzeTimeSeries()     // 时序分析
  - downloadImage()         // 下载影像

2. 地块影像组件 (/components/field/FieldSatellite.tsx)

用户界面,集成所有遥感影像功能


🎯 1. 多数据源支持

1.1 Sentinel-2 (哨兵2号)

特性:

  • 分辨率10米
  • 重访周期5天
  • 光谱波段B2(蓝)、B3(绿)、B4(红)、B8(近红外)
  • 数据源ESA (欧洲空间局)

优势:

  • 高时间分辨率5天重访
  • 免费开放数据
  • 10米空间分辨率适合农田监测

API接口

const DATA_SOURCES = {
  'Sentinel-2': {
    name: 'Sentinel-2 (哨兵2号)',
    resolution: 10,
    revisitTime: 5,
    bands: ['B2-Blue', 'B3-Green', 'B4-Red', 'B8-NIR'],
    apiEndpoint: 'https://sentinelsat.esa.int/api',
    description: 'ESA哨兵2号卫星10米分辨率5天重访'
  }
};

1.2 Landsat-8

特性:

  • 分辨率30米
  • 重访周期16天
  • 光谱波段B2(蓝)、B3(绿)、B4(红)、B5(近红外)
  • 数据源NASA/USGS

优势:

  • 长时间序列数据1972年至今
  • 免费开放数据
  • 适合大面积区域监测

API接口

'Landsat-8': {
  name: 'Landsat-8',
  resolution: 30,
  revisitTime: 16,
  bands: ['B2-Blue', 'B3-Green', 'B4-Red', 'B5-NIR'],
  apiEndpoint: 'https://earthexplorer.usgs.gov/api',
  description: 'NASA陆地卫星8号30米分辨率16天重访'
}

1.3 天地图

特性:

  • 分辨率2米高分辨率
  • 重访周期1天
  • 数据源:国家地理信息公共服务平台

优势:

  • 超高分辨率
  • 国内覆盖完善
  • 实时更新快

API接口

'天地图': {
  name: '天地图',
  resolution: 2,
  revisitTime: 1,
  bands: ['RGB'],
  apiEndpoint: 'https://t0.tianditu.gov.cn/img_w/wmts',
  description: '国家地理信息公共服务平台,高分辨率影像'
}

使用示例:

const url = `https://t${Math.floor(Math.random() * 8)}.tianditu.gov.cn/img_w/wmts?` +
  `SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&` +
  `TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=${zoom}&TILEROW=${lat}&TILECOL=${lon}&tk=${tk}`;

1.4 高分系列 (GF-1/GF-2)

特性:

  • 分辨率2米
  • 重访周期4天
  • 数据源:中国资源卫星应用中心

优势:

  • 国产高分辨率卫星
  • 针对中国区域优化
  • 多光谱数据

🌿 2. 植被指数计算

2.1 NDVI (归一化植被指数)

公式:

NDVI = (NIR - Red) / (NIR + Red)

实现:

static calculateNDVI(nir: number, red: number): number {
  if (nir + red === 0) return 0;
  return (nir - red) / (nir + red);
}

评价标准:

NDVI值 评价 说明
> 0.8 优秀 长势旺盛,植被覆盖度高
0.6-0.8 良好 长势良好,健康生长
0.4-0.6 一般 长势一般,需要关注
0.2-0.4 较弱 长势较弱,需要加强管理
< 0.2 极弱 无植被或植被极少

应用场景:

  • 作物长势监测
  • 植被覆盖度评估
  • 生长阶段判断
  • 病虫害早期识别

2.2 EVI (增强型植被指数)

公式:

EVI = 2.5 * (NIR - Red) / (NIR + 6 * Red - 7.5 * Blue + 1)

实现:

static calculateEVI(nir: number, red: number, blue: number): number {
  const denominator = nir + 6 * red - 7.5 * blue + 1;
  if (denominator === 0) return 0;
  return 2.5 * (nir - red) / denominator;
}

优势:

  • 对高生物量作物更敏感
  • 减少大气影响
  • 适合密植作物

2.3 SAVI (土壤调节植被指数)

公式:

SAVI = ((NIR - Red) / (NIR + Red + L)) * (1 + L)

其中 L = 0.5 (土壤调节系数)

实现:

static calculateSAVI(nir: number, red: number, L: number = 0.5): number {
  const denominator = nir + red + L;
  if (denominator === 0) return 0;
  return ((nir - red) / denominator) * (1 + L);
}

优势:

  • 减少土壤背景影响
  • 适合稀疏植被
  • 适合早期生长阶段

2.4 LAI (叶面积指数)

说明:

  • 单位土地面积上植物叶片总面积
  • 与NDVI高度相关
  • 反映作物光合作用能力

估算:

lai: ndvi * 5  // 简化估算

📊 3. 时序影像功能

3.1 时间滑块

功能:

  • 拖动滑块查看不同时期影像
  • 实时显示当前日期
  • 显示起止日期范围
  • 支持上一张/下一张导航

实现:

<Slider
  value={timeSliderValue}
  onValueChange={handleTimeSliderChange}
  max={images.length - 1}
  step={1}
  className="w-full"
/>

操作方式:

方式1拖动滑块
方式2点击"<"、">"按钮
方式3直接点击影像列表

3.2 影像列表

显示信息:

  • 📅 日期
  • ☁️ 云量
  • 🛰️ 数据源
  • 📏 分辨率
  • 🌿 NDVI值
  • 📈 EVI值

过滤功能:

// 按云量过滤
const maxCloudCover = 30; // 仅显示云量≤30%的影像

// 按数据源过滤
const source = 'Sentinel-2'; // 仅显示指定数据源

3.3 云量过滤

滑块控制:

<Slider
  value={[maxCloudCover]}
  onValueChange={(value) => setMaxCloudCover(value[0])}
  max={100}
  step={5}
/>

自动过滤:

filtered = images.filter(img => img.cloudCover <= maxCloudCover);

云量评级:

云量范围 质量 颜色 建议
< 10% 优秀 绿色 最佳分析时机
10-20% 良好 黄色 可用于分析
20-30% 一般 橙色 谨慎使用
> 30% 较差 红色 不建议使用

🔍 4. 影像对比分析

4.1 对比功能

操作流程:

  1. 选择对比影像1早期
  2. 选择对比影像2近期
  3. 点击"执行对比"按钮
  4. 查看对比结果

对比指标:

  • NDVI变化量
  • EVI变化量
  • 变化类型(改善/下降/稳定)
  • 变化描述
  • 管理建议

4.2 变化检测

算法实现:

static compareImages(
  image1: SatelliteImage,
  image2: SatelliteImage
): ImageComparisonResult {
  const ndviChange = image2.ndvi - image1.ndvi;
  const eviChange = image2.evi - image1.evi;
  
  // 确定变化类型
  let changeType: 'improvement' | 'decline' | 'stable';
  if (ndviChange > 0.1) {
    changeType = 'improvement';
  } else if (ndviChange < -0.1) {
    changeType = 'decline';
  } else {
    changeType = 'stable';
  }
  
  return { image1, image2, ndviChange, eviChange, changeType, ... };
}

变化阈值:

NDVI变化 类型 说明
> +0.2 显著改善 植被覆盖度显著增加
+0.1 ~ +0.2 有所改善 植被覆盖度有所增加
-0.1 ~ +0.1 基本稳定 植被覆盖度基本稳定
-0.2 ~ -0.1 有所下降 植被覆盖度有所下降
< -0.2 显著下降 植被覆盖度显著下降

4.3 智能建议

改善场景:

recommendations = [
  '继续保持当前管理措施',
  '适时进行田间观察,记录生长情况',
  '注意防范极端天气影响'
];

下降场景:

recommendations = [
  '建议增加灌溉频次,确保水分供应',
  '检查是否存在病虫害,及时防治',
  '适当追施氮肥,促进作物生长'
];

稳定场景:

recommendations = [
  '维持现有灌溉和施肥计划',
  '定期监测作物生长状态'
];

📈 5. 时序分析

5.1 趋势分析

算法:简单线性回归

private static _calculateTrend(values: number[]): 'increasing' | 'decreasing' | 'fluctuating' | 'stable' {
  const n = values.length;
  const sumX = (n * (n - 1)) / 2;
  const sumY = values.reduce((a, b) => a + b, 0);
  const sumXY = values.reduce((sum, y, x) => sum + x * y, 0);
  const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;
  
  const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
  
  // 计算波动性
  const mean = sumY / n;
  const variance = values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / n;
  const stdDev = Math.sqrt(variance);
  
  if (Math.abs(slope) < 0.01 && stdDev < 0.05) {
    return 'stable';
  } else if (stdDev > 0.15) {
    return 'fluctuating';
  } else if (slope > 0.01) {
    return 'increasing';
  } else {
    return 'decreasing';
  }
}

趋势类型:

  • 📈 上升:斜率 > 0.01,作物长势改善
  • 📉 下降:斜率 < -0.01,作物长势下降
  • 📊 稳定|斜率| < 0.01 且波动小,长势稳定
  • 📊 波动:波动大,生长不稳定

5.2 生长阶段判断

算法实现:

private static _determineGrowthStage(ndviValues: number[]): string {
  const latestNDVI = ndviValues[ndviValues.length - 1];
  
  if (latestNDVI < 0.3) return '苗期';
  if (latestNDVI < 0.5) return '生长期';
  if (latestNDVI < 0.7) return '旺长期';
  if (latestNDVI < 0.85) return '成熟前期';
  return '成熟期';
}

生长阶段:

NDVI范围 阶段 特征 管理重点
< 0.3 苗期 植被稀疏 保证出苗,防治地下害虫
0.3-0.5 生长期 快速生长 水肥管理,促进生长
0.5-0.7 旺长期 茂盛生长 防止徒长,病虫害防治
0.7-0.85 成熟前期 接近成熟 适时追肥,保证成熟
> 0.85 成熟期 完全成熟 准备收获

5.3 健康分数

计算方法:

const avgNDVI = ndviValues.reduce((a, b) => a + b, 0) / ndviValues.length;
const healthScore = Math.round(avgNDVI * 100);

评价标准:

  • 90-100分:优秀,作物健康
  • 80-89分:良好,生长正常
  • 70-79分:一般,需要关注
  • 60-69分:较差,需要加强管理
  • < 60分:很差,存在严重问题

5.4 智能警报

警报类型:

1. NDVI急剧下降

const change = ndviValues[ndviValues.length - 1] - ndviValues[0];
if (change < -0.2) {
  alerts.push('⚠️ 警告:近期植被指数急剧下降,请检查作物健康状况');
}

2. 云量过高

const highCloudImages = recent.filter(img => img.cloudCover > 40);
if (highCloudImages.length >= 2) {
  alerts.push('☁️ 提示:近期云量较高,建议选择晴天影像进行分析');
}

3. NDVI持续低迷

const lowNDVIImages = recent.filter(img => img.ndvi < 0.4);
if (lowNDVIImages.length >= 2) {
  alerts.push('⚠️ 注意:植被指数持续偏低,建议加强田间管理');
}

🎨 6. 可视化功能

6.1 NDVI变化曲线

SVG绘制

<svg className="w-full h-full" viewBox="0 0 100 100" preserveAspectRatio="none">
  {/* NDVI曲线 */}
  <polyline
    points={timeSeriesAnalysis.ndviValues.map((ndvi, i) => 
      `${(i / (timeSeriesAnalysis.ndviValues.length - 1)) * 100},${100 - ndvi * 100}`
    ).join(' ')}
    fill="none"
    stroke="#22c55e"
    strokeWidth="1"
  />
  
  {/* 数据点 */}
  {timeSeriesAnalysis.ndviValues.map((ndvi, i) => (
    <circle
      key={i}
      cx={(i / (timeSeriesAnalysis.ndviValues.length - 1)) * 100}
      cy={100 - ndvi * 100}
      r="1.5"
      fill="#22c55e"
    />
  ))}
</svg>

6.2 NDVI色带图例

渐变色带:

background: linear-gradient(to right, 
  #ef4444,  /* 红色 - 无植被 */
  #f97316,  /* 橙色 */
  #eab308,  /* 黄色 */
  #84cc16,  /* 黄绿 */
  #22c55e   /* 绿色 - 茂盛植被 */
);

6.3 影像显示

动态渐变:

<div 
  className="w-full h-full"
  style={{
    backgroundImage: `
      radial-gradient(circle at 30% 40%, rgba(34, 197, 94, ${selectedImage?.ndvi || 0.8}) 0%, transparent 50%),
      radial-gradient(circle at 70% 60%, rgba(22, 163, 74, ${(selectedImage?.ndvi || 0.8) * 0.8}) 0%, transparent 50%),
      radial-gradient(circle at 50% 80%, rgba(21, 128, 61, ${(selectedImage?.ndvi || 0.8) * 0.9}) 0%, transparent 40%)
    `,
  }}
/>

📥 7. 影像下载

7.1 下载格式

支持格式:

  • TIFGeoTIFF格式保留地理信息
  • JPG:常用图像格式,文件小
  • PNG:无损压缩,质量高

下载接口:

static async downloadImage(
  image: SatelliteImage,
  format: 'tif' | 'jpg' | 'png' = 'jpg'
): Promise<void> {
  const filename = `${image.source}_${image.date}.${format}`;
  
  const link = document.createElement('a');
  link.href = image.fullImageUrl;
  link.download = filename;
  link.click();
}

7.2 文件命名

命名规则:

格式: {数据源}_{日期}.{格式}
示例: Sentinel-2_2024-10-15.jpg

🚀 8. 使用指南

场景1: 查看单个时期影像

步骤:

  1. 选择地块
  2. 选择数据源如Sentinel-2
  3. 设置最大云量如30%
  4. 点击"刷新影像"加载
  5. 使用时间滑块或点击影像列表查看
  6. 查看NDVI、EVI等指标

场景2: 对比两个时期影像

步骤:

  1. 点击"影像对比"标签页
  2. 在"对比影像1"下拉框选择早期影像
  3. 在"对比影像2"下拉框选择近期影像
  4. 点击"执行对比"按钮
  5. 查看变化量、变化类型、变化描述
  6. 查看管理建议

对比结果:

NDVI变化: +0.15 (0.68 → 0.83)
EVI变化: +0.12 (0.55 → 0.67)
变化类型: 改善
描述: 植被覆盖度有所增加,作物长势良好

场景3: 时序趋势分析

步骤:

  1. 点击"时序分析"标签页
  2. 查看NDVI变化曲线
  3. 查看趋势类型(上升/下降/稳定/波动)
  4. 查看生长阶段
  5. 查看健康分数
  6. 查看智能警报

分析结果:

变化趋势: 上升 📈
生长阶段: 旺长期
健康分数: 85
警报: 无

场景4: 云量过滤

步骤:

  1. 在左侧控制面板找到"云量过滤"
  2. 拖动滑块设置最大云量0-100%
  3. 影像列表自动更新
  4. 仅显示满足条件的影像

推荐设置:

  • 精确分析:云量 ≤ 10%
  • 常规监测:云量 ≤ 20%
  • 快速查看:云量 ≤ 30%

📊 9. 技术规格

9.1 数据源对比

数据源 分辨率 重访周期 费用 优势
Sentinel-2 10米 5天 免费 高时间分辨率
Landsat-8 30米 16天 免费 长时间序列
天地图 2米 1天 需申请 超高分辨率
GF-1 2米 4天 需购买 国产高分

9.2 植被指数对比

指数 公式 范围 应用
NDVI (NIR-Red)/(NIR+Red) -1 ~ 1 植被覆盖度
EVI 2.5*(NIR-Red)/(NIR+6Red-7.5Blue+1) -1 ~ 1 高生物量
SAVI ((NIR-Red)/(NIR+Red+L))*(1+L) -1 ~ 1 稀疏植被
LAI - 0 ~ 10 叶面积

9.3 性能指标

操作 平均耗时 内存占用
加载影像列表 < 500ms < 5MB
切换影像 < 100ms < 2MB
影像对比 < 200ms < 3MB
时序分析 < 300ms < 4MB
下载影像 取决于网速 -

📖 10. API文档

10.1 获取地块影像

const images = await SatelliteImageService.getFieldImages(
  'field-1',              // 地块ID
  '2024-04-01',          // 开始日期
  '2024-10-01',          // 结束日期
  'Sentinel-2',          // 数据源(可选)
  30                     // 最大云量(可选)
);

10.2 影像对比

const result = SatelliteImageService.compareImages(
  olderImage,    // 早期影像
  newerImage     // 近期影像
);

console.log(result.ndviChange);         // NDVI变化量
console.log(result.changeType);         // 变化类型
console.log(result.changeDescription);  // 变化描述
console.log(result.recommendations);    // 管理建议

10.3 时序分析

const analysis = SatelliteImageService.analyzeTimeSeries(images);

console.log(analysis.trend);        // 趋势: increasing/decreasing/stable/fluctuating
console.log(analysis.growthStage);  // 生长阶段
console.log(analysis.healthScore);  // 健康分数 (0-100)
console.log(analysis.alerts);       // 警报信息

10.4 下载影像

await SatelliteImageService.downloadImage(
  selectedImage,  // 影像对象
  'jpg'          // 格式: tif/jpg/png
);

11. 功能清单

已实现功能

  • 多数据源支持

    • Sentinel-2 (10米)
    • Landsat-8 (30米)
    • 天地图 (2米)
    • 高分系列 (2米)
  • 植被指数计算

    • NDVI (归一化植被指数)
    • EVI (增强型植被指数)
    • SAVI (土壤调节植被指数)
    • LAI (叶面积指数)
  • 时序影像功能

    • 时间滑块
    • 影像列表
    • 云量过滤
    • 上一张/下一张导航
  • 影像对比分析

    • 双影像选择
    • NDVI/EVI变化计算
    • 变化类型判断
    • 智能建议生成
  • 时序分析

    • 趋势分析(上升/下降/稳定/波动)
    • 生长阶段判断
    • 健康分数计算
    • 智能警报
  • 可视化功能

    • NDVI变化曲线
    • 色带图例
    • 影像显示
    • 指标卡片
  • 影像下载

    • 多格式支持TIF/JPG/PNG
    • 文件命名
    • 下载提示

🎉 12. 总结

核心特性

多数据源集成Sentinel-2、Landsat-8、天地图、高分系列 时序影像查看:时间滑块、影像列表、云量过滤 影像对比分析NDVI/EVI变化、智能建议 时序趋势分析:线性回归、生长阶段、健康分数 智能警报系统NDVI下降、云量过高、持续低迷 专业可视化NDVI曲线、色带图例、渐变影像 完善的API:易于集成和扩展

应用价值

🌾 作物监测:实时监测作物生长状况 📊 精准决策:基于数据的科学管理 ⏱️ 时序对比:直观查看地块变化 🎯 精准农业:支持变量施肥、精准灌溉 🔍 病虫害预警:早期发现异常 📈 趋势预测:辅助生产计划


系统状态 已完成开发,功能完备,可投入生产使用

文档版本v1.0
更新日期2025-10-18
开发团队:智慧农业研发中心