nc数据: NetCDF(network Common Data Form)网络通用数据格式。NetCDF 文件中的数据以数组形式存储。例如:某个位置处随时间变化的温度以一维数组的形式存储。某个区域内在指定时间的温度以二维数组的形式存储。
三维 (3D) 数据(如某个区域内随时间变化的温度)
四维 (4D) 数据(如某个区域内随时间和高度变化的温度)以一系列二维数组的形式存储。 本次使用的样例数据为2018-2020年的月均温度netCDF数据 下面主要介绍如何使用Python和R语言批量将上述nc格式的温度数据转为常用的tif格式数据。
1. 基于Python
import os
import netCDF4 as nc
import numpy as np
from osgeo import gdal,osr,ogr
import glob
def nc2tif(data,Output_folder):
tmp_data = nc.Dataset(data)
Lat_data = tmp_data.variables['lat'][:]
Lon_data = tmp_data.variables['lon'][:]
tmp_arr = np.asarray(tmp_data.variables['tmp'])
Lonmin, Latmax, Lonmax, Latmin = [Lon_data.min(), Lat_data.max(), Lon_data.max(), Lat_data.min()]
Num_lat = len(Lat_data)
Num_lon = len(Lon_data)
Lat_res = (Latmax - Latmin) / (float(Num_lat) - 1)
Lon_res = (Lonmax - Lonmin) / (float(Num_lon) - 1)
for i in range(len(tmp_arr[:])):
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)
geotransform = (Lonmin, Lon_res, 0.0, Latmax, 0.0, -Lat_res)
out_tif.SetGeoTransform(geotransform)
prj = osr.SpatialReference()
prj.ImportFromEPSG(4326)
out_tif.SetProjection(prj.ExportToWkt())
out_tif.GetRasterBand(1).WriteArray(tmp_arr[i])
out_tif.FlushCache()
out_tif = None
def main():
Input_folder = 'G:/learnpy/data/'
Output_folder = 'G:/learnpy/data/nc/nc2tif'
data_list = glob.glob(Input_folder+'*.nc')
for i in range(len(data_list)):
data = data_list[i]
nc2tif(data, Output_folder)
print(data+'转tif成功, 你真棒!')
main()
2. 基于R语言
wd <- "G:/Rdata/Tmp/"
setwd(wd)
library(pacman)
p_load(raster, ncdf4,sf,ggplot2,RColorBrewer)
nc_data = list.files(wd,pattern = ".nc")
nc_data
for (i in nc_data)
{
nc_raster <- brick(i,varname = "tmp")
for(j in 1:12)
{
super1 = substr(i, 1, 7)
super2 = c(1:12)
super3 = paste(super1, super2, sep = '_')
writeRaster(nc_raster[[j]],filename = super3[[j]], format = "GTiff",overwrite=TRUE,
dataType='INT2S')
}
print(paste(i,'转换tif成功,你太棒了!'))
}
可视化: 欢迎关注个人公众号GeoSuper
|