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装饰器
Jul 27 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
Python 打印中文字符的三种方法
Aug 14 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
python之pexpect实现自动交互的例子
Jul 25 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
Django nginx配置实现过程详解
Sep 10 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中函数内引用全局变量的方法
2008/10/20 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
告诉大家什么是JSON
2008/06/10 Javascript
Js 中debug方式
2010/02/07 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
JSON Web Tokens的实现原理
2017/04/02 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
python wsgiref源码解析
2021/02/06 Python
应届毕业生求职自荐书
2014/01/03 职场文书
厨师长岗位职责
2014/03/02 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
行政文员岗位职责
2015/02/04 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
2015年财政所工作总结
2015/04/25 职场文书
机关单位保密工作责任书
2015/05/11 职场文书