nc转tif python_Python处理NetCDF数据为TIFF格式(附脚本代码)

博客小序:NetCDF数据广泛的用于科学数据存储,最近几日自己处理了一些NetCDF数据,特撰此博文以记之。

1.NetCDF数据简介

2.Python对NetCDF数据基本操作

python中专门用于处理NetCDF数据的库为netCDF4库,需在自己的python路径中安装

In[1]:import netCDF4 as nc #模块导入

In[2]:data = 'F:\\data___python_test\\nc_to_tif\\nc\\ndvi3g_geo_v1_1990_0106.nc4'

nc_data = nc.Dataset(data) #利用.Dataset()方法读取nc数据

nc_data

Out[2]:

In[3]:nc_data.variables #以存储ndvi的nc数据为例,查看nc文件包含的变量

Out[3]:OrderedDict([(u'lon',

float64 lon(lon)

unlimited dimensions:

current shape = (4320,)

filling on, default _FillValue of 9.96920996839e+36 used),

(u'lat',

float64 lat(lat)

unlimited dimensions:

current shape = (2160,)

filling on, default _FillValue of 9.96920996839e+36 used),

(u'time',

float64 time(time)

unlimited dimensions:

current shape = (12,)

filling on, default _FillValue of 9.96920996839e+36 used),

(u'satellites',

int16 satellites(time)

unlimited dimensions:

current shape = (12,)

filling on, default _FillValue of -32767 used),

(u'ndvi',

int16 ndvi(time, lat, lon)

units: 1

scale: x 10000

missing_value: -5000.0

valid_range: [-0.3 1. ]

unlimited dimensions:

current shape = (12, 2160, 4320)

filling on, default _FillValue of -32767 used),

(u'percentile',

int16 percentile(time, lat, lon)

units: %

scale: x 10

flags: flag 0: from data flag 1: spline interpolation flag 2: possible snow/cloud cover

valid_range: flag*2000 + [0 1000]

unlimited dimensions:

current shape = (12, 2160, 4320)

filling on, default _FillValue of -32767 used)])

In[4]:ndvi = nc_data.variables['ndvi'] #单独查看nc文件中存储的变量信息

ndvi

Out[4]:

int16 ndvi(time, lat, lon)

units: 1

scale: x 10000

missing_value: -5000.0

valid_range: [-0.3 1. ]

unlimited dimensions:

current shape = (12, 2160, 4320)

filling on, default _FillValue of -32767 used

3.代码——利用Python将NetCDF文件转存为Tiff文件

此代码是自己在处理NDVI数据时所写的脚本,目的是将每一期NDVI的NC格式数据提取并另存为12期的TIFF数据,便于后期分析处理。

# -*- coding: utf-8 -*-

# 模块导入

import numpy as np

import netCDF4 as nc

from osgeo import gdal,osr,ogr

import os

import glob

# 单个nc数据ndvi数据读取为多个tif文件,并将ndvi值化为-1-1之间

def NC_to_tiffs(data,Output_folder):

nc_data_obj = nc.Dataset(data)

Lon = nc_data_obj.variables['lon'][:]

Lat = nc_data_obj.variables['lat'][:]

ndvi_arr = np.asarray(nc_data_obj.variables['ndvi']) #将ndvi数据读取为数组

ndvi_arr_float = ndvi_arr.astype(float)/10000 #将int类型改为float类型,并化为-1 - 1之间

#影像的左上角和右下角坐标

LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()]

#分辨率计算

N_Lat = len(Lat)

N_Lon = len(Lon)

Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)

Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1)

for i in range(len(ndvi_arr[:])):

#创建.tif文件

driver = gdal.GetDriverByName('GTiff')

out_tif_name = Output_folder + '\\'+ data.split('\\')[-1].split('.')[0] + '_' + str(i+1) + '.tif'

out_tif = driver.Create(out_tif_name,N_Lon,N_Lat,1,gdal.GDT_Float32)

# 设置影像的显示范围

#-Lat_Res一定要是-的

geotransform = (LonMin,Lon_Res, 0, LatMax, 0, -Lat_Res)

out_tif.SetGeoTransform(geotransform)

#获取地理坐标系统信息,用于选取需要的地理坐标系统

srs = osr.SpatialReference()

srs.ImportFromEPSG(4326) # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]

out_tif.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息

#数据写出

out_tif.GetRasterBand(1).WriteArray(ndvi_arr_float[i]) # 将数据写入内存,此时没有写入硬盘

out_tif.FlushCache() # 将数据写入硬盘

out_tif = None # 注意必须关闭tif文件

def main():

Input_folder = 'F:\\data___python_test\\nc_to_tif\\nc'

Output_folder = 'F:\\data___python_test\\nc_to_tif\\tif_result'

# 读取所有nc数据

data_list = glob.glob(Input_folder + '\\*.nc4')

for i in range(len(data_list)):

data = data_list[i]

NC_to_tiffs(data,Output_folder)

print data + '-----转tif成功'

print'----转换结束----'

main()

参考博客

本文作者:DQTDQT

限于作者水平有限,如文中存在任何错误,欢迎不吝指正、交流。

联系方式:

QQ:1426097423

e-mail:duanquntaoyx@163.com

本文版权归作者和博客园共有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。如果觉得本文对您有益,欢迎点赞、探讨。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值