本文共 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/