使用 Python 将 NetCDF 转换为 GeoTiff 文件
使用 Python 将 NetCDF 转换为 GeoTiff 文件
ytkz介绍
我们将使用 Python 将 netCDF 文件转换为 GeoTIFF。GeoTIFF 基于 TIFF 格式,用作地理参考光栅图像的交换格式。
第三方库
netCDF4
gdal
numpy
geopandas
读取 netCDF 文件
我们将使用 netCDF.Dataset() 属性来读取 netCDF 文件:
#从osgeo导入必要的库import gdal
import numpy as np
from netCDF4 import Dataset
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
#读取netCDF文件
data = Dataset( r'\path\to\file.nc' )
print(data)
简单可视化
#Creating a vairable 'sic' to store the 2-D array variable 'z'
sic = data.variables[ 'z' ][:]
#翻转
asi_sic = np.flip( sic, 0 )
#显示变量 'z'
cmmap = plt.cm.get_cmap( "jet" )
cmmap.set_bad( 'dimgrey' , 1. )
fig, ax = plt.subplots()
divider = make_axes_locatable( ax)
cax = divider.append_axes( 'right' , size= '5%' , pad= 0.05 )
im = ax.imshow(asi_sic, cmap=cmmap, vmin= 0 ,vmax= 100 )
fig.colorbar(im, cax=cax, orientation= 'vertical' , label= '海冰浓度 (%)' )
ax.axes.xaxis.set_visible( False )
ax.axes.yaxis.set_visible( False )
plt.gcf ().set_size_inches( 15 , 15 )
ax.set_title( 'ASI Daily SIC 2020 年 2 月 1 日网格 6.25 km' , fontsize= 20 )
fig.set_dpi( 300.0 )
plt.show()
我们之所以翻转sic
变量是因为sic
数组是倒排数组。
读取经纬度信息
国产的风云卫星NC文件,经纬度信息一般是提供一个数值范围和间隔大小(空间分辨率),然后根据这两个信息进行插值,得到影像的经纬度信息。
国外的部分NC文件,直接提供一个tiff,该tiff中直接包含了经纬度信息。
创建 GeoTIFF 文件
我们现在只剩下创建 GeoTIFF 文件,并使用gdal
如下方法完成:
#Creating output file
driver = gdal.GetDriverByName( "GTiff" ) #Getting GeoTIFF driver
driver.Register()
outds_asi = driver.Create ( "ASI_625km_SIC_1_Feb_2020.tif" , #输入文件的名称 xsize
= asi_sic.shape[ 1 ], #设置列数
ysize = asi_sic.shape[ 0 ], #设置行数
bands = 1 , #设置波段数
eType = gdal.GDT_Float32) #设置数据类型即float 32
outds_asi.SetGeoTransform( gt_asi)#设置地理信息
outds_asi.SetProjection(proj_asi) #设置投影信息
outband_asi = outds_asi.GetRasterBand( 1 ) #设置波段数
outband_asi.WriteArray(asi_sic) #在文件中写入二维asi_sic数组
outband_asi = None #关闭文件
outds_asi = None #关闭 文件
结论
我们刚刚学习了如何使用 python 将 netCDF 文件转换为 GeoTIFF 文件。GeoTIFF 文件更容易处理,因为它包含地理参考栅格图像形式的空间参考信息。当然,我们可以使用 QGIS、ArcGIS 等 GIS 软件从 netCDF 创建 GeoTIFF 文件,但使用 python,我们可以深入了解整个过程是如何完成的。这是编写本文的必要性。