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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
Windows下PyCharm安装图文教程
Aug 27 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
Python如何实现强制数据类型转换
Nov 22 Python
python颜色随机生成器的实例代码
Jan 10 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
如何让python的运行速度得到提升
Jul 08 Python
python 如何区分return和yield
Sep 22 Python
Python通过format函数格式化显示值
Oct 17 Python
基于django和dropzone.js实现上传文件
Nov 24 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
Python实现从百度API获取天气的方法
2015/03/11 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
网络技术专业推荐信
2014/02/20 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
人事任命书范文
2014/06/04 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
国家助学金感谢信
2015/01/21 职场文书
医生个人年终总结
2015/02/28 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
天鹅湖观后感
2015/06/09 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL