# Hướng Dẫn Sử Dụng Chức Năng Predict NDVI

## Tổng Quan
Chức năng mới cho phép dự đoán phân loại đất (land classification) **kết hợp** với việc xuất ra raster NDVI cho cùng một khu vực.

## Cách Sử Dụng

### 1. Truy cập Prediction Interface
- Mở trình duyệt: `http://localhost:8000/prediction`
- Hoặc từ trang chủ, click vào **Prediction**

### 2. Chọn Model
- Chọn model đã được train từ dropdown "Select Model"
- Model phải tồn tại trong thư mục `model_train/`

### 3. Vẽ Khu Vực (Bbox)
- Sử dụng công cụ vẽ hình chữ nhật trên bản đồ
- Khu vực này sẽ được dùng để:
  - Load dữ liệu vệ tinh
  - Tính NDVI
  - Predict land classification

### 4. Cấu Hình Thời Gian & Dữ Liệu
- **Từ ngày / Đến ngày**: Khoảng thời gian lấy ảnh vệ tinh
- **Max Scenes**: Số lượng ảnh tối đa (khuyến nghị: 12)
- **Cloud Cover**: % mây tối đa (khuyến nghị: 30%)
- **Resolution**: Độ phân giải (10m hoặc 20m)

### 5. Bật Export NDVI
- ✅ Check vào "🌿 Export NDVI Raster"
- Khi bật, hệ thống sẽ:
  - Tính NDVI từ Sentinel-2 (NIR - Red) / (NIR + Red)
  - Xuất ra file `ndvi_YYYYMMDD_HHMMSS.tif`
  - Xuất ra file `classification_YYYYMMDD_HHMMSS.tif`

### 6. Chạy Prediction
- Click "🚀 Start Prediction (với NDVI)"
- Hệ thống sẽ:
  1. Load dữ liệu Sentinel-2 (bands: B02, B03, B04, B08)
  2. Tính toán các spectral indices (NDVI, NDWI, NDBI)
  3. Dùng model để predict land classification
  4. Xuất kết quả

## Kết Quả

### Output Files
Sau khi hoàn thành, bạn sẽ nhận được 2 file trong thư mục `predictions/`:

1. **`ndvi_YYYYMMDD_HHMMSS.tif`**
   - GeoTIFF chứa giá trị NDVI
   - Giá trị: -1 đến +1
   - CRS: EPSG:4326 (WGS84)
   - Có thể mở bằng QGIS, ArcGIS, hoặc Python

2. **`classification_YYYYMMDD_HHMMSS.tif`**
   - GeoTIFF chứa kết quả phân loại đất
   - Giá trị: class labels (ví dụ: 0, 1, 2, 3...)
   - CRS: EPSG:4326 (WGS84)

### Thống Kê Hiển Thị
Sau khi predict xong, giao diện sẽ hiển thị:
- **NDVI Statistics**:
  - Mean: Giá trị NDVI trung bình
  - Min: Giá trị NDVI nhỏ nhất
  - Max: Giá trị NDVI lớn nhất
  - Std: Độ lệch chuẩn
- **Class Distribution**: Số lượng pixel cho mỗi class
- **N Scenes**: Số ảnh vệ tinh đã sử dụng

## API Endpoint

### POST `/api/predict/with-ndvi`

**Request Body:**
```json
{
  "model_filename": "model_xgboost_20231221_120000.joblib",
  "min_lon": 105.6,
  "min_lat": 9.3,
  "max_lon": 106.2,
  "max_lat": 9.8,
  "start_date": "2023-03-01",
  "end_date": "2023-05-31",
  "max_scenes": 12,
  "cloud_cover": 30,
  "resolution": 20,
  "export_ndvi": true,
  "export_classification": true
}
```

**Response:**
```json
{
  "success": true,
  "message": "Prediction with NDVI completed",
  "output_files": [
    {"type": "ndvi", "path": "predictions/ndvi_20231221_120000.tif"},
    {"type": "classification", "path": "predictions/classification_20231221_120000.tif"}
  ],
  "ndvi_stats": {
    "mean": 0.456,
    "min": -0.123,
    "max": 0.789,
    "std": 0.234
  },
  "class_distribution": {
    "0": 12345,
    "1": 23456,
    "2": 34567
  },
  "n_scenes": 12,
  "resolution": 20,
  "bbox": [105.6, 9.3, 106.2, 9.8]
}
```

## Download Files

Sau khi prediction hoàn thành, có thể download files qua:
- **UI**: Click "💾 Download GeoTIFF" trong kết quả
- **API**: `GET /api/predictions/download/ndvi_YYYYMMDD_HHMMSS.tif`
- **API**: `GET /api/predictions/download/classification_YYYYMMDD_HHMMSS.tif`

## Sử Dụng Kết Quả với Python

```python
import rasterio
import matplotlib.pyplot as plt
import numpy as np

# Read NDVI raster
with rasterio.open('predictions/ndvi_20231221_120000.tif') as src:
    ndvi = src.read(1)
    
    # Visualize
    plt.figure(figsize=(10, 8))
    plt.imshow(ndvi, cmap='RdYlGn', vmin=-1, vmax=1)
    plt.colorbar(label='NDVI')
    plt.title('NDVI Map')
    plt.show()

# Read classification raster
with rasterio.open('predictions/classification_20231221_120000.tif') as src:
    classification = src.read(1)
    
    # Visualize
    plt.figure(figsize=(10, 8))
    plt.imshow(classification, cmap='tab10')
    plt.colorbar(label='Land Class')
    plt.title('Land Classification')
    plt.show()
```

## Sử Dụng Kết Quả với QGIS

1. Mở QGIS
2. **Layer → Add Layer → Add Raster Layer**
3. Chọn file `ndvi_*.tif` hoặc `classification_*.tif`
4. Styling:
   - NDVI: Singleband pseudocolor, min=-1, max=1, color ramp=RdYlGn
   - Classification: Paletted/Unique values

## Lưu Ý

- **Thời gian xử lý**: Tùy thuộc vào kích thước bbox và số scenes (thường 2-5 phút)
- **Bộ nhớ**: Khu vực lớn + resolution cao = RAM cao
- **NDVI values**:
  - < 0: Nước, đất trống
  - 0 - 0.2: Đất có ít thực vật
  - 0.2 - 0.5: Cây cỏ, cây trồng
  - > 0.5: Rừng rậm, thực vật dày đặc

## So Sánh với NDVI Time Series

| Feature | Predict NDVI | NDVI Time Series |
|---------|-------------|------------------|
| **Mục đích** | Xuất raster NDVI + land classification | Xem xu hướng NDVI theo thời gian |
| **Output** | GeoTIFF files | Chart, CSV |
| **Dùng model** | Có (predict land class) | Không (chỉ tính NDVI) |
| **Visualize** | Bản đồ raster | Biểu đồ đường |
| **Use case** | Phân tích không gian | Phân tích thời gian |

## Troubleshooting

**Q: Lỗi "Model không tồn tại"?**
- Kiểm tra model đã được train và lưu trong `model_train/`
- Refresh danh sách model

**Q: Kết quả NDVI toàn NaN?**
- Check cloud cover (giảm xuống)
- Mở rộng time range
- Kiểm tra bbox có nằm trong phạm vi Sentinel-2 coverage

**Q: File GeoTIFF không mở được?**
- Đảm bảo file download hoàn chỉnh
- Dùng QGIS hoặc rasterio để kiểm tra

**Q: Prediction chậm?**
- Giảm resolution (20m thay vì 10m)
- Giảm max_scenes
- Thu nhỏ bbox
