博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdal学习笔记1-读取数据信息
阅读量:3923 次
发布时间:2019-05-23

本文共 2513 字,大约阅读时间需要 8 分钟。

首先我们打开文件

官网如此说是:在打开GDAL支持的栅格数据存储之前,有必要注册驱动程序。每种支持的格式都有一个驱动程序。通常这是通过GDALAllRegister()函数来完成的,该函数试图注册所有已知的驱动程序,包括那些使用GDALDriverManager::AutoLoadDrivers()从. .文件自动加载的驱动程序。如果某些应用程序需要限制驱动程序集,那么查看gdalallregister.cpp中的代码可能会有所帮助。当导入gdal模块时,Python会自动调用GDALAllRegister()。一旦注册了驱动程序,应用程序应该调用独立的GDALOpen()函数来打开数据集,传递数据集的名称和所需的访问权限(GA_ReadOnly或GA_Update)。
注意,如果GDALOpen()返回NULL,则意味着打开失败,并且已经通过CPLError()发出了错误消息。如果您想控制如何向用户报告错误,请查看CPLError()文档。一般来说,所有GDAL都使用CPLError()进行错误报告。另外,请注意pszFilename实际上不一定是物理文件的名称(尽管它通常是)。它的解释依赖于驱动程序,它可能是一个URL,一个在控制打开或几乎任何东西的末尾添加了额外参数的文件名。请不要将GDAL文件选择对话框限制为只选择物理文件。

from osgeo import gdaldataset = gdal.Open(filename, gdal.GA_ReadOnly)if not dataset:    ...

接下载说了如何获得数据集,官网如此说:正如在光栅数据模型中所描述的,GDALDataset包含一组光栅波段,它们都属于相同的区域,具有相同的分辨率。它还具有元数据、坐标系统、地理参考转换、栅格大小和各种其他信息。

但是给出的代码并不好用

print("Driver: {}/{}".format(dataset.GetDriver().ShortName,                            dataset.GetDriver().LongName))print("Size is {} x {} x {}".format(dataset.RasterXSize,                                    dataset.RasterYSize,                                    dataset.RasterCount))print("Projection is {}".format(dataset.GetProjection()))geotransform = dataset.GetGeoTransform()if geotransform:    print("Origin = ({}, {})".format(geotransform[0], geotransform[3]))    print("Pixel Size = ({}, {})".format(geotransform[1], geotransform[5]))

我在此处读取的哨兵2号L2c只显示了其中几个

发现一位前辈的代码可很好的显示这些数据:

root_ds = gdal.Open(filename)# 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息# tuple中的第一个元素描述的是数据子集的全路径ds_list = root_ds.GetSubDatasets()visual_ds = gdal.Open(ds_list[0][0])  # 取出第12个数据子集(MODIS反射率产品的第一个波段)visual_arr = visual_ds.ReadAsArray()  # 将数据集中的数据转为ndarraydel visual_arrprint(f'打开数据为:{ds_list[0][1]}')print(f'投影信息:{visual_ds.GetProjection()}')print(f'栅格波段数:{visual_ds.RasterCount}')print(f'栅格列数(宽度):{visual_ds.RasterXSize}')print(f'栅格行数(高度):{visual_ds.RasterYSize}')

print里面的f’****'是格式化字符串的意思,这样就可以在里面用{}括号括起来一些函数变量之类的表达式,比较方便。

ds_list似乎包含了整个文件的各种信息,其实我懵逼了,我想知道open之后得到的数据集,dataset的数据集究竟包含哪些信息,不然一直依靠搜索也只是得到他的冰山一角。
在阅读某个前辈文章后知道了要点:

GetSubDatasets方法返回元组列表,每个子数据集有一个元组。每个元组按顺序包含子数据集的名称和描述。以下代码段获取此列表,然后打印出每个子数据集的名称和描述:

我自己的数据使用的是sentinel-2的c级,代码如下:

from osgeo import gdalimport osos.environ['CPL_ZIP_ENCODING'] = 'UTF-8'filename = ('E:/yi_data/shanghai/'    'S2A_MSIL1C_20190916T023551_N0208_R089_T51SUR_20190916T042547.SAFE/'    'MTD_MSIL1C.xml')ds=gdal.Open(filename)subdatasets = ds.GetSubDatasets()print(f'子数据集数:{format(len(subdatasets))}')for sd in subdatasets:    print('Name: {0}\nDescription:{1}\n'.format(*sd))

这是运行结果

转载地址:http://tlhrn.baihongyu.com/

你可能感兴趣的文章
【翻译】.NET 5 Preview 1 发布
查看>>
使用GUI工具Portainer.io管控Docker容器
查看>>
Abp vNext发布v2.3!
查看>>
.NET Core开发实战(第27课:定义Entity:区分领域模型的内在逻辑和外在行为)--学习笔记...
查看>>
BeetleX之vue-autoui自匹配UI插件
查看>>
.NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记...
查看>>
如何用 Blazor 实现 Ant Design 组件库?
查看>>
DotNetCore Web应用程序中的Session管理
查看>>
从业务需求抽象成模型解决方案
查看>>
Kafka
查看>>
Magicodes.IE 2.2发布
查看>>
应用交付老兵眼中的Envoy, 云原生时代下的思考
查看>>
.NET 开源项目 StreamJsonRpc 介绍[上篇]
查看>>
.NET Core微服务开发选项
查看>>
探讨NET Core数据进行3DES加密或解密弱密钥问题
查看>>
Vue 3拖更,尤雨溪介绍最新进展
查看>>
如何利用.NETCore向Azure EventHubs准实时批量发送数据?
查看>>
WPF 框架全构建环境虚拟机硬盘分享
查看>>
ABP框架 v3.0 已发布!
查看>>
使用.Net Core实现的一个图形验证码
查看>>