• 详解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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    有几点需要注意一下:

    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"]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    情况②的例子如下:

    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"]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 上面的两个例子中,情况①使用的影像仅有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写入栅格数据

    待续…

  • 相关阅读:
    WorkPlus即时通讯app支持多种信创环境组合运行
    qt实现打开pdf(阅读器)功能用什么库比较合适
    spring cloud笔记--微服务基础
    评估指标与评分(上):二分类指标
    Windows下后台运行、关闭jar的命令
    Ubuntu下安装Java
    二叉树题目:二叉树的所有路径
    堆外内存和堆内内存及虚引用的应用
    科研经验-文件的可视化管理(Endnote)
    鲜花网络专送站
  • 原文地址:https://blog.csdn.net/aqa2037299560/article/details/132722174