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数组条件过滤filter函数使用示例
Jul 22 Python
python文件与目录操作实例详解
Feb 22 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
Sanic框架请求与响应实例分析
Jul 16 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
python 函数中的参数类型
Feb 11 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
Django 返回json数据的实现示例
Mar 05 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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/22 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
js的延迟执行问题分析
2014/06/23 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
Bootstrap CSS布局之图像
2016/12/17 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python 可爱的大小写
2008/09/06 Python
Python Socket编程入门教程
2014/07/11 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python实现翻转数组功能示例
2018/01/12 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
Why we need EJB
2016/10/20 面试题
大学生实习证明范文(5篇)
2014/09/18 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
写给老师的感谢信
2015/01/20 职场文书
党小组评议意见
2015/06/02 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
解决Python字典查找报Keyerror的问题
2021/05/26 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL