Python实现遥感影像波段组合:基于GDAL的实用方案

沿途有光
沿途有光
发布时间:2026-10-13| 4人浏览过
原创

针对Python3.7无法兼容ArcGIS 10.2 arcpy库的问题,本文提供了一种基于GDAL库的Python遥感影像波段组合解决方案。通过读取OLI影像的特定波段(如Band 3, 4, 5),利用NumPy构建数组并按序组合,最终写入为多波段TIF文件。该方法无需安装ArcGIS,代码简洁有效,经对比ArcMap处理结果,差异微小,适合轻量级遥感数据处理需求。

Python遥感影像波段组合背景与思路

近期开发一个遥感相关的小型系统,核心需求是实现影像波段的组合功能。网络上常见的方案是使用ArcGIS安装时自带的arcpy包,但当前环境为Python3.7,与现有的ArcGIS 10.2版本存在兼容性问题。为了避免安装其他版本的ArcGIS,我决定自行寻找替代方案,虽然方法略显笨拙,但成功解决了问题。

具体的处理思路如下:

首先,读取需要进行波段组合的遥感影像数据(本例中选用OLI影像)。

其次,创建相应的数组结构,将读取到的各个波段数据按照指定的顺序存入数组中。

最后,将处理后的数组数据写入文件,格式设定为多波段TIF数据。

具体实现代码如下:

基于GDAL的代码实现


from osgeo import gdal
import os
import numpy as np
 
class GRID:
 
  #读图像文件
  def read_img(self,filename):
    dataset=gdal.Open(filename)    #打开文件
 
    im_width = dataset.RasterXSize  #栅格矩阵的列数
    im_height = dataset.RasterYSize  #栅格矩阵的行数
 
    im_geotrans = dataset.GetGeoTransform() #仿射矩阵
    im_proj = dataset.GetProjection() #地图投影信息
    im_data = dataset.ReadAsArray(0,0,im_width,im_height) #将数据写成数组,对应栅格矩阵
 
    del dataset #关闭对象,文件dataset
    return im_proj,im_geotrans,im_data,im_width,im_height
 
  #写文件,以写成tif为例
  def write_img(self,filename,im_proj,im_geotrans,im_data):
 
    #判断栅格数据的数据类型
    if 'int8' in im_data.dtype.name:
      datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
      datatype = gdal.GDT_UInt16
    else:
      datatype = gdal.GDT_Float32
 
    #判读数组维数
    if len(im_data.shape) == 3:
      im_bands, im_height, im_width = im_data.shape
    else:
      im_bands, (im_height, im_width) = 1,im_data.shape
 
    #创建文件
    driver = gdal.GetDriverByName("GTiff")  #数据类型必须有,因为要计算需要多大内存空间
    dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
 
    dataset.SetGeoTransform(im_geotrans)       #写入仿射变换参数
    dataset.SetProjection(im_proj)          #写入投影
 
    if im_bands == 1:
      dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
    else:
      for i in range(im_bands):
        dataset.GetRasterBand(i+1).WriteArray(im_data[i])
 
    del dataset
 
if __name__ == "__main__":
  os.chdir(r'E:\Python\temp\data')            #切换路径到待处理图像所在文件夹
  run = GRID()
  #第一步
  proj,geotrans,data1,row1,column1 = run.read_img('Band_5_Clip.tif') #读数据
  proj,geotrans,data2,row2,column2= run.read_img('Band_4_Clip.tif') # 读数据
  proj,geotrans,data3,row3,column3 = run.read_img('Band_3_Clip.tif') # 读数据
 
  #第二步
  data = np.array((data1, data2, data3),dtype = data1.dtype) #按序将3个波段像元值放入
 
  #第三步
  run.write_img('com543.tif', proj, geotrans, data) # 写为3波段数据

处理结果对比与总结

处理完成后,将结果与ArcGIS的处理效果进行对比,发现两者差异不大(上图显示ArcMap处理结果,下图显示Python处理结果)。

此方法虽然较为简单,但如果各位专家有更好的实现方案,欢迎私下交流探讨。

以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。