GDAL的使用

2024-05-10 06:20
文章标签 使用 gdal

本文主要是介绍GDAL的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 栅格位置(像素或者是行坐标)和地理参考坐标之间的转换可以通过仿射变换实现,仿射矩阵可以通过GDALDataset::GetGeoTransform()得到,依据下面的公式将像素/行坐标转换到地理参考空间:
    X g e o = G T ( 0 ) + X p i x e l . G T ( 1 ) + Y l i n e . G T ( 2 ) Y g e o = G T ( 3 ) + X p i x e l . G T ( 4 ) + Y l i n e . G T ( 5 ) X_{geo} = GT(0) + Xpixel.GT(1) + Yline.GT(2) \\ Y_{geo} = GT(3) + Xpixel.GT(4) + Yline.GT(5) Xgeo=GT(0)+Xpixel.GT(1)+Yline.GT(2)Ygeo=GT(3)+Xpixel.GT(4)+Yline.GT(5)
    其中像素坐标左上角为 ( 0 , 0 ) (0,0) (0,0) ( G T ( 0 ) , G T ( 3 ) ) (GT(0),GT(3)) (GT(0),GT(3))是栅格左上角坐标, G T ( 1 ) GT(1) GT(1)是像素宽度, G T ( 5 ) GT(5) GT(5)是像素的高度;
  • 可以通过地理控制点(GCP)来描述栅格数据集地理参考,关联了栅格位置和地理参考系统的一个或者多个位置,一个数据集会有一套控制点,控制点通过GDALDataset::GetGCPProjection()得到,每个控制点包含Char pszId(控制点标识符),Char pszInfo(通常是空串),double dfGCPPixel+double dfGCPLine(像素、线的位置是控制点在栅格的位置),double dfGCPX+double dfGCPY+double dfGCPZ(地理参考位置),本条和上一条都描述了栅格位置和地理参考坐标之间的关系;
  • 栅格波段GDALRasterBand
  • 颜色表:像素值被用作颜色表的下标;
try:import gdal
except:from osgeo import gdal	# gdal1.6
from osgeo.gdalconst import *	# 常用的常量# 要读取数据之前需要载入数据驱动
# 注册所有数据驱动
gdal.AllRegister()
# 某一类型的数据驱动,按照数据格式加载
driver = gdal.GetDriverByName('GTiff')
driver.Register()# 查看系统支持的数据格式,其中shortname就是上面GetDriverByName的参数,对于不同的gdal版本GetDriver的结果可能不同
drv_count = gdal.GetDriverCount()
for idx in range(drv_count):driver = gdal.GetDriver(idx)print( "%10s: %s" % (driver.ShortName, driver.LongName))# 读取遥感影像
# 打开GeoTIF文件
dataset = gdal.Open("/gdata/geotiff_file.tif")
# python的dir()函数可以快速查看某对象可用的操作
dataset.GetDescription() 	# 获得栅格的描述信息
dataset.RasterCount 	# 获得栅格数据集的波段数
dataset.RasterXSize 	# 栅格数据的宽度(X方向上的像素个数)
dataset.RasterYSize 	# 栅格数据的高度(Y方向上的像素个数)
dataset.GetGeoTransform() 	# 栅格数据的六参数,这六个参数包括 左上角坐标 , 像元X、Y方向大小 , 旋转 等信息。 要注意, Y 方向的像元大小为负值
GetProjection() 	# 栅格数据的投影
dataset.GetMetadata()		# 获取元数据# 获取数据集的信息
band = dataset.GetRasterBand(1)		# 获取第一个波段,下标从0开始
band.XSize, band.YSize, band.DataType	# 宽高和数据类型
# 数据类型对应
# 未知或未指定类型 gdalconst.GDT_Unknown 0
# 8位无符整型 gdalconst.GDT_Byte 1
# 16位无符整型 gdalconst.GDT_UInt16 2
# 16位整型 gdalconst.GDT_Int16 3
# 32位无符整型 gdalconst.GDT_UInt32 4
# 32位整型值 gdalconst.GDT_Int32 5
# 32位浮点型 gdalconst.GDT_Float32 6
# 64位浮点型 gdalconst.GDT_Float64 7
# 16位复数整型 gdalconst.GDT_CInt16 8
# 32位复数整型 gdalconst.GDT_CInt32 9
# 32位复数浮点型 gdalconst.GDT_CFloat32 10
# 64位复数浮点型 gdalconst.GDT_CFloat64 11
band.GetNoDataValue()		# 无意义填充值
band.GetMaximum()
band.GetMinimum()
band.ComputeRasterMinMax()# 访问栅格数据集的数据
dataset.ReadRaster() 	# 读取图像数据(以二进制的形式)
dataset.ReadAsArray() 	# 读取图像数据(以数组的形式),返回的是numpy的array
# 参数
# xoff,yoff :指定想要读取的部分原点位置在整张图像中距离全图原点的位置(以像元为单位)
# xsize,ysize : 指定要读取部分图像的矩形的长和宽(以像元为单位)
# buf_xsize,buf_ysize :可以在读取出一部分图像后进行缩放。那么就用这两个参数来定义缩放后图像最终的宽和高, GDAL 将帮你缩放到这个大小
# buf_type :可以对读出的数据的类型进行转换(比如原图数据类型是short,你要把它们缩小成byte)
# band_list :适应多波段的情况。可以指定要读取的波段# 查看图片信息
!gdalinfo /gdata/lu75i1.tif	
# 访问索引图像:所读的数据知识真实数据的索引,而不是灰度图像
dataset = gdal.Open('/gdata/lu75i1.tif')
band = dataset.GetRasterBand(1)
band.GetRasterColorInterpretation()		# 返回2,gdalconst.GCI_PaletteIndex,表示索引图
colormap = band.GetRasterColorTable()	# 获取颜色表
colormap.GetPaletteInterpretation()		# 获取颜色表的类型
colormap.GetCount()	# 颜色数量
for i in range(colormap.GetCount() - 10, colormap.GetCount()):print("%i:%s" % (i, colormap.GetColorEntry(i)))	# 获得颜色的四值元祖,例如rgb,cmyk
# 我们通过ReadRaster读出的数据值只是对应到这个表的一个索引而已。 
# 我们需要通过读出这些数据,并在真实数据表中找出真实数据, 重新组织成一个RGB表才能用来绘制。
# 如果不经过对应, 绘制出来的东西可能没有任何意义
# GTiff颜色表存储时是16位的,但是读取之后自动进行了处理变为0-255# 创建影像
driver = gdal.GetDriverByName( 'GTiff' )
dst_filename = '/tmp/x_tmp.tif'
dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte )
from osgeo import osr
dst_ds.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )
srs = osr.SpatialReference()
srs.SetUTM( 11, 1 )
srs.SetWellKnownGeogCS( 'NAD27' )
dst_ds.SetProjection( srs.ExportToWkt() )
raster = numpy.zeros( (512, 512) )
dst_ds.GetRasterBand(1).WriteArray( raster )

ref:
https://www.osgeo.cn/pygis/gdal.html

这篇关于GDAL的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975675

相关文章

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本