当前位置:   article > 正文

基于Matlab,python,ArcGIS等实现netCDF(NC)格式数据的读取与转换为Geotiff格式_featuretonetcdf

featuretonetcdf

NetCDF(network Common Data Form)是一种存储多种特殊数据(变量)的文件格式,如温度、湿度、气压、风速、风向。各种变量可以通过一个维度显示。
NetCDF文件中有多个字段,lat为纬度,lon为经度。其他的字段中有径流量、降水量等数据。

使用Matlab转换

使用函数ncdisp(filename.nc)可以在命令窗口中以文本形式显示NetCDF数据源(source)中的所有组、维度、变量定义和所有属性。
matlab中函数ncdisp

每一个字段对应一个矩阵。类似JPEG形式的影像,每一个像元有一个属性值。使用函数ncread(filename,field)可以把某一字段的数据以字段的形式读取。这样以来,只需要根据lon和lat两个字段的经纬度,对这个矩阵添加地理配准,就能生成Geotiff格式的数据文件。

NetCDF中SoilMoi100_200cm_inst字段在Matlab中读取生成的矩阵
文件中的lon,lat两个字段储存经纬度数据是以两个一位数组的形式存储的。只需要经纬度的最大最小值就能确定影像的范围和地理位置。用函数georasterref添加地理配准,生成含地理配准的结构体数组R。最后用geotiffwrite函数把结构体数组R写入tiff文件。
完整Matlab代码如下:

clc
ncfiles = ncinfo('F:\data\GLDAS_NOAH025_3H.A20141230.2100.020\GLDAS_NOAH025_3H.A20141230.0300.020.nc4'); 
% ncfiles = dir('F:\data\GLDAS_NOAH025_3H.A20141230.2100.020\GLDAS_NOAH025_3H.A20141230.0300.020.nc4'); 
N = length(ncfiles.Variables) ;%Variables变量的数量
for i = 1:N
    disp('成功转换');disp(i);
    ncfile = ncfiles.Variables(i).Name ;

    lat = ncread(ncfiles.Filename,'lat') ;%Filename是当前文件名字符型矩阵
    lon = ncread(ncfiles.Filename,'lon') ;
    %%Change lon and lat to double
    lon = double(lon) ;
    lat = double(lat) ;
    A = ncread(ncfiles.Filename,ncfile) ;
%     A=rot90(A);逆时针旋转90度
    A=A';%由于生成的图像倒了,需要转置

    % Write the .grd data into geotiff
    R = georasterref('RasterSize',size(A),'LatitudeLimits',[min(lat),max(lat)],........
      'LongitudeLimits',[min(lon),max(lon)]);
    tiffile = strcat('F:\data\GLDAS_NOAH025_3H.A20141230.2100.020\GLDAS_NOAH025_3H.A20141230.0300.020.nc4',ncfile,'.tif') ;
    geotiffwrite(tiffile,A,R);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

使用python(Arcpy)转换

import arcpy  
from arcpy import env  
from arcpy.sa import *  
# Input data source  
arcpy.env.workspace = r'F:\seadata\2008peryear\core'#set the worksapce where NetCDF exist
arcpy.env.overwriteOutput = True  #If the file has already existed, it'll overwrite.
# Set output folder  
OutputFolder = r'F:\seadata\2008peryear\West_pacific\temperature\\'
# Loop through a list of files in the workspace  
NCfiles = arcpy.ListFiles("*.nc")  
for filename in NCfiles:  

    inNCfiles = arcpy.env.workspace + "/" + filename  
    fileroot = filename[11:17]  +'temp'
    TempLayerFile = "time"  
    outRaster = OutputFolder + "/" + fileroot  
    # Process: Make NetCDF Raster Layer  
    arcpy.MakeNetCDFRasterLayer_md(inNCfiles, "temp", "lon", "lat", TempLayerFile, "", "", "BY_VALUE")
    # Process: Copy Raster  
    arcpy.CopyRaster_management(TempLayerFile, outRaster + ".tif", "", "", "", "NONE", "NONE", "")
    print (filename+r"  has successfully been processed")
print r'all have successfully been processed'
print arcpy.GetMessages() 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

使用ArcGIS转换

点击 Multidimension Tools toolbox ——Make net CDF Feature Layer,选择文件,再选择想要转换的变量字段,点击OK。
在这里插入图片描述
右击图层,点击Data—Export Data,选择保存的形式和位置,点击OK。

在这里插入图片描述

在这里插入图片描述

在Panoply中打开netCDF文件,以后更新

在Panoply中打开的netCDF文件
net CDF的详细介绍请参阅:
Physical Sciences Laboratory的官方网站
UCAR COMMUNITY PROGRAMS 官网
ArcGIS Resource Center

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/329888?site
推荐阅读
相关标签
  

闽ICP备14008679号