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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
简单实现python画圆功能
Jan 25 Python
Django model序列化为json的方法示例
Oct 16 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
python如何保证输入键入数字的方法
Aug 23 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
详解Python的三种拷贝方式
Feb 11 Python
Python 中由 yield 实现异步操作
May 04 Python
通过实例解析python and和or使用方法
Nov 14 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
点评山进PR-D3L三波段收音机
2021/03/02 无线电
PHP生成静态页面详解
2006/12/05 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
Python subprocess模块学习总结
2014/03/13 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python实现扫码工具的示例代码
2020/10/09 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
《一个小村庄的故事》教学反思
2014/04/13 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
社区清明节活动总结
2014/07/04 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
2019年入党思想汇报
2019/03/25 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python