python读取tif图像+经纬度

python读取tif的包很多,但大都只能读出图像像素值,不能读取到经纬度信息。原因:TIFF 简单理解就是一种图像格式,类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等,常用于遥感数据,所以要使用读取GeoTIFF的库进行信息读取。

1、GeoTIFF读取

GeoTIFF使用gdal进行读取,GDAL 是一个开源的操作栅格数据和矢量数据的库,可用于读写、获取坐标系、获取指定位置像元值等。

2、安装 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

3、值读取

所以只有一个波段,因此 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])
=>
<class 'numpy.ndarray'> (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

4、计算对应的GPS

使用的就是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

猜你喜欢

转载自blog.csdn.net/weixin_34910922/article/details/129208546