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实现探测socket和web服务示例
Mar 28 Python
python使用socket远程连接错误处理方法
Apr 29 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
django文档学习之applications使用详解
Jan 29 Python
python负载均衡的简单实现方法
Feb 04 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
详解python读取和输出到txt
Mar 29 Python
python opencv实现图像边缘检测
Apr 29 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
python实现银行实战系统
Feb 26 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
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
js实现选项卡效果
2020/03/07 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Python解惑之整数比较详解
2017/04/24 Python
python获取Pandas列名的几种方法
2019/08/07 Python
python基于socket函数实现端口扫描
2020/05/28 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
信用社员工先进事迹材料
2014/02/04 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
上党课的心得体会
2014/09/02 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android