农作物数据构建和统计(基于实测数据、GEE及python)

一、技术流程概览

本文通过 Google Earth Engine (GEE) 获取遥感影像数据,结合 Python 实现空间数据处理、分类模型训练及统计可视化,完整流程如下:

  1. GEE 数据获取:下载预处理后的 Sentinel-2 影像

  2. Python 数据对齐:融合矢量数据与栅格影像,生成标签矩阵

  3. 随机森林分类:训练模型并预测农作物类别

  4. 后处理与统计:平滑分类结果,计算面积并可视化

二、详细步骤与代码实现

1. GEE 数据获取

代码文件gee.txt
功能:下载指定时间范围和区域的 Sentinel-2 影像,并进行云掩膜处理。

// 加载矢量边界  
var shp_asset = 'projects/ee-crop/assets/merged';  
var roi = ee.FeatureCollection(shp_asset).geometry();  

// 设置时间范围  
var start_date = '2025-03-01';  
var end_date = '2025-03-31';  

// 获取 Sentinel-2 数据并预处理  
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')  
    .filterBounds(roi)  
    .filterDate(start_date, end_date)  
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 15))  
    .select(['B2', 'B3', 'B4', 'B8', 'B11', 'B12', 'QA60'])  
    .mosaic()  
    .clip(roi);  

// 云掩膜处理  
var s2_cloudmask = function(img) {  
    var qa60 = img.select('QA60');  
    var cloudBitMask = 1 << 10;  
    var cirrusBitMask = 1 << 11;  
    var mask = qa60.bitwiseAnd(cloudBitMask).eq(0)  
               .and(qa60.bitwiseAnd(cirrusBitMask).eq(0));  
    return img.updateMask(mask)  
              .select(['B2', 'B3', 'B4', 'B8', 'B11', 'B12']);  
};  
s2 = s2_cloudmask(s2);  

// 导出数据到 Google Drive  
Export.image.toDrive({  
    image: s2.toUint16(),  
    description: 'Sentinel2_5m_Bands',  
    folder: 'GEE_Exports',  
    region: roi,  
    scale: 10,  
    crs: 'EPSG:4326'  
});  

2. Python 数据对齐与标签生成

代码文件GENERATE.py
功能:对齐栅格影像与矢量数据,生成训练标签。

import os  
import numpy as np  
import geopandas as gpd  
import rasterio  
from rasterio.mask import mask  

# 配置参数  
RASTER_PATH = "path/to/Sentinel2_5m_Bands.tif"  
VECTOR_PATHS = ["耕地数据1.shp", "耕地数据2.shp"]  
OUTPUT_DIR = "dataset_output"  
LABEL_MAPPING = {"小麦":1, "未耕":2, "油菜":3, "草地":4, "毛豆":5, "大棚":6, "玉米":7, "水稻":8}  

# 空间对齐函数  
def align_data(raster_path, vector_paths):  
    gdfs = []  
    for path in vector_paths:  
        gdf = gpd.read_file(path).to_crs(rasterio.open(raster_path).crs)  
        gdf['class_id'] = gdf["ZZZWMC"].map(LABEL_MAPPING).fillna(9)  # 未映射类别标记为9  
        gdfs.append(gdf)  
    combined_gdf = gpd.pd.concat(gdfs)  
    # 裁剪栅格并保存  
    with rasterio.open(raster_path) as src:  
        out_image, out_transform = mask(src, [combined_gdf.unary_union.__geo_interface__], crop=True)  
        out_meta = src.meta.copy()  
    # 保存对齐后的栅格  
    aligned_raster = os.path.join(OUTPUT_DIR, "aligned.tif")  
    with rasterio.open(aligned_raster, "w", **out_meta) as dest:  
        dest.write(out_image)  
    return aligned_raster, combined_gdf  

# 主流程  
if __name__ == "__main__":  
    os.makedirs(OUTPUT_DIR, exist_ok=True)  
    aligned_raster, gdf = align_data(RASTER_PATH, VECTOR_PATHS)  
    # 生成标签矩阵(详见原文件)  

生成数据

数据结构

3. 随机森林分类与后处理

代码文件RF2_filter.py
功能:训练随机森林模型,预测农作物类别并平滑结果。

from sklearn.ensemble import RandomForestClassifier  
from skimage.morphology import opening, closing, square  

def postprocess(pred_matrix):  
    # 中值滤波 + 形态学操作  
    med_footprint = square(2)  
    morpho_footprint = square(2)  
    smoothed = median(pred_matrix, footprint=med_footprint)  
    smoothed = opening(smoothed, morpho_footprint)  
    smoothed = closing(smoothed, morpho_footprint)  
    return smoothed  

def main():  
    # 加载数据  
    X = np.load("dataset_output/image_cube.npy")  
    y = np.load("dataset_output/label_matrix.npy")  
    # 训练模型  
    rf = RandomForestClassifier(n_estimators=100, class_weight='balanced')  
    rf.fit(X_train, y_train)  
    # 全图预测  
    pred_matrix = rf.predict(X.reshape(-1, X.shape[-1]))  
    pred_matrix = pred_matrix.reshape(y.shape)  
    # 平滑处理  
    smoothed_pred = postprocess(pred_matrix)  
    # 保存结果(详见原文件)  

4. 统计与可视化

输出结果

  • 面积统计:生成 Excel 表格(area_results.xlsx

  • 分类报告:模型精度评估(classification_report.xlsx

  • 可视化图:原始影像、真实标签、预测结果对比图

最终结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_RSER

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值