什么是NC格式
NC文件即NetCDF (Network Common Data Form),是一种通用的数据存储格式。广泛用于存储地学、大气科学、海洋科学等一系列多维数据,可封装时间、经度、纬度、降水、温度等多个维度数据,数据结构清晰易读,可以很方便的提取、应用。
什么是GeoTiff格式
GeoTIFF 是一种地理栅格文件,可以理解为专门存储地理信息的Tiff图像文件格式。地理坐标系、地图投影等要素直接嵌入到图像文件中。
Python处理nc文件需要用到的库
NetCDF4用于读取NC文件;numpy用于数据修改;osgeo的子库gdal和osr,前者用于实现转换和栅格编辑功能,后者可用于确定地理坐标系和地图投影。
import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr
建议使用 Anaconda 配置虚拟Python环境,可以很方便地进行包管理,我这里使用的环境版本是
python 3.6.12(64bit)
numpy 1.19.1
netCDF4 1.4.2
gdal 3.0.2
查看NC文件信息
import netCDF4 as nc
import numpy as np
item = r'***.nc'#选取一个nc文件路径
DS = nc.Dataset(item)
print(DS,type(NC_DS)) # 返回DS的数据类型,
print('{:-<100}'.format('----'))
print(DS.variables) # 了解变量的基本信息
print('{:-<100}'.format('----'))
print(DS.variables['lon']) # 了解某一变量如“lon”(经度)的基本信息
print('{:-<100}'.format('----'))
TEMP = NC_DS.variables['temp'][666,123,:] # 这是一个三维数据的NC文件,["纬度","经度","温度"],需要按实际修改
print(TEMP) # 查看特定维度数据
NC文件转GeoTiff
#NetCDF文件处理
def Convert(item,day):
DS = nc.Dataset(item)
Lat = DS.variables['lat'][:]
Lon = DS.variables['lon'][:]
PREC = DS.variables['prec'][day,:,:] #[day,lon,lat],即生成 某天 全纬度、经度范围 图像
PREC = np.asarray(PREC) #数据类型转换
PREC[np.where(PREC == -33321)] = np.nan #异常值处理
#影像的部分信息
LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()]
#构建tiff框架
prec_ds = gdal.GetDriverByName('Gtiff').Create(OutTif,len(Lon),len(Lat),1,gdal.GDT_Float32)
#dst_ds = driver.Create(dst_filename, xsize, ysize,bands, eType=gdal.GDT_Byte)
#设置影像的显示范围
prec_ds.SetGeoTransform(LonMin,0.1, 0, LatMin, 0, 0.1)
#SetGeoTransform(double xLeft,double dX,double yProjOnX,double yTop,double x,ProjOnY,double dY)
#这里通常选取的是左上角点的坐标(lonmin,latmax),但如此我的图像会上下颠倒,不知为何
#图像分辨率xsize ysize通常在NC属性中给出,也可以 xsize = (lonmax-lonmin)/len(lon)
#设置地理坐标系和投影坐标系,这里设置为WGS_84,索引号4326
srs = osr.SpatialReference()# 获取地理坐标系统信息,用于选取需要的地理坐标系统
print(type(srs))
print(srs)
srs.ImportFromEPSG(4326) # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
prec_ds.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息
# 数据写出
prec_ds.GetRasterBand(1).SetNoDataValue(-9999)
prec_ds.GetRasterBand(1).WriteArray(PREC) # 将数据写入内存
prec_ds.GetRasterBand(1).GetStatistics(0,1)# 添加统计信息
prec_ds.FlushCache() # 将数据写入硬盘
prec_ds = None # 关闭
设置自定义投影
#设置地理坐标系和投影坐标系,这里设置为WGS_84_Albers
sr = osr.SpatialReference() #获取地理坐标系统信息,用于选取需要的地理坐标系统
print(type(sr))
print(sr)
sr.SetProjCS('WGS_84_Albers')
sr.SetWellKnownGeogCS('WGS84')#设置地理坐标系为WGS_84
sr.SetLCC(35,50,0,90,0,0)#设置等面积圆锥投影的参数
wkt = sr.ExportToWkt()
#print(wkt)
sr.ImportFromWkt(wkt) # 将定义好的参数导出为WKT
prec_ds.SetProjection(sr.ExportToWkt()) # 给新建图层赋予投影信息
用掩膜裁剪
from osgeo import gdal
import os
import time
def clip(input_shape,input_raster,output_raster):
# 栅格文件路径,打开栅格文件
input_raster=gdal.Open(input_raster)
# 裁剪,gdal.warp函数,input_shape是掩膜文件
ds = gdal.Warp(output_raster,input_raster,
format = 'GTiff',
cutlineDSName = input_shape,
dstNodata = -9999)#设置nodata值为-9999,ArcGIS自动识别为nodata
# 添加统计信息
ds.GetRasterBand(1).GetStatistics(0,1)
# 关闭文件
ds = None
本文包括了NC文件读取,NC文件转TIFF、TIFF文件掩膜裁剪、自定投影操作。吸收了多篇文章内容整合而成。代码多有错误,烦请指正。