由于做项目需要运用到netCDF格式的气象数据,而ArcGIS中需要用栅格影像进行处理,对于较多的文件,ArcGIS一个个手动转换过于繁琐,因此我们采用Python进行转换,当然也可以采用matlab进行转换。
首先,您需要安装以下库:
import os
import netCDF4 as nc
import numpy as np
from osgeo import gdal, osr, ogr
import glob
我们可以在下面网址中寻找对应python安装版本的安装包,下载后,在pycharm控制台中直接安装即可。例如pip install netCDF4-1.5.8-cp39-cp39-win_amd64.whl
https://www.lfd.uci.edu/~gohlke/pythonlibs/https://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装之后即可进行转换:[0]
def nc2tif(data, Output_folder):
tmp_data = nc.Dataset(data) # 利用.Dataset()方法读取nc数据
print('tmp_data', tmp_data)
Lat_data = tmp_data.variables['lat'][:]
Lon_data = tmp_data.variables['lon'][:]
# print(Lat_data)
# print(Lon_data)
tmp_arr = np.asarray(tmp_data.variables['temp'])
# 影像的左上角&右下角坐标
Lonmin, Latmax, Lonmax, Latmin = [Lon_data.min(), Lat_data.max(), Lon_data.max(), Lat_data.min()]
# print(Lonmin, Latmax, Lonmax, Latmin)
# 分辨率计算
Num_lat = len(Lat_data) # 5146
Num_lon = len(Lon_data) # 7849
Lat_res = (Latmax - Latmin) / (float(Num_lat) - 1)
Lon_res = (Lonmax - Lonmin) / (float(Num_lon) - 1)
# print(Num_lat, Num_lon)
# print(Lat_res, Lon_res)
for i in range(len(tmp_arr[:])):
# i=0,1,2,3,4,5,6,7,8,9,...
# 创建tif文件
driver = gdal.GetDriverByName('GTiff')
out_tif_name = Output_folder + '\\' + data.split('\\')[-1].split('.')[0] + '_' + str(i + 1) + '.tif'
out_tif = driver.Create(out_tif_name, Num_lon, Num_lat, 1, gdal.GDT_Int16)
# 设置影像的显示范围
# Lat_re前需要添加负号
geotransform = (Lonmin, Lon_res, 0.0, Latmax, 0.0, -Lat_res)
out_tif.SetGeoTransform(geotransform)
# 定义投影
prj = osr.SpatialReference()
prj.ImportFromEPSG(4326) # WGS84
out_tif.SetProjection(prj.ExportToWkt())
# 数据导出
out_tif.GetRasterBand(1).WriteArray(tmp_arr[i]) # 将数据写入内存,此时没有写入到硬盘
out_tif.FlushCache() # 将数据写入到硬盘
out_tif = None # 关闭tif文件
def main():
Input_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\Data_forcing_01yr_010deg\\"
# Input_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\Data_forcing_01mo_010deg\\"
Output_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\tif\\"
# 读取所有数据
data_list = glob.glob(os.path.join(Input_folder + '*.nc'))
print(data_list)
for i in range(len(data_list)):
data = data_list[i]
nc2tif(data, Output_folder)
print(data + '转tif成功')
值得注意的是,tmp_arr = np.asarray(tmp_data.variables[‘temp’])中的temp可以根据需要转换的波段进行选择,我们可以在读取数据之后print一下,找到对应的波段进行替换即可。如下图中我们应该选择的就是temp。
完成上述步骤即可得到所需的tif图像:
如果没有建立输出路径的文件夹,会报如下错误。当然,为了减少工作量,你也可以定义一个函数,如果路径不存在,会自动创建,可以解决这个问题。
欢迎批评指正~~~
文章出处登录后可见!
已经登录?立即刷新