通过Python实现NC文件转GeoTiff格式

通过Python实现NC文件转GeoTiff格式

〇、目录

  • 通过Python实现NC文件转GeoTiff格式
    • 一、前言
    • 二、基本了解
    • 三、功能实现
    • 四、成图预览
    • 五、参考
    • 六、总结

一、前言

  • 基于Python和GDAL库介绍处理nc文件的基本操作
  • 简单处理nc文件为GeoTiff文件的Python函数

二、基本了解

  • 什么是NC格式

    NC文件即NetCDF (Network Common Data Form),是一种通用的数据存储格式。广泛用于存储地学、大气科学、海洋科学等一系列多维数据,可封装时间、经度、纬度、降水、温度等多个维度数据,数据结构清晰易读,可以很方便的提取、应用。


  • 什么是GeoTiff格式

    GeoTIFF 是一种地理栅格文件,可以理解为专门存储地理信息的Tiff图像文件格式。地理坐标系、地图投影等要素直接嵌入到图像文件中。


  • Python处理nc文件需要用到的库

    • NetCDF4用于读取NC文件;numpy用于数据修改;osgeo的子库gdalosr,前者用于实现转换和栅格编辑功能,后者可用于确定地理坐标系和地图投影。

      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
      

三、功能实现

  1. 查看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) # 查看特定维度数据
    

  1. 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 # 关闭
    

  1. 设置自定义投影

        #设置地理坐标系和投影坐标系,这里设置为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()) # 给新建图层赋予投影信息 
    

  1. 用掩膜裁剪

    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 
    

四、成图预览

  1. 生成的 Tiff 图像

  1. ArcGIS打开属性
    通过Python实现NC文件转GeoTiff格式_第1张图片

  1. 掩膜裁剪成图通过Python实现NC文件转GeoTiff格式_第2张图片

五、参考

  1. 基于Python+GDAL实现nc格式转geotiff格式.
  2. 使用python的netCDF4库读取.nc文件 和 创建.nc文件.
  3. Python3.GDAL从shp文件生成mask.

六、总结

本文包括了NC文件读取,NC文件转TIFF、TIFF文件掩膜裁剪、自定投影操作。吸收了多篇文章内容整合而成。代码多有错误,烦请指正。

你可能感兴趣的:(Python数据处理,python,cdf,gdal)