GDAL的基本操作
上一节简单介绍了GDAL,这一节将介绍一些GDAL的基本操作,如影像读写、波段提取、波段合成等。代码均用python编写。
1.遥感影像的读写
众所周知,遥感影像是以栅格形式存储的,GDAL中使用dataset表示一个栅格数据(使用抽象类GDALDataset表示),一个dataset包含了对于栅格数据的波段,空间参考以及元数据等信息。一张GeoTIFF遥感影像,一张DEM影像,或者一张土地利用图,在GDAL中都是一个GDALDataset。
- 坐标系统(使用OGC WKT格式表示的空间坐标系统或者投影系统)
- 地理放射变换(使用放射变换表示图上坐标和地理坐标的关系)
- GCPs(大地控制点记录了图上点及其大地坐标的关系,通过多个大地控制点可以重建图上坐标和地理坐标的关系)
- 元数据(键值对的集合,用于记录和影像相关的元数据信息)
- 栅格波段(使用GDALRasterBand类表示,真正用于存储影像栅格值,一个栅格数据可以有多个波段)
- 颜色表(Color Table用于图像显示)
GDAL使用Open()函数读取影像数据,函数返回Dataset对象。GDAL目前支持约100种格式的栅格数据读取,包括ERDAS Imagine、ENVI、GRASS、GeoTIFF、HDF4、HDF5、TIFF、JPEG、JPEG2000、PNG、GIF、BMP等。
import numpy as np
from osgeo import gdal
in_ds = gdal.Open(r"D:\data\test.tif") # 打开样本文件
xsize = in_ds.RasterXSize # 获取行列数
ysize = in_ds.RasterYSize
bands = in_ds.RasterCount # 获取波段数
geotransform = in_ds.GetGeoTransform() # 获取投影信息
projection = in_ds.GetProjectionRef()
block_data = in_ds.ReadAsArray(0,0,xsize,ysize).astype(np.float32)# 获取影像信息
B = block_data[0, :, :] #获取第一波段数据
G = block_data[1,:, :] #获取第二波段数据
R = block_data[2,:, :] #获取第三波段数据
Dataset对象的RasterYSize、RasterXSize和RasterCount属性分别返回栅格数据的行数、列数和波段数。Dataset对象的GetGeoTransform()方法返回栅格数据的坐标转换参数,即行列坐标与空间坐标的转换参数。Dataset对象的GetProjection()方法返回栅格数据的空间参照系统信息(WKT文本)。栅格数据通常有多个波段, Dataset对象的GetRasterBand(index)方法将返回某个波段的数据对象(Band对象),如ds.GetRasterBand(1)返回第一个波段的数据对象(注意:第一波段是1,不是0GetMinimum()和GetMaximum() 方法返回波段数据的最小值和最大值。ComputeStatistics()方法返回波段数据的统计信息,包括最小值、最大值、平均值和标准偏差,approx_ok参数表示是否抽样统计,值为False表示统计所有栅格。ReadAsArray()函数返回的二维数组,astype()可以改变数组的数据类型。
driver = gdal.GetDriverByName('GTiff')
out_dataset=driver.Create("RGB.tif",xsize,ysize,3,gdal.GDT_Float32)
out_band1 = out_dataset.GetRasterBand(1)
out_band1.WriteArray(B)
out_band2 = out_dataset.GetRasterBand(2)
out_band2.WriteArray(G)
out_band3 = out_dataset.GetRasterBand(3)
out_band3.WriteArray(R)
out_dataset.SetGeoTransform(geotransform) # 写入仿射变换
out_dataset.SetProjection(projection)
将上一步得到的R、G、B三个波段数据存储为新的数据(RGB.tif)。gdal.GDT_Float32代表数据类型,数据类型决定了栅格值的范围,如数据类型为GDT_Byte,则栅格值的范围是0~255;如要存储的数据栅格值的范围是0~65535,则数据类型应该是GDT_UInt16。
gdal常用的数据类型包括:
- gdal.GDT_Byte 8bit正整型
- gdal.GDT_UInt16 16bit正整型
- gdal.GDT_Int16 16bit整型
- gdal.GDT_UInt32 32bit 正整型
- gdal.GDT_Int32 32bit整型
- gdal.GDT_Float32 32bit 浮点型
- gdal.GDT_Float64 64bit 浮点型
2.栅格数据行列号和地理坐标相互转换
2.1行列坐标转空间坐标
from osgeo import gdal
def Pixel2world(geotransform, line, column):
originX = geotransform[0]
originY = geotransform[3]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
x = column*pixelWidth + originX - pixelWidth/2
y = line*pixelHeight + originY - pixelHeight/2
return(x,y)
line和column为行列坐标(行列号);pixelWidth和pixelHeigt为x方向比例尺和y方向比例尺;originX和originY为左上角的x和y坐标。
2.2空间坐标转行列坐标:
from osgeo import gdal
def world2Pixel(geotransform, x, y):
originX = geotransform[0]
originY = geotransform[3]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
line = int((y-originY)/pixelHeight)+1
column = int((x-originX)/pixelWidth)+1
return (line,column)
import numpy as np
GDAL的基本操作的更多相关文章
- shp的基本操作
本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- 三、Redis基本操作——List
小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...
- 二、Redis基本操作——String(实战篇)
小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...
- 一、Redis基本操作——String(原理篇)
小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...
- Linq查询基本操作
摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...
- C++ map的基本操作和使用
原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...
随机推荐
- Wordpress 4.6 任意命令执行漏洞(PwnScriptum)
漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...
- css文件编码
当css文件的编码
- 做Android开发怎么才能不被淘汰?
1.Jetpack架构组件从入门到精通 Android Jetpack - Navigation Android Jetpack - Data Binding Android Jetpack - Vi ...
- 刷到血赚!字节跳动内部出品:722页Android开发《360°全方面性能调优》学习手册首次外放,附项目实战!
前言 我们平时在使用软件的过程中是不是遇到过这样的情况:"这个 app 怎么还没下载完!"."太卡了吧!"."图片怎么还没加载出来!".&q ...
- Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf
在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少 在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习 ...
- RabbitMQ入门案例
RabbitMQ入门案例 Rabbit 模式 https://www.rabbitmq.com/getstarted.html 实现步骤 构建一个 maven工程 导入 rabbitmq的依赖 启动 ...
- Linux中的DNS主从解析
目录 一.主服务器配置(紧接着正反解析实验) 1.1.修改区域配置文件 二.从服务器配置(启动另一台虚拟机) 2.1.安装服务 2.2.修改主配置文件 2.3.修改区域配置文件 2.4.修改dns服务 ...
- JavaWeb——CSS总结
CSS 记得大一下学期那会参加基地后就开始跟师兄师姐接触前端了,利用业余时间在站看各种视频.由于初次认知并且时间也能不固定集中,也存在跳跃式学习等等原因,这就导致了好多知识点要么漏掉要么没记全,只能懂 ...
- Java-ThreadPool线程池总结
ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出的线程排队等候,等待其他线程执行完毕 ...
- SQL注入:基本查询原理
SQL注入概述 sql注入不需要精通sql的各种命令,只需要了解几个命令并会使用即可. SQL注入:一种针对于数据库的攻击 现在的web网站都需要数据库的支持. SQL部分重要内容: 库:databa ...