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可 ...
随机推荐
- iOS实现常用地图坐标系转换(swift5)
// 桥接后,OC工程也可用 // HTMCoorTransform.swift // HTMapKit // // Created by LongMa on 2021/8/3. // import ...
- 无法解析插件 org.apache.maven.plugins:maven-clean-plugin:2.5
在Idea创建项目中,出现7出错误,告诉我 无法解析插件 org.apache.maven.plugins:maven-clean-plugin:2.5 但是在maven设置中都一致 后来加了几个镜像 ...
- RESTful API 设计风格
HTTP常用动词 GET(SELECT):从服务器取出资源(一项或多项). POST(CREATE):在服务器新建一个资源. PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源). ...
- JavaScript高级程序设计(第4版)-第一章学习
第一章 什么是Javascript 一.历史 JavaScript的名字怎么来的 首先,我们从javascript的历史开始了解,在以前的时候网页要验证某个必填字段是否填写,或者是判断输入的值的正确与 ...
- [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)
记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...
- 目录已存在导致Jenkins项目构建失败的解决方法
Jenkins中的项目在下载源代码时,如果Working Directory中存在未加入版本控制的文件或者目录已经存在于SVN库中,会导致更新失败,整个构建终止,解决方法是将SVN的检出策略由&quo ...
- net Entityframerwork+sqlite 数据库迁移配置(采坑日记)
1首先在app.config配置写入add 1:<provider invariantName="System.Data.SQLite.EF6" type="Sys ...
- 一张图说明 iaas paas saas的区别
图片来源:https://www.bilibili.com/video/BV1QJ411S7c4 P2 云服务的三种模式 1laaS(基础设施即服务) laas(Infrastructure as ...
- Java GC【笔记】
Java GC(垃圾回收机制) (PS:篇幅很长的,样式都会重新整一下,比如使用二级) 首先我们得知道,一个对象被判定为垃圾的标准是什么? 对于Java对象来说,当不被其他的对象引用的时候,就可以看作 ...
- 【设计模式】DDD 设计理念
From: https://liudongdong1.github.io/ 微服务架构,在集中式架构中,系统分析.设计和开发往往是独立进行的,而且各个阶段负责人可能不一样,那么就涉及到交流信息丢失的问 ...