上一节简单介绍了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的基本操作的更多相关文章

  1. shp的基本操作

    本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...

  2. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  3. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  4. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  5. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  6. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  7. 一、Redis基本操作——String(原理篇)

    小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...

  8. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

  9. C++ map的基本操作和使用

    原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...

随机推荐

  1. .net 知新:【3】.net 5 项目结构说明和发布部署

    .net 5的项目目录结构和.net framework有些明显的变化,包括显示结构和项目文件,从这两个方面看看有哪些变化. 项目目录结构 就以上篇用的demo项目为例([.net 知新:[2] .N ...

  2. 使用Magicodes.IE快速导出Excel

    前言 总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用. 注 ...

  3. HttpRunner3源码阅读:7.响应后处理 response.py

    response 上一篇说的client.py来发送请求,这里就来看另一个response.py,该文件主要是完成测试断言方法 可用资料 jmespath[json数据取值处理]: https://g ...

  4. vue 传参动态

    方法一: router/index.js { path: '/src/views/activitiesDetails', name: activitiesDetails, component: act ...

  5. WPF Combox实现下拉多选,可选中多个值

    自定义多选MultiCombox,可以实现下拉列表多选 using System; using System.Collections.Generic; using System.Collections ...

  6. linux copy_id

    ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh ...

  7. Linux 硬盘与硬件管理

    硬件以文件系统(Filesystem)角度来看 文件系统:一个可被挂载的数据称为文件系统,每个操作系统可以使用的文件系统并不一样,windows98是FAT或者FAT16文件系统,而windows20 ...

  8. eclipse中添加进新的java项目中文乱码

    eclipse中添加进新的java项目中文乱码 添加学习的一些项目进eclipse中,结果其中的中文注释都变成了乱码 右击项目,点最下面的属性,出来新得弹框 在文本文件编码部分可以发现是GBK格式,选 ...

  9. STM32—中断详解(配合按键中断代码,代码亲测)

    在STM32中执行中断主要分三部分: 1.配置NVIC_Config()函数 2.配置EXTI_Config()函数 3.编写中断服务函数 (注:本文章所用代码为中断按键代码,实现了按键进入中断从而控 ...

  10. 基于Apache Hudi构建数据湖的典型应用场景介绍

    1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...