​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相关推荐

  1. Python读取nc文件转tif

    前言 使用Python解析.nc文件,并导出为WGS84地理坐标系的tif格式文件. PS: Anaconda 安装netCDF4库,在prompt中输入: conda install netCDF4 ...

  2. 批量将NC文件转为tif格式

    批量将多年的NC文件转为tif格式进行处理(来源:https://www.geek-share.com/detail/2763962738.html) 所参考和借鉴的文章的链接如下: https:// ...

  3. 怎样用python批量处理文件夹_python批量处理文件或文件夹

    本文实例为大家分享了python批量处理文件或文件夹的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import os,shutil import sys imp ...

  4. python批量修改文件扩展名

    python批量修改文件扩展名录 前言 代码如下 前言 利用python将文件夹里的.txt文件修改为.tif文件. 代码如下 import os dir='/home/下载/'#文件所在目录 fil ...

  5. 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理

    前言 在我对项目组的一些训练图像进行预处理的时候,发现处理的图像是分好了类,在文件夹里的文件夹里,套娃式存储的,所以对我批处理,以及按原文件夹规则进行存储的时候,就会造成很大困扰 但通过下面几个函数的 ...

  6. python删除文件和linux删除文件区别_使用Python批量删除文件列表

    使用Python批量删除文件列表 环境: 已知要删除的文件列表,即确定哪些文件要删除. 代码如下: #!/usr/bin/env python #coding=utf-8 #目的:本程序主要为删除给定 ...

  7. python批量新建文件_python批量处理

    python opencv图像二值化批量处理 from skimage import data_dir,io,transform,color,filters import numpy as np im ...

  8. python批量转换文件编码

    python批量转换文件编码   3年之前   python 今天在 eclipse 中导入了个之前的 swing 项目,结果跑起来后乱码,检查代码发现竟然一部分 java 文件是 utf-8 编码, ...

  9. 通过Python实现NC文件转GeoTiff格式

    通过Python实现NC文件转GeoTiff格式 〇.目录 通过Python实现NC文件转GeoTiff格式 一.前言 二.基本了解 三.功能实现 四.成图预览 五.参考 六.总结 一.前言 基于Py ...

最新文章

  1. 自己编写的excel操作过程
  2. python语言自学-python自学难吗
  3. BUUCTF(misc) 假如给我三天光明 (盲文+摩斯密码)
  4. Angular项目目录介绍
  5. java awt 边距_Java Swing - 使用Line Border在TextArea上设置边距
  6. 使用Dom4j对XML文档创建与解析
  7. 数字图像处理【经典女郎 Lena 图片】的使用由来~(学习之余来一个调味剂啦)
  8. JQuery右下角弹窗广告
  9. WPS制作三线表(表内横线粗细可调)
  10. 用Keil uVision5创建纯汇编语言的STM32工程
  11. FLASH抽象层(FAL)程序的应用(rt-thread)
  12. 众达两化融合贯标日记08~培训23001标准
  13. wordpress插件_WordPress插件可成功进行内容营销
  14. 人体骨骼关键点检测综述
  15. PHP非诚勿扰-我不是“拍黄片”的!
  16. 《我是歌手》网上报名评审
  17. API Gateway(API网关)介绍
  18. struts2漏洞升级至2.5.30额外补充
  19. 计算机按键模块,计算器键盘-TM1650/AIP650
  20. Ubuntu 16下 AnyProxy + ios 抓包环境配置

热门文章

  1. 输入一个字符串,判断其是否为回文串。
  2. JMockit 介绍 4 使用JMockit运行测试
  3. 日历插件(项目总结)(包括mobiscroll.js LCalendar 和Calendar这三个日历插件)
  4. Java 中的内存映射(Mmap)
  5. 云计算技术与应用课后答案第四章
  6. IDEA 解决 artifacts not found 问题
  7. C语言之栈实现(详细)
  8. Android Studio如何建立VR视频
  9. 基本数据类型的隐式转换
  10. C语言数据结构——广义表