详解GDAL (Python)读写栅格数据

前情提要-GDAL的安装

通常直接使用pip install gdal都会失败,不知道为什么。常用的方式都是到这个网站下载GDAL的.whl文件手动使用pip install xxx.whl进行安装,但是有时候也会失败。不知道是不是python版本和gdal有一定对应关系,我把我已经成功安装的版本贴上来作为一个参考:python: 3.9.13, gdal: 3.4.1

GDAL读取栅格数据

from osgeo import gdal
import os
os.environ['PROJ_LIB'] = r'D:\Anaconda\envs\dl_py310\Lib\site-packages\osgeo\data\proj'   # 有时会发生找不到gdal投影库的情况,所以加上这句话

def read_img(img_path):
	ds = gdal.Open(img_path)
	width = ds.RasterXSize      # 影像的列数
	height = ds.RasterYSize     # 影像的行数
	band_count = ds.RasterCount  # 波段数量
	proj = ds.GetProjection()    # 获取栅格投影信息
	geotrans = ds.GetGeoTransform()  # 获取栅格仿射变换信息
	data = ds.ReadAsArray(0, 0, width, height)   # 读取栅格数据,格式为numpy数组
	
	del ds
	
	return data, width, height, proj, geotrans

有几点需要注意一下:

  1. ds.RasterXSize 指的是影像的列数,不要因为里面有个X就当成行数
  2. 有时候会在读取ds的属性时报错:AttributeError: 'NoneType' object has no attribute 'RasterXsize',错误根源往往是你的img_path,也就是影像路径有误,好好检查!!!

空间信息的读取及含义

遥感影像之所以不同于一般图片,在于其具有空间信息。当我们使用gdal-python提取空间信息时,通常指投影信息及仿射变换参数,投影信息指的是影像所采用的坐标系,仿射变换参数指的是空间坐标和行列号的转换参数。上面代码中使用ds.GetProjection()ds.GetGeoTransform() 分别获取了遥感影像的投影信息和仿射变换参数。下面我们继续深入空间坐标信息和仿射变换参数,看看它们具体是什么样子。

  1. 空间坐标
    影像的空间坐标存在两种情况:①仅有地理坐标系(即经纬度表示);②有投影坐标系(即地理坐标投影到平面,单位为米)。
    情况①的例子如下:
	GEOGCS["WGS 84",
		DATUM["WGS_1984",
			SPHEROID["WGS 84",6378137,298.257223563,
				AUTHORITY["EPSG","7030"]],
			AUTHORITY["EPSG","6326"]],
		PRIMEM["Greenwich",0],
		UNIT["degree",0.0174532925199433,
			AUTHORITY["EPSG","9122"]],
		AXIS["Latitude",NORTH],
		AXIS["Longitude",EAST],
		AUTHORITY["EPSG","4326"]]

情况②的例子如下:

PROJCS["WGS 84 / UTM zone 50N",
	GEOGCS["WGS 84",
		DATUM["WGS_1984",
			SPHEROID["WGS 84",6378137,298.257223563,
				AUTHORITY["EPSG","7030"]],
			AUTHORITY["EPSG","6326"]],
		PRIMEM["Greenwich",0,
			AUTHORITY["EPSG","8901"]],
		UNIT["degree",0.0174532925199433,
			AUTHORITY["EPSG","9122"]],
		AUTHORITY["EPSG","4326"]],
	PROJECTION["Transverse_Mercator"],
	PARAMETER["latitude_of_origin",0],
	PARAMETER["central_meridian",117],
	PARAMETER["scale_factor",0.9996],
	PARAMETER["false_easting",500000],
	PARAMETER["false_northing",0],
	UNIT["metre",1,AUTHORITY["EPSG","9001"]],
	AXIS["Easting",EAST],
	AXIS["Northing",NORTH],
	AUTHORITY["EPSG","32650"]]
  • 上面的两个例子中,情况①使用的影像仅有WGS 84 地理坐标系,情况②是进行了UTM投影(3°带,带号50,北半球)后的空间信息。
  • 可以看出来情况①的空间信息是情况②的子集(如果情况②投影之前是跟①相同的地理坐标系的话)
  1. 仿射变换参数
    仿射变换参数是空间坐标和影像行列号相互转换的参数。跟“空间坐标”部分采用一致的数据,结果如下:
    情况①:(117.12486203, 8.983152840909071e-05, 0.0, 24.232234449943178, 0.0, -8.983152840909048e-05)
    情况②:(499980.0, 10.0, 0.0, 2700000.0, 0.0, -10.0)
  • 这两种情况分别跟地理坐标和投影坐标的数值对应
  • 仿射变换参数有6个,第14个代表影像左上角坐标(情况①中的117.12486203, 24.232234449943178,情况②中的499980.0, 2700000.0)。第2、6个代表影像在横向、纵向的分辨率(一般二者值相等,符号相反),第3、5个代表影像旋转系数,一般都为0。

GDAL写入栅格数据

待续…

你可能感兴趣的:(python,gdal,栅格影像)