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获得图片base64编码示例
Jan 16 Python
python实现计算资源图标crc值的方法
Oct 05 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
python解释器spython使用及原理解析
Aug 24 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
python如何写try语句
Jul 14 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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基于CURL进行POST数据上传实例
2014/11/10 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php数组键名技巧小结
2015/02/17 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
js计算精度问题小结
2013/04/22 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
python读取Kafka实例
2019/12/23 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
2019史上最全Database工程师题库
2015/12/06 面试题
博士研究生自我鉴定范文
2013/12/04 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
大二学生自我检讨书
2014/10/23 职场文书
食品卫生管理制度
2015/08/06 职场文书
少先队中队工作总结
2015/08/14 职场文书
python 详解turtle画爱心代码
2022/02/15 Python