通常直接使用pip install gdal
都会失败,不知道为什么。常用的方式都是到这个网站下载GDAL的.whl
文件手动使用pip install xxx.whl
进行安装,但是有时候也会失败。不知道是不是python版本和gdal有一定对应关系,我把我已经成功安装的版本贴上来作为一个参考:python: 3.9.13, gdal: 3.4.1
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
有几点需要注意一下:
ds.RasterXSize
指的是影像的列数,不要因为里面有个X就当成行数AttributeError: 'NoneType' object has no attribute 'RasterXsize'
,错误根源往往是你的img_path
,也就是影像路径有误,好好检查!!!遥感影像之所以不同于一般图片,在于其具有空间信息。当我们使用gdal-python提取空间信息时,通常指投影信息及仿射变换参数,投影信息指的是影像所采用的坐标系,仿射变换参数指的是空间坐标和行列号的转换参数。上面代码中使用ds.GetProjection()
和ds.GetGeoTransform()
分别获取了遥感影像的投影信息和仿射变换参数。下面我们继续深入空间坐标信息和仿射变换参数,看看它们具体是什么样子。
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"]]
(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
个,第1
、4
个代表影像左上角坐标(情况①中的117.12486203, 24.232234449943178
,情况②中的499980.0, 2700000.0
)。第2、6个代表影像在横向、纵向的分辨率(一般二者值相等,符号相反),第3、5个代表影像旋转系数,一般都为0。待续…