之前,在读取含有高程信息的TIF文件时,
使用的是gdal (Geospatial Data Abstraction Library),
不过,GDAL的安装即使在linux下也不够友好,目前只能使用python3.6版本
同时,如果想要在window下的环境中使用gdal难度就更大一些
还好,有了另外一个更python的Rasterio,
简单、易用、清晰
接下来我们首先对比一下gdal和rasterio读取tif文件的区别
然后详细看一下rasterio的使用
1.gdal读取tif文件
from osgeo import gdal
# 读取tif文件
ds = gdal.Open(tif_file_path)
band = ds.GetRasterBand(1) # 获取第一个波段
elevation = band.ReadAsArray() # 高程信息
nrows_tif, ncols_tif = elevation.shape # [rows, columns]
2. rasterio读取tif文件
import rasterio
# 读取tif文件
tmpds = rasterio.open(tif_file_path)
tmpband = tmpds.count # 获取波段数
elevation = tmpds.read(tmpband) # 读取指定波段的高程信息
tmp_height = tmpds.height # 数据高度
tmp_width = tmpds.width # 数据宽度
以上是gdal和rasterio的在读取高程信息时的简单对比
除了以上属性外,rasterio还有以下属性
with rasterio.open(tif_file_path) as ds:
print('该栅格数据的基本数据集信息(这些信息都是以数据集属性的形式表示的):')
print(f'数据格式:{
ds.driver}')
print(f'波段数目:{
ds.count}')
print(f'地理范围:{
ds.bounds}')
print(f'反射变换参数(六参数模型):\n {
ds.transform}')
print(f'投影定义:{
ds.crs}')
# 获取第一个波段数据,跟GDAL一样索引从1开始
# 直接获得numpy.ndarray类型的二维数组表示,
# 如果read()函数中不传入参数,则得到所有波段(第一个维度是波段)
band1 = ds.read(1)
print(f'第一波段的最大值:{
band1.max()}')
print(f'第一波段的最小值:{
band1.min()}')
print(f'第一波段的平均值:{
band1.mean()}')
# 根据地理坐标得到行列号
x, y = (ds.bounds.left + 300, ds.bounds.top - 300) # 距离左上角东300米,南300米的投影坐标
row, col = ds.index(x, y) # 对应的行列号
print(f'(投影坐标{
x}, {
y})对应的行列号是({
row}, {
col})')
# 根据行列号得到地理坐标
x, y = ds.xy(row, col) # 中心点的坐标
print(f'行列号({
row}, {
col})对应的中心投影坐标是({
x}, {
y})')
# 得到对应点左上角的信息
x, y = (row, col) * ds.transform
print(f'行列号({
row}, {
col})对应的左上角投影坐标是({
x}, {
y})')
建议舍弃GDAL,直接使用rasterio
参考:
https://theonegis.github.io/geos/%E4%BD%BF%E7%94%A8Rasterio%E8%AF%BB%E5%8F%96%E6%A0%85%E6%A0%BC%E6%95%B0%E6%8D%AE/index.html