用Python实现卫星影像导入裁切:从EarthExplorer获取Landsat8并生成CNN分类适配图块
Landsat 8卫星影像Python处理实操
一、对接Earth Explorer平台的Landsat 8影像下载方案
- 适配的可用依赖工具
landsatxplore:直接对接USGS Earth Explorer官方接口的Python开发包,支持账号鉴权、按轨道/点位范围、云量、时间范围检索匹配Landsat 8影像,无需手动在网页端下载geopandas:辅助处理目标点位的矢量范围,自动计算对应影像的经纬度检索边界
- 核心实现代码
from landsatxplore.api import API # 初始化Earth Explorer鉴权(替换为个人USGS平台注册账号) api = API(username="你的EE平台账号", password="你的EE平台密码") # 按筛选条件检索Landsat 8影像 matched_scenes = api.search( dataset="landsat_ot_c2_l2", # 对应Landsat8 Collection 2 Level 2地表反射率产品 bbox=[目标西经, 目标北纬, 目标东经, 目标南纬], # 传入目标点位/轨道对应的经纬度范围 max_cloud_cover=10, # 筛选云量占比低于10%的有效影像 start_date="2023-06-01", end_date="2023-09-30" ) # 下载匹配的全场景影像到本地目录 api.download( scene_id_list=[scene["entity_id"] for scene in matched_scenes], output_dir="./raw_landsat_data" ) # 关闭鉴权连接 api.logout()
实操提示:账号密码建议通过本地环境变量读取,不要硬编码在公开代码中,避免信息泄露。
二、栅格影像导入与270×270尺寸裁切块提取(适配Jupyter Notebook下CNN开发流程)
- 核心处理依赖
rasterio:适配卫星栅格影像的读写操作,支持窗口式裁切,和GDAL生态完全兼容,适合Notebook下的交互式调试numpy:实现影像数组的维度转换,直接输出适配CNN框架的输入张量
- 实现逻辑与代码
import rasterio import numpy as np from rasterio.windows import Window # 导入本地存储的Landsat 8全场景多波段影像 with rasterio.open("./raw_landsat_data/LC08_L2SP_XXX_XXX.TIF") as src: crop_size = 270 # 预设3个裁切块的有效起始坐标(可根据影像无云有效区位置调整,避免取到黑边) crop_start_positions = [ (行方向偏移量1, 列方向偏移量1), (行方向偏移量2, 列方向偏移量2), (行方向偏移量3, 列方向偏移量3) ] cropped_block_list = [] for row_offset, col_offset in crop_start_positions: # 定义裁切窗口范围 crop_window = Window( col_off=col_offset, row_off=row_offset, width=crop_size, height=crop_size ) # 按窗口读取影像像素,保留全波段维度 block_pixels = src.read(window=crop_window) # 校验裁切块尺寸,确保输出严格为270×270 assert block_pixels.shape[1:] == (crop_size, crop_size), "裁切块尺寸不符合要求" cropped_block_list.append(block_pixels) # 拼接为适配CNN训练的输入张量:维度为 [样本数, 波段数, 高度, 宽度] cnn_training_input = np.stack(cropped_block_list, axis=0)
操作提示:
- 如果需要保留裁切块的地理参考信息,可通过
rasterio的窗口写功能,将裁切块单独导出为带坐标的GeoTIFF文件 - 裁切前可先读取全影像的有效区域范围,添加越界判断逻辑,避免裁切块超出影像边界引入无效像素
- 所有代码块均可在Jupyter Notebook中逐段运行,随时查看裁切块的像素值、维度,方便快速调试
内容的提问来源于stack exchange,提问作者RAYANE SODRÉ
相关产品推荐
相关产品推荐

