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

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);

使用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() 

使用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

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬_冬_

若觉得文章对您有用,请随意打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值