代码分享 Python | 批量nc文件转tif
01
准备工作:查看nc文件属性等。
工具:Panoply、Matlab等软件。
操作: 1.使用Panoply 软件。
2.使用Matlab软件。
即可查看nc文件内各种属性;
如果想单独查看变量:(以经度为例)
02
任务举例:降水nc数据转tif,坐标系为WGS 84。
工具准备:Python GDAL和netCDF4环境。
操作:替换代码中的属性变量名和路径即可。
任务举例:降水nc数据转tif,坐标系为WGS 84。
工具准备:Python GDAL和netCDF4环境。
操作:替换代码中的属性变量名和路径即可。
# -*- coding: UTF-8 -*-
import os
import netCDF4 as nc
import numpy as np
from osgeo import gdal, osr, ogr
import glob
def nc2tif(data, Output_folder):pre_data = nc.Dataset(data) # 利用.Dataset()读取nc数据
Lat_data = pre_data.variables['lat'][:]# print(Lat_data)Lon_data = pre_data.variables['lon'][:]# print(Lon_data)
pre_arr= np.asarray(pre_data.variables['pre'])#属性变量名
# 影像的左上角&右下角坐标Lonmin, Latmax, Lonmax, Latmin = [Lon_data.min(), Lat_data.max(), Lon_data.max(), Lat_data.min()]# Lonmin, Latmax, Lonmax, Latmin
# 分辨率计算Num_lat = len(Lat_data) Num_lon = len(Lon_data) Lat_res = (Latmax - Latmin) / (float(Num_lat) - 1)Lon_res = (Lonmax - Lonmin) / (float(Num_lon) - 1)# print(Num_lat, Num_lon)# print(Lat_res, Lon_res)
for i in range(len(pre_arr[:])):# i=0,1,2,3,4,5,6,7,8,9,...# 创建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, Num_lon, Num_lat, 1, gdal.GDT_Int16)
# 设置影像的显示范围# Lat_re前需要添加负号geotransform = (Lonmin, Lon_res, 0.0, Latmax, 0.0, -Lat_res)out_tif.SetGeoTransform(geotransform)
# 定义投影prj = osr.SpatialReference()prj.ImportFromEPSG(4326)out_tif.SetProjection(prj.ExportToWkt())
# 数据导出out_tif.GetRasterBand(1).WriteArray(pre_arr[i]) # 将数据写入内存out_tif.FlushCache() # 将数据写入到硬盘out_tif = None # 关闭tif文件
def main():Input_folder = r'G:/pre_2020/'Output_folder = r'G:/pre_2020/'data_list = glob.glob(os.path.join(Input_folder, '*.nc'))data_list.sort()# 读取所有数据# data_list = glob.glob(Input_folder + '*.nc')print(data_list)for i in range(len(data_list)):data = data_list[i]nc2tif(data, Output_folder)print(data + '转tif成功')
main()
03
任务举例:如果转出的tif影像倒置。
操作:加一行代码:
data = np.flipud(data)
示例:
04
任务举例:若nc文件范围跨了180度经线,无法确定具体范围和分辨率;或nc文件的坐标系并不是WGS84。
操作:利用Arcgis转出一幅范围和投影正确的栅格图像,再用代码。(Arcgis无法将一个nc文件导出为不同时间的tif文件)。
步骤一:利用arcgis将nc转tif。
系统工具箱-Multidimension Tools-创建NetCDF栅格图层。
成功后右击图层-数据-导出数据,即可导出栅格数据集。
步骤二:修改路径和变量名,在python中运行下列代码即可。
# -*- coding: UTF-8 -*-
import os
import netCDF4 as nc
import numpy as np
from osgeo import gdal, osr, ogr
import glob
def WriteTiff(im_data, inputdir, path):raster = gdal.Open(inputdir)im_width = raster.RasterXSize # 栅格矩阵的列数im_height = raster.RasterYSize # 栅格矩阵的行数im_bands = raster.RasterCount # 波段数im_geotrans = raster.GetGeoTransform() # 获取仿射矩阵信息im_proj = raster.GetProjection() # 获取投影信息
if 'int8' in im_data.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelif len(im_data.shape) == 2:im_data = np.array([im_data])im_bands, im_height, im_width = im_data.shape# 创建文件driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(path, im_width, im_height, im_bands, datatype)#print(dataset)if (dataset != None):dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数dataset.SetProjection(im_proj) # 写入投影for i in range(im_bands):dataset.GetRasterBand(i + 1).WriteArray(im_data[i])del dataset
infile = "D:/tmax/daymet_v4_daily_na_tmax_1980.nc" #nc文件路径
data_set = nc.Dataset(infile) # 读取nc文件信息
time = data_set.variables["time_bnds"][:] #获取时间序列
# 读取样本tif文件的地理信息
intif = "D:/tmax_Layer1.tif" #标准的tif文件路径
for i in range(0, len(time)):value_data = data_set.variables['tmax'][i]# 将缺失值改为0data = value_data.datamask = value_data.maskdata[np.where(mask == True)] = 0outputname = "D:/tmax2/" + 'tmax' + str(1980)+str(i+1).zfill(3) + ".tif" #输出文件的命名方式WriteTiff(data, intif, outputname)print(outputname)
编辑 | 南波婉帆 南波婉琳 南波婉琬
审核 | 南波婉琳
END 更多精彩关注GeoLab 219
代码分享 Python | 批量nc文件转tif相关推荐
- Python读取nc文件转tif
前言 使用Python解析.nc文件,并导出为WGS84地理坐标系的tif格式文件. PS: Anaconda 安装netCDF4库,在prompt中输入: conda install netCDF4 ...
- 批量将NC文件转为tif格式
批量将多年的NC文件转为tif格式进行处理(来源:https://www.geek-share.com/detail/2763962738.html) 所参考和借鉴的文章的链接如下: https:// ...
- 怎样用python批量处理文件夹_python批量处理文件或文件夹
本文实例为大家分享了python批量处理文件或文件夹的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import os,shutil import sys imp ...
- python批量修改文件扩展名
python批量修改文件扩展名录 前言 代码如下 前言 利用python将文件夹里的.txt文件修改为.tif文件. 代码如下 import os dir='/home/下载/'#文件所在目录 fil ...
- 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理
前言 在我对项目组的一些训练图像进行预处理的时候,发现处理的图像是分好了类,在文件夹里的文件夹里,套娃式存储的,所以对我批处理,以及按原文件夹规则进行存储的时候,就会造成很大困扰 但通过下面几个函数的 ...
- python删除文件和linux删除文件区别_使用Python批量删除文件列表
使用Python批量删除文件列表 环境: 已知要删除的文件列表,即确定哪些文件要删除. 代码如下: #!/usr/bin/env python #coding=utf-8 #目的:本程序主要为删除给定 ...
- python批量新建文件_python批量处理
python opencv图像二值化批量处理 from skimage import data_dir,io,transform,color,filters import numpy as np im ...
- python批量转换文件编码
python批量转换文件编码 3年之前 python 今天在 eclipse 中导入了个之前的 swing 项目,结果跑起来后乱码,检查代码发现竟然一部分 java 文件是 utf-8 编码, ...
- 通过Python实现NC文件转GeoTiff格式
通过Python实现NC文件转GeoTiff格式 〇.目录 通过Python实现NC文件转GeoTiff格式 一.前言 二.基本了解 三.功能实现 四.成图预览 五.参考 六.总结 一.前言 基于Py ...
最新文章
- 自己编写的excel操作过程
- python语言自学-python自学难吗
- BUUCTF(misc) 假如给我三天光明 (盲文+摩斯密码)
- Angular项目目录介绍
- java awt 边距_Java Swing - 使用Line Border在TextArea上设置边距
- 使用Dom4j对XML文档创建与解析
- 数字图像处理【经典女郎 Lena 图片】的使用由来~(学习之余来一个调味剂啦)
- JQuery右下角弹窗广告
- WPS制作三线表(表内横线粗细可调)
- 用Keil uVision5创建纯汇编语言的STM32工程
- FLASH抽象层(FAL)程序的应用(rt-thread)
- 众达两化融合贯标日记08~培训23001标准
- wordpress插件_WordPress插件可成功进行内容营销
- 人体骨骼关键点检测综述
- PHP非诚勿扰-我不是“拍黄片”的!
- 《我是歌手》网上报名评审
- API Gateway(API网关)介绍
- struts2漏洞升级至2.5.30额外补充
- 计算机按键模块,计算器键盘-TM1650/AIP650
- Ubuntu 16下 AnyProxy + ios 抓包环境配置