打开栅格数据的正确方式

作者:阿振

邮箱:tanzhenyugis@163.com

博客:https://blog.csdn.net/theonegis/article/details/80089375

修改时间:2018-05-16

声明:本文为博主原创文章,转载请注明原文出处


以一个简单例子说明如何打开栅格影像

下面的例子打开一副GeoTIFF影像,输出了影像的一些信息,然后遍历了所有波段,输出波段的一些信息

import gdal# 打开栅格数据集
ds = gdal.Open('example.tif')# 获得栅格数据的一些重要信息
print(f'投影信息:{ds.GetProjection()}')
print(f'栅格波段数:{ds.RasterCount}')
print(f'栅格列数(宽度):{ds.RasterXSize}')
print(f'栅格行数(高度):{ds.RasterYSize}')# 获取数据集的元数据信息
metadata = ds.GetMetadata_Dict()
for key, value in metadata.items():print(f'{key} -> {value}')for b in range(ds.RasterCount):# 注意GDAL中的band计数是从1开始的band = ds.GetRasterBand(b + 1)# 波段数据的一些信息print(f'数据类型:{gdal.GetDataTypeName(band.DataType)}')  # DataType属性返回的是数字print(f'NoData值:{band.GetNoDataValue()}')  # 很多影像都是NoData,我们在做数据处理时要特别对待print(f'统计值(最大值最小值):{band.ComputeRasterMinMax()}')  # 有些数据本身就存储了统计信息,有些数据没有需要计算# 关闭数据集
ds = None

输出如下:

投影信息:PROJCS["WGS 84 / UTM zone 49N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",111],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32649"]]
栅格波段数:3
栅格列数(宽度):4800
栅格行数(高度):4800
AREA_OR_POINT -> Area
数据类型:Int16
NoData值:-28672.0
统计值(最大值最小值):(-435.0, 6134.0)
数据类型:Int16
NoData值:-28672.0
统计值(最大值最小值):(-468.0, 6265.0)
数据类型:Int16
NoData值:-28672.0
统计值(最大值最小值):(21.0, 7267.0)

如何将Dataset转为Numpy的ndarray

当我们得到Band对象以后,如果按照GDAL的C/C++接口惯例,我们可以使用WriteRaster()方法进行数据写入(C/C++接口是WriteBlock()),但是在Python中我们有很强大的ndarray对象,所以我们一般是将Band对象中存储的数据转为ndarray进行处理以后,然后再写回去。

下面介绍几种转换的方法:

  1. Dataset级别进行转换,转换结果是一个三维数组,第一个维度是波段数

  2. Band级别进行转换,转换的结果是一个二维数据

  3. 使用gdal_array模块中的LoadFile()函数直接进行(相当于第一种转换)

import gdal# 打开栅格数据集
ds = gdal.Open('example.tif')
# 在数据集层面转换
image = ds.ReadAsArray()print(f'数据的尺寸:{image.shape}')
# 输出结果为:数据的尺寸:(3, 4800, 4800)
# 这说明ReadAsArray方法将每个波段都转换为了一个二维数组# 获得第一个波段的数据
band1 = image[0]# 在波段层面的转换
for b in range(ds.RasterCount):# 注意GDAL中的band计数是从1开始的band = ds.GetRasterBand(b + 1)band = band.ReadAsArray()print(f'波段大小:{band.shape}')# 关闭数据集
ds = None

输出结果:

数据的尺寸:(3, 4800, 4800)
波段大小:(4800, 4800)
波段大小:(4800, 4800)
波段大小:(4800, 4800)

使用gdal_array模块

from osgeo import gdal_array
# gdal_array模块
image = gdal_array.LoadFile('example.tif')
print(f'数据的尺寸:{image.shape}')

在GDAL中使用Python的异常对象

import gdal
import sys# 允许GDAL跑出Python异常
gdal.UseExceptions()try:ds = gdal.Open('example.tif')
except (FileNotFoundError, RuntimeError) as e:print('文件打开失败!')print(e)sys.exit(1)

打开栅格数据的正确方式相关推荐

  1. python opencv创建图像_打开国庆的正确方式,教你用OpenCV-Python轻松生成微信国庆版头像...

    原标题:打开国庆的正确方式,教你用OpenCV-Python轻松生成微信国庆版头像 OpenCV轻松搞定,不信看内容 相信最近两天大家都被微信头像的国庆版新装刷爆了朋友圈了,不少人都@微信官方,要求换 ...

  2. 热门专业没那么难,文科生打开统计学的正确方式!

    六月,初夏. 高考结束,毕业季到来.准大学生纠结选什么专业,毕业生迈进就业大军,不论什么身份,大家都在思考着同一件事情--当下什么能力最热门? 想要得到答案很简单,打开任意一款求职软件,热门岗位的职位 ...

  3. 词根词缀记单词——打开单词的正确方式

    技巧记忆英语单词--打开新的学习姿势 学习编程看官方文档一直是一个头疼的问题,不得不说,拥有好的英语阅读能力,真的可以大大减少蹩脚翻译带来的理解问题,首先要解决的自然是单词问题 前言:究竟如何记忆的问 ...

  4. python学不会怎么办_学Python很久都学不会,技术大牛教你打开它的正确方式

    当下,数字化时代已来临,借着人工智能的东风,Python在编程语言排行中的地位也不断攀升.简洁易于上手的语法和丰富的扩展,让它在教育培训.金融.财务.营销等领域都有一席之地. 学Python已成为当下 ...

  5. 企业打开Redis的正确方式,来自阿里云云数据库团队的解读

    摘要: Redis是开源的基于内存且可以持久化的分布式 Key – Value数据库.自2009年发布最初版本以来,Redis的热度只增不减,除了经常位居DB-Engines的最受欢迎Key-Valu ...

  6. 打开国庆的正确方式,用Python轻松生成国庆版头像

    OpenCV轻松搞定,不信看内容 公众号[OpenCV学堂],致力于计算机视觉开发技术传播,原创技术文章200+的,涉及OpenCV开发.tensorflow开发.模型解析与训练.传统图像处理算法解析 ...

  7. 打开十一的正确方式,教你用OpenCV-Python轻松生成微信十一版头像

    公众号[OpenCV学堂],致力于计算机视觉开发技术传播,原创技术文章200+的,涉及OpenCV开发.tensorflow开发.模型解析与训练.传统图像处理算法解析,对图像与视觉感兴趣的强烈推荐关注 ...

  8. 打开Shapefile文件的正确方式

    打开Shapefile文件的正确方式 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/ ...

  9. PIE SDK打开栅格数据

    1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...

  10. 怎么修改存储路径_修改桌面文件默认存储位置的正确方式及注意事项

    之前写了篇关于如何修改桌面文件默认存储位置,许多人在修改后出现各种问题,今天重新来讲解一下关于修改桌面文件默认存储位置的正确方式及注意事项. 第一步.在E盘下创建一个文件夹,随便取个名字,或者默认为[ ...

最新文章

  1. 【错误记录】-eclipse 导入类 提示The import XXX cannot be resolved
  2. raid5通常需要几块盘_raid5需要几块硬盘
  3. metasploit framework
  4. VTK:简单操作之FloatingPointExceptions
  5. Android 打开网页搜索关键词
  6. Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
  7. linux挂载硬盘的分区创建,Linux 新增硬盘、新建分区、格式化硬盘、挂载硬盘的操作...
  8. 滴滴医护专车新增南京 共上线6城覆盖1.8万医护
  9. 基于tcp的协议需要设计数据校验码吗_C#与宇电温控表自定义协议通信实例
  10. 鸿蒙系统适配的电脑,鸿蒙来了!华为正式发布操作系统 适配手机电脑多类型设备...
  11. mysql sql数据排名_查询数据排名情况SQL
  12. oracle数据库的重复数据处理
  13. swif开发之--协议的使用
  14. Python 【第十章】 Django路由
  15. 蓝湖怎么切图标注_蓝湖——网页设计在线高效自动标注及切图平台
  16. C语言之联合与变体记录
  17. 【我的Android进阶之旅】解决Jenkins编译出现的Gradle错误:Gradle build daemon disappeared unexpectedly
  18. 中央电大 c语言程序设计a 试题,中央电大2008年秋C语言程序设计A试题5
  19. 如何培养员工的团队合作精神
  20. Python+Excel法力无穷

热门文章

  1. Flutter-------写一个app启动页
  2. 解决报错:SSL certificate problem: certificate has expired
  3. 3dMax 制作玻璃材质
  4. android 后台录制视频,Android实现视频录制
  5. 帝国霸业服务器无限加载,帝国霸业银河生存1.0正式版开局生存流程指南
  6. 隧道点云处理(三):一种简单的隧道二维中线提取方法
  7. 【图像重建】基于Split Bregman实现稀疏图像重建附matlab代码
  8. JVM报错GC overhead limit exceeded
  9. 二分法查找——绝对值最小的数
  10. c语言命令笔记本电脑快捷键,实用的电脑操作技巧(附快捷键)