星星博客 »  > 

利用Python和R将NetCDF文件转存为Tiff文件

利用Python和R将NetCDF文件转存为Tiff文件

1、python

参考博客:
https://www.cnblogs.com/shoufengwei/p/9068379.html
https://blog.csdn.net/EWBA_GIS_RS_ER/article/details/84076201
http://www.clarmy.net/2018/11/01/python%E8%AF%BB%E5%8F%96nc%E6%96%87%E4%BB%B6%E7%9A%84%E5%85%A5%E9%97%A8%E7%BA%A7%E6%93%8D%E4%BD%9C/

# -*- 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()

原博主联系方式:
QQ:1932419976
E-mail:1932419976@qq.com

本文版权归作者所有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如果觉得本文对您有益,欢迎点赞、探讨。
————————————————
版权声明:本文为CSDN博主「~Hello」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35737895/article/details/100060390
2、R语言

以全球降水量数据集“cru_ts4.05.2011.2020.pre.dat.nc”为例。

#打开nc文件,查看nc文件数据结构
library(ncdf4)
setwd("E:/CRU")#路径设置
ncdata <- nc_open("cru_ts4.05.2011.2020.pre.dat.nc")

str(ncdata)
library(raster)
tmpbr<-brick("cru_ts4.05.2011.2020.pre.dat.nc",varname="pre")
#nc转多波段TIFF
#writeRaster(tmbpr,"world.tif",format="Gtiff",overwrite=TURE)
#nc转单波段tiff
writeRaster(tmpbr,filename=tmpbr@data@names,bylayer=T,format="GTiff",overwrite=TRUE)


参考链接:
版权声明:本文为CSDN博主「小弱鸡也要长大成大树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_44913294/article/details/111257592

相关文章