广告

GIS 从业者必读:用 Python 与 Rasterio 处理卫星图像的入门教程

准备工作与环境搭建

安装 Python 与虚拟环境

对于 GIS 从业者而言,建立一个干净且可重复的开发环境是第一步。使用虚拟环境可以避免库版本冲突,确保后续的 Rasterio 与依赖可控稳定。

推荐采用 conda 或 venv 来创建一个专门的工作环境,并将 Python 版本锁定在 3.9~3.11 之间,以与主流遥感工具栈保持兼容。命名为 gis_env 以便于辨识,再统一安装核心包。

安装 Rasterio 与依赖

Rasterio 是处理栅格数据的核心库,它对 GDAL 的绑定较深,因此在安装时需要确保底层依赖就绪。优先使用 Conda 安装可避免 C 依赖问题,同时可通过 Pip 下载 Python 包。

基础安装示例见下方,确保在激活的环境中执行。Rasterio、Numpy 与 Matplotlib 是常用组合,便于数据处理与绘图。

# 使用 conda 创建并激活环境
conda create -n gis_env python=3.11
conda activate gis_env# 安装 rasterio、numpy、matplotlib 等
conda install -c conda-forge rasterio numpy matplotlib

Rasterio 的核心概念与卫星影像特点

Rasterio 的核心概念

数据集(dataset)是 Rasterio 读取栅格影像的基础对象,封装了影像的元数据、波段数据及投影信息。波段(band)是栅格数据的最小读取单元,常用于组合、计算和分析。

仿射变换(transform)描述像素网格与地理坐标系的映射关系,结合 CRS(坐标参考系),我们可以实现从像素坐标到地理坐标的转换。

卫星影像数据的波段、分辨率与坐标系

卫星影像通常包含多个波段,每个波段对应不同的光谱通道。选择合适的波段组合(如红光与近红外)可实现植被指数等分析,同时要关注分辨率与投影的一致性。

在读取数据时,影像的坐标系(CRS)与仿射变换是分析的关键要素,它们决定了后续裁切、重采样和对齐的正确性。

import rasterio# 打开影像并查看基本元数据
path = 'data/LC08_L1TP_023030_20200808_20200820_B4.TIF'
with rasterio.open(path) as src:print(src.name)print('波段数:', src.count)print('分辨率:', src.res)print('CRS:', src.crs)print('变换:', src.transform)

读取卫星影像元数据与波段提取

打开影像获取元数据

通过 rasterio.open 可以快速加载影像并读取元数据,例如波段数、图像尺寸、像元大小以及 nodata 值等信息。元数据是后续波段操作与数据对齐的基础

掌握这些信息有助于评估影像质量、选择波段以及确定后续的处理策略。与 GIS 工作流高度相关的要点包括投影、变换和 nodata 设置。

读取单波段与多波段数据

影像中不同波段包含不同信息,单波段读取用于简单统计与可视化,多波段读取适合进行指数计算等高级分析。

GIS 从业者必读:用 Python 与 Rasterio 处理卫星图像的入门教程

在实际应用中,先读出需要的波段再进行数组级运算,确保不要将 nodata 值混入计算,以提升结果的准确性。

import numpy as np
import rasteriopath = 'data/LC08_L1TP_023030_20200808_20200820_B4.TIF'  # 红波段示例
with rasterio.open(path) as src:red = src.read(1)        # 读取第一波段(示例)nodata = src.nodataprint('红波段形状:', red.shape, 'nodata:', nodata)

数据处理:波段运算、掩膜与裁切

波段组合与简单指数计算

将不同波段组合进行运算是遥感分析的核心,例如常见的 NDVI、NDWI 等。使用 NumPy 数组进行逐元素计算,并注意处理 NA 值和除零情况。

计算结果通常为单通道栅格,保持原始数据类型或转换为浮点型以获得精度,再决定是否添加 nodata 掩膜。

import numpy as np# 假设 red 与 nir 已经从不同波段读取为 2D 数组
# nir = 近红外波段,red = 红波段
ndvi = (nir.astype(float) - red.astype(float)) / (nir + red)
ndvi = np.where((nir + red) == 0, -9999, ndvi)  # 使用 -9999 作为 nodata

掩膜、裁切与重采样

在处理卫星影像时,常需要对感兴趣区域进行裁切,或对不同分辨率影像进行重采样以实现对齐。掩膜操作可将无效像元排除在分析之外,提升结果的可用性。

裁切与重采样的实现要点在于正确传递 变换(transform)与 CRS,以及选择合适的重采样算法(最近邻、双线性等)。

from rasterio.windows import Window# 假设 ndvi 已经准备好,进行简单裁切示例
with rasterio.open('data/NDVI.tif') as src:# 以左上角坐标和尺寸裁切一个子区域win = Window(100, 100, 500, 500)ndvi_crop = src.read(1, window=win)transform = src.window_transform(win)

数据输出与可视化

写出新栅格数据(GeoTIFF)

分析结果需要以栅格格式输出,常用 GeoTIFF 保存,保持 CRS、变换信息以及 nodata 设置的一致性,以便在 GIS 软件中进一步分析。

在写出新栅格时,要更新数据类型、波段数与 nodata,确保结果能正确被后续工具读取。

import rasterio# 使用与输入影像相同的 profile,更新为单波段浮点输出
out_path = 'output_ndvi.tif'
with rasterio.open('data/LC08_ndvi_input.tif') as src:profile = src.profile
profile.update(dtype=rasterio.float32, count=1, nodata=-9999)with rasterio.open(out_path, 'w', **profile) as dst:dst.write(ndvi.astype(rasterio.float32), 1)

快速可视化结果

将分析结果进行简单可视化有助于快速判断分析是否合理。Matplotlib 提供直观的色带映射,适用于展示 NDVI、NDWI 等指数,也便于在博客或报告中呈现。

在可视化时,选择合适的颜色映射和色标范围,避免误导读者对地表信息的解读。

import matplotlib.pyplot as pltplt.figure(figsize=(6, 6))
plt.imshow(ndvi, cmap='RdYlGn', vmin=-1, vmax=1)
plt.colorbar(label='NDVI')
plt.title('NDVI 可视化')
plt.axis('off')
plt.show()

广告

后端开发标签