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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue从入门到实战Day03

一、生命周期 1. 生命周期四个阶段 思考: ①什么时候可以发送初始化渲染请求? 答:越早越好,在创建阶段后 ②什么时候可以开始操作DOM? 答:至少DOM得渲染出来,在挂载阶段结束后。 Vue生命周…

SpringBoot+logback实现日志记录写入文件

前言 在实际的开发过程中,日志记录有着极其重要的作用,它帮助我们实现更高效的故障排查与调试、更及时的监控和性能优化、更全面的业务分析与决策支持…那么我们如何在SpringBoot项目中实现日志的个性化定制,以满足其他特殊需求呢&#xff1f…

987: 输出用先序遍历创建的二叉树是否为完全二叉树的判定结果

解法: 一棵二叉树是完全二叉树的条件是: 对于任意一个结点,如果它有右子树而没有左子树,则这棵树不是完全二叉树。 如果一个结点有左子树但是没有右子树,则这个结点之后的所有结点都必须是叶子结点。 如果满足以上条…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数(回归) 2.1 最小二乘函数(Least Squares Function) 2.2 均方误差(Mean Squared Error, MSE) 2.3 均方根误差(Root Mean Squared Error, RMSE) 2.4 平均绝…

PC端网页特效异读

pc网页特效 一、三大系列1.元素偏移量(offset系列)(1)一些属性(2).offset和style的区别(3).一些例子 2.元素可视区(client系列)(1).一些属性(2).flexible.js源码分析 3.scroll系列(4).三大系列小结 其他&am…

libcity笔记:参数设置与参数优先级

1 参数优先级 高优先级的参数会覆盖低优先级的同名参数 Libcity中的优先级顺序维: 命令行参数(命令行python run_model.py时导入的) > 用户定义配置文件(命令行python run_model.py时由config_file导入的) >…

QT--4

QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…

jsp 实验16 MVC 表白墙

源代码以及执行结果截图&#xff1a; ExpressWish_Bean.java package web; import java.util.HashMap; import java.util.ArrayList; import java.util.Iterator; public class ExpressWish_Bean { public HashMap<String,ExpressWish> wishList; ArrayList&…

图片公式识别@文档公式识别@表格识别@在线和离线OCR工具

文章目录 abstract普通文字识别本地软件识别公式扩展插件下载小结 在线识别网站/API&#x1f47a;Quicker整合(推荐)可视化编辑和识别公式其他多模态大模型识别图片中的公式排版 开源模型 abstract 本文介绍免费图片文本识别(OCR)工具,包括普通文字识别,公式识别,甚至是手写公…

2024面试自动化测试面试题【含答案】

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

每日Attention学习5——Multi-Scale Channel Attention Module

模块出处 [link] [code] [WACV 21] Attentional Feature Fusion 模块名称 Multi-Scale Channel Attention Module (MS-CAM) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nnclass MS_CAM(nn.Module):def __init__(self, channels64, r4):super(…

Redis 的数据库管理

Redis 提供了⼏个⾯向 Redis 数据库的操作&#xff0c;分别是 dbsize、select、flushdb、flushall 命令&#xff0c; 我将介绍这些常见的命令。 切换数据库 select dbIndex许多关系型数据库&#xff0c;例如 MySQL ⽀持在⼀个实例下有多个数据库存在的&#xff0c;MySQL 可以…

SQL优化详解

目录 插入数据 insert的优化&#xff08;少量数据&#xff09; 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式&#xff1a; 页分裂&#xff1a; 主键顺序插入的方式&#xff1a; 主键乱序插入&#xff1a; 页合并&#xff1a; 主键设计…

模板引擎Freemarker

什么是模板引擎 根据前边的数据模型分析&#xff0c;课程预览就是把课程的相关信息进行整合&#xff0c;在课程预览界面进行展示&#xff0c;课程预览界面与课程发布的课程详情界面一致。 项目采用模板引擎技术实现课程预览界面。什么是模板引擎&#xff1f; 早期我们采用的…

【有趣的透镜】1.透镜初相识

1.透镜的外形和材料 (1)透镜由玻璃或者塑料制成&#xff1b; (2)透镜一般为圆型&#xff0c;其单面或双面为球面&#xff1b; 2.透镜的类型和折射 (1)球面外凸为凸透镜(聚光)&#xff0c;球面内凹为凹透镜(散光)&#xff1b; (2)透镜是基于光的折射&#xff0c;只要光从一…

Linux的基本指令(下)

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 这篇博客续博主的上篇博客Linux基本指令。 07 …

MATLAB 三维空间中在两点之间等间隔插入多个点 (67)

MATLAB 三维空间中在两点之间等间隔插入多个点 (67) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 用于加密直线点云,具体为根据给定的直线端点,沿着该直线方向,插入多个点,从而加密。具体方法和效果如下所示: 二、算法实现 1.代码 代码如下(示例): % 定…

AlphaFold3: Google DeepMind的的新突破

AlphaFold 3的论文今天在Nature期刊发表啦!这可是AI在生物领域最厉害的突破的最新版本。AlphaFold-3的新招就是用扩散模型去"画出"分子的结构。它一开始先从一团模模糊糊的原子云下手,然后慢慢透过去噪把分子变得越来越清楚。 Alphafold3 我们活在一个从Llama和Sora那…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时&#xff0c;避免窗体闪烁的方法&#xff1a; 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先&#xff0c;右键项目&#xff0c;添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…

跟TED演讲学英文:Teachers need real feedback by Bill Gates

Teachers need real feedback Link: https://www.ted.com/talks/bill_gates_teachers_need_real_feedback Speaker: Bill Gates Date: May 2013 文章目录 Teachers need real feedbackIntroductionVocabularyTranscriptSummary后记 Introduction Until recently, many teach…