Python空间数据处理之GDAL读写遥感图像


Posted in Python onAugust 01, 2019

GDAL是空间数据处理的开源包,支持多种数据格式的读写。遥感图像是一种带大地坐标的栅格数据,遥感图像的栅格模型包含以下两部分的内容:

栅格矩阵:由正方形或者矩形栅格点组成,每个栅格点所对应的数值为该点的像元值,在遥感图像中用于表示地物属性值;遥感图像有单波段与多波段,波段表示地物属性的种类,每个波段表示地物一种属性。

大地坐标:空间数据参考表示地图的投影信息;仿射矩阵能将行列坐标映射到面坐标上。

GDAL读写遥感数据的代码:

from osgeo import gdal
import os

class GRID:

  #读图像文件
  def read_img(self,filename):
    dataset=gdal.Open(filename)    #打开文件

    im_width = dataset.RasterXSize  #栅格矩阵的列数
    im_height = dataset.RasterYSize  #栅格矩阵的行数

    im_geotrans = dataset.GetGeoTransform() #仿射矩阵
    im_proj = dataset.GetProjection() #地图投影信息
    im_data = dataset.ReadAsArray(0,0,im_width,im_height) #将数据写成数组,对应栅格矩阵

    del dataset 
    return im_proj,im_geotrans,im_data

  #写文件,以写成tif为例
  def write_img(self,filename,im_proj,im_geotrans,im_data):
    #gdal数据类型包括
    #gdal.GDT_Byte, 
    #gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
    #gdal.GDT_Float32, gdal.GDT_Float64

    #判断栅格数据的数据类型
    if 'int8' in im_data.dtype.name:
      datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
      datatype = gdal.GDT_UInt16
    else:
      datatype = gdal.GDT_Float32

    #判读数组维数
    if len(im_data.shape) == 3:
      im_bands, im_height, im_width = im_data.shape
    else:
      im_bands, (im_height, im_width) = 1,im_data.shape 

    #创建文件
    driver = gdal.GetDriverByName("GTiff")      #数据类型必须有,因为要计算需要多大内存空间
    dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)

    dataset.SetGeoTransform(im_geotrans)       #写入仿射变换参数
    dataset.SetProjection(im_proj)          #写入投影

    if im_bands == 1:
      dataset.GetRasterBand(1).WriteArray(im_data) #写入数组数据
    else:
      for i in range(im_bands):
        dataset.GetRasterBand(i+1).WriteArray(im_data[i])

    del dataset

if __name__ == "__main__":
  os.chdir(r'D:\Python_Practice')            #切换路径到待处理图像所在文件夹
  run = GRID()
  proj,geotrans,data = run.read_img('LC81230402013164LGN00.tif')    #读数据
  print proj
  print geotrans
  print data
  print data.shape
  run.write_img('LC81230402013164LGN00_Rewrite.tif',proj,geotrans,data) #写数据

在GDAL遥感影像读写的基础上,我们可以进行遥感图像的各种公式计算和统计分析。

例如我们所熟知的计算NDVI(归一化植被指数),只要在以上代码倒数第二行中插入代码:

import numpy as np
data = data.astype(np.float)
ndvi = (data[3]-data[2])/(data[3]+data[2])             #3为近红外波段;2为红波段
run.write_img('LC81230402013164LGN00_ndvi.tif',proj,geotrans,ndvi) #写为ndvi图像

当然,这是理想的NDVI,实际处理NDVI还会遇到一些其他要处理的问题。例如NDVI值应该在区间[-1,1]内,但实际中会出现大于1或小于-1的情况,或者某些像点是坏点,出现空值nan,需要进一步的配套处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python同时向控制台和文件输出日志logging的方法
May 26 Python
numpy中的高维数组转置实例
Apr 17 Python
详解基于django实现的webssh简单例子
Jul 17 Python
Python 中Django安装和使用教程详解
Jul 03 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
python函数定义和调用过程详解
Feb 09 Python
Python实现名片管理系统
Feb 14 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
python如何实现DES加密
Sep 21 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 #Python
Python中list的交、并、差集获取方法示例
Aug 01 #Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 #Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 #Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 #Python
python psutil模块使用方法解析
Aug 01 #Python
python读写csv文件并增加行列的实例代码
Aug 01 #Python
You might like
php简单分页类实现方法
2015/02/26 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
表单验证的完整应用案例探讨
2013/03/29 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
Python字符串处理实现单词反转
2017/06/14 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
高中自我鉴定
2013/12/20 职场文书
爱情寄语大全
2014/04/09 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
家装电话营销开场白
2015/05/29 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python