发布于2019-08-06 11:04 阅读(4453) 评论(0) 点赞(3) 收藏(1)
(1)掌握基于Python处理nc格式文件的基本方法
(2)学会将程序函数化,提高程序可读性【待补充】
(1)2019年6月20日; Version 1
NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目前,NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作NetCDF 数据集[1]。
基于Python处理nc数据必要的库是netCDF4,同时如果需要将nc文件转换为tiff文件,还需要osgeo库中的gdal子库和osr子库。
以Python将nc格式的标准化降水蒸散发指数(SPEI)文件转换为tif格式的文件为例,说明nc转tif的python实现过程,SPEI数据下载自西班牙国家研究委员会(CSIC)下属的SPEI下载网站[2]。
'''
1. 目的:基于Python将.nc文件转换为.tif文件
2. 山东青岛 2019年6月20日
'''
# 0. 模块导入
import numpy as np
import netCDF4 as Dataset
from osgeo import gdal,osr
# 1. 路径处理和变量定义
RootDir = r'F:\SPEI_NC'
SPEI_NC = RootDir + '\\spei12.nc' # 输入文件
# 1.1 输出路径-OutPath
OutPath = RootDir + '\\SPEI_TIF'
if os.path.exists(OutPath):
shutil.rmtree(OutPath)
os.mkdir(OutPath)
else:
os.mkdir(OutPath)
OutTif = OutPath + '\\Global_SPEI_Test.tif'
# 2. NetCDF文件处理
NC_DS = Dataset(SPEI_NC)
print(NC_DS,type(NC_DS)) # 了解NC_DS的数据类型,<class 'netCDF4._netCDF4.Dataset'>
print(NC_DS.variables) # 了解变量的基本信息
print(NC_DS.variables['spei']) # 了解SPEI的基本信息
Lat = NC_DS.variables['lat'][:]
Lon = NC_DS.variables['Lon'][:]
SPEI = NC_DS.variables['spei'][13,:,:] # 1901年1月的SPEI_12,注意SPEI的存储形式决定了读取方式
print(type(SPEI),SPEI.shape) # 了解SPEI的数据类型,和维数
# 2.1 异常值处理
SPEI = np.asarray(SPEI) # 数据类型转换
SPEI[np.where(SPEI == 1.e+30)] = -99
# 3. 将数据写出到.tif文件中
# 3.1 影像的左上角和右下角坐标
LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()]
# 3.2 影像的分辨率,此处float(N_Lon)-1是为了保证分辨率为0.5 degree,不知是否合理,望指正
N_Lat = len(Lat)
N_Lon = len(Lon)
Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)
Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1)
# 3.3 构建.tiff文件框架
spei_ds = gdal.GetDriverByName('Gtiff').Create(OutTif,N_Lon,N_Lat,1,gdal.GDT_Float32)
# 3.4 设置影像的显示范围
geotransform = (LonMin,Lon_Res, 0, LatMin, 0, Lat_Res)
spei_ds.SetGeoTransform(geotransform)
# 3.5 地理坐标系统信息
srs = osr.SpatialReference() #获取地理坐标系统信息,用于选取需要的地理坐标系统
print(type(srs))
print(srs)
srs.ImportFromEPSG(4326) # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
spei_ds.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息
# 3.6 数据写出
spei_ds.GetRasterBand(1).WriteArray(SPEI) # 将数据写入内存,此时没有写入硬盘
spei_ds.FlushCache() # 将数据写入硬盘
spei_ds = None # 关闭spei_ds指针,注意必须关闭
print('Finished')
# 3.2 影像的分辨率,此处float(N_Lon)-1是为了保证分辨率为0.5 degree,不知是否合理,望指正
N_Lat = len(Lat)
N_Lon = len(Lon)
Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)
Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1)
[1] : netCDF百度百科
[2] : MATLAB中利用ncread函数读取nc文件
作者:hehrie83489
链接:https://www.pythonheidong.com/blog/article/8105/2e6ccbb4b1726fa742b3/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!