python读取tif的包很多,但大都只能读出图像像素值,不能读取到经纬度信息。原因:TIFF 简单理解就是一种图像格式,类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等,常用于遥感数据,所以要使用读取GeoTIFF的库进行信息读取。
GeoTIFF使用gdal进行读取,GDAL 是一个开源的操作栅格数据和矢量数据的库,可用于读写、获取坐标系、获取指定位置像元值等。
使用:pip install gdal,安装。windows上安装有时会报错,采用whl 进行安装。下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal,我用的python3.9所以下下面那个库。
下载后,按绝对路径执行安装:pip install D:\DownLoad\GDAL-3.4.3-cp39-cp39-win_amd64.whl
引用包:
import numpy as np
from osgeo import gdal, osr
所以只有一个波段,因此 Band 数默认就是 1 了,如果是需要多波段,就是GetRasterBand(band) 的参数需要改一下。
tif_file = r"C:\Users\i\Desktop\dsm.tif"
dataset = gdal.Open(tif_file)
img = dataset.GetRasterBand(1).ReadAsArray() # 1个波段
print(type(img), img.shape, img[1000,1000])
=>
(9783, 8617) 15.39856
其它函数细节:
1、读取某一像素点的值
(1)读取一个波段,其参数为波段的索引号,波段索引号从1开始(我打开的这幅图像只有一个波段)
band=dataset.GetRasterBand(1)
(2)用ReadAsArray(, , ,),读出从(xoff,yoff)开始,大小为(xsize,ysize)的矩阵。以下为读取整幅图像
im_datas=band.ReadAsArray(0,0,im_width,im_height)
(3)获取某一或某几个像素的值(查看10~14 行和 20~25 列的数据)
data=im_datas[10:15,20:26]
(4)释放内存。如果不释放,在arcgis或envi中打开该图像时显示文件已被占用
del dataset
使用的就是gdal里面的GetGeoTransform方法读取坐标,该方法会返回仿射矩阵,形式为以下六个参数:
0:左上角横坐标(投影坐标,经度);
1:像元宽度,影像东西/水平方向分辨率;
2:行旋转,如果图像北方朝上,该值为0;
3:左上角纵坐标(投影坐标,纬度);
4:列旋转,如果图像北方朝上,该值为0;
5:像元高度,影像南北/垂直方向分辨率(北上图为负值)。
则,左上角的地理坐标为:(GT(0) , GT(3) ),如果图像不含地理坐标信息,默认返回值是:(0,1,0,0,0,1);如果影像是指北的,padfGeoTransform[2]和padfGeoTransform[4]这两个参数的值为0。
tif_file = r"C:\Users\xxx\Desktop\dsm.tif"
dataset = gdal.Open(tif_file)
extend = dataset.GetGeoTransform() # 读取地理信息
print("左上角地理坐标为:", extend[0], extend[3])
n_xsize = dataset.RasterXSize # 列数
n_ysize = dataset.RasterYSize # 行数
im_bands = dataset.RasterCount # 波段数
im_proj = dataset.GetProjection() # 地图投影信息
def get_locate_xy(extend, i, j):
""" 计算某个坐标(i,j)位置下的地理坐标(x,y) - WGS84
:param extend: GetGeoTransform() 读取地理信息
:param i: 行号
:param j: 列号
:return: (px, py)
"""
px = extend[0] + i * extend[1] + j * extend[2]
py = extend[3] + i * extend[4] + j * extend[5]
return (px, py)
参考文章:
1、GDAL 操作 TIFF 文件 Python 代码整理:读写、获取坐标系、获取指定位置像元值等教程
https://laowangblog.com/gdal-read-and-write-tiff-with-python.html
2、【基础知识】tiff格式图片介绍及读取
https://betheme.net/xiaochengxu/27055.html?action=onClick
3、基于python和GDAL实现遥感影像重采样(改变分辨率)-修改tif参数及数据
https://blog.csdn.net/gisuuser/article/details/106304155
4、01-利用Python实现多波段影像合成
https://zhuanlan.zhihu.com/p/126130709