由于做项目需要运用到netCDF格式的气象数据,而ArcGIS中需要用栅格影像进行处理,对于较多的文件,ArcGIS一个个手动转换过于繁琐,因此我们采用Python进行转换,当然也可以采用matlab进行转换。

首先需要安装下面几个库:

import os
import netCDF4 as nc
import numpy as np
from osgeo import gdal, osr, ogr
import glob

我们可以在下面网址中寻找对应python安装版本的安装包,下载后,在pycharm控制台中直接安装即可。例如pip install netCDF4-1.5.8-cp39-cp39-win_amd64.whl

https://www.lfd.uci.edu/~gohlke/pythonlibs/https://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装之后即可进行转换:

def nc2tif(data, Output_folder):tmp_data = nc.Dataset(data)  # 利用.Dataset()方法读取nc数据print('tmp_data', tmp_data)Lat_data = tmp_data.variables['lat'][:]Lon_data = tmp_data.variables['lon'][:]# print(Lat_data)# print(Lon_data)tmp_arr = np.asarray(tmp_data.variables['temp'])# 影像的左上角&右下角坐标Lonmin, Latmax, Lonmax, Latmin = [Lon_data.min(), Lat_data.max(), Lon_data.max(), Lat_data.min()]# print(Lonmin, Latmax, Lonmax, Latmin)# 分辨率计算Num_lat = len(Lat_data)  # 5146Num_lon = len(Lon_data)  # 7849Lat_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(tmp_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)  # WGS84out_tif.SetProjection(prj.ExportToWkt())# 数据导出out_tif.GetRasterBand(1).WriteArray(tmp_arr[i])  # 将数据写入内存,此时没有写入到硬盘out_tif.FlushCache()  # 将数据写入到硬盘out_tif = None  # 关闭tif文件def main():Input_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\Data_forcing_01yr_010deg\\"# Input_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\Data_forcing_01mo_010deg\\"Output_folder = r"E:\competition\航天宏图\2-meter air temperature_CMFD\tif\\"# 读取所有数据data_list = glob.glob(os.path.join(Input_folder + '*.nc'))print(data_list)for i in range(len(data_list)):data = data_list[i]nc2tif(data, Output_folder)print(data + '转tif成功')

值得注意的是,tmp_arr = np.asarray(tmp_data.variables['temp'])中的temp可以根据需要转换的波段进行选择,我们可以在读取数据之后print一下,找到对应的波段进行替换即可。如下图中我们应该选择的就是temp。

完成上述步骤即可得到所需的tif图像:

在上述代码中,经过处理的影像是倒置的,可能是处理过程中仿射矩阵读写错误导致的。因此我们可以在写入影像的时候,进行影像的垂直镜像操作即可:WriteArray(ndvi_arr_float[i][::-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['temp'])  ndvi_arr_float = ndvi_arr.astype(float) / 10000  之间# 影像的左上角和右下角坐标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[:])):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)geotransform = (LonMin, Lon_Res, 0, LatMax, 0, -Lat_Res)out_tif.SetGeoTransform(geotransform)srs = osr.SpatialReference()srs.ImportFromEPSG(4326) out_tif.SetProjection(srs.ExportToWkt()) # 数据写出out_tif.GetRasterBand(1).WriteArray(ndvi_arr_float[i][::-1])  # 将数据写入内存,此时没有写入硬盘 此处[::-1]用于图像的垂直镜像对称,避免图像颠倒out_tif.FlushCache()  # 将数据写入硬盘out_tif = None  # 注意必须关闭tif文件

这样便可以得到正确输出的影像:

当然,我们除了在写入时做垂直镜像操作之外,还可以利用python对图像进行几何变换来实现翻转。具体代码如下:

图像水平翻转:

#  图像水平翻转im_data_hor = np.flip(im_data, axis=2)hor_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]writeTiff(im_data_hor, im_geotrans, im_proj, hor_path)

标签水平翻转:

 #  标签水平翻转Hor = cv2.flip(label, 1)hor_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]cv2.imwrite(hor_path, Hor)tran_num += 1

图像垂直翻转:

 #  图像垂直翻转im_data_vec = np.flip(im_data, axis=1)vec_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]writeTiff(im_data_vec, im_geotrans, im_proj, vec_path)

标签垂直翻转:

 #  标签垂直翻转Vec = cv2.flip(label, 0)vec_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]cv2.imwrite(vec_path, Vec)tran_num += 1

图像镜像翻转:

 #  图像对角镜像im_data_dia = np.flip(im_data_vec, axis=2)dia_path = train_image_path + "\\" + str(tran_num) + imageList[i][-4:]writeTiff(im_data_dia, im_geotrans, im_proj, dia_path)

标签镜像翻转:

 #  标签对角镜像Dia = cv2.flip(label, -1)dia_path = train_label_path + "\\" + str(tran_num) + labelList[i][-4:]cv2.imwrite(dia_path, Dia)tran_num += 1

若是输出路径的文件夹没有建立好,则会报如下错误。当然,为了减少工作量,也可以定义一个函数,如果路径不存在则自动创建,就可以解决这个问题。

欢迎大家批评指正 ~~~

基于Python的nc批量转tif相关推荐

  1. PythonR | nc批量转tif

    nc批量转tif 1. nc数据介绍: 2. 编程实践 (1) 基于Python (2) 基于R语言 3. nc数据处理再实践(时间维度为:年月日时分秒) 1. nc数据介绍: NetCDF(netw ...

  2. python空间数据处理_基于Python的空间数据批量处理方法

    第 34 卷 第 4 期 2011 年 8 月 测绘与空间地理信息 GEOMATICS & SPATIAL INFORMATION TECHNOLOGY Vol. 34,No. 4 Aug. ...

  3. 基于Python使用ffmpeg批量缩放图片

    基于Python使用ffmpeg批量缩放图片 一.前言 ​ 笔者因为项目原因或者个人撰文需要,经常要写大量技术文档,文档中通常需要配图,但配图就有一个比较讨厌的问题:截图大小不一,宽度通常要手动调整, ...

  4. 基于Python的文件批量重命名(附详细过程解读)

    基于Python的文件批量重命名(附详细过程解读) 0.闲言碎语 hi ~ 欢迎关注公众号"壹贰叁言"! 啥都写,图一乐哈哈! 1.前因后果 前几日,我在用arcgis处理一些数据 ...

  5. 【Python+图片切割+图片合并】基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配、填充黑边的问题)

    基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配.填充黑边的问题) 前言 效果图 1.批量读取文件 2.清空目标目录方法(配合切割图片方法使用) 3.批量切割图片(像素不足 ...

  6. python应用如何实现升级_一种基于Python实现BMC批量升级的方法与流程

    本发明涉及BMC批量升级,尤其涉及一种基于Python实现BMC批量升级的方法. 背景技术: 随着现代服务器主板技术的发展,主板设计形态复杂多变.无论是设计成本还是后期使用过程中的维护成本都很高.如何 ...

  7. Python读取nc文件转tif

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

  8. 气象数据NC批量转TIF及月尺度计算年尺度-同理其他指标

    大部分气象数据都是NC.NC4文件格式,因此如何读取NC文件,对于气象数据而言是十分重要的.本章主要涉及NC转TIF计算,以及批量读取TIF,批量计算年累计蒸发. 涉及库包括netCDF4.gdal, ...

  9. python处理nc数据转换为tif格式

    应用背景 最近在做蒸散发的相关数据处理,上一篇用ArcPy进行处理,发现太慢了,于是继续寻找简便方法.此篇文章为可运行代码. 参考文献:<使用Python语言将.nc格式影像转换成TIF格式,. ...

最新文章

  1. Hadoop fs命令详解
  2. Windows驱动开发-_驱动对象学习和内核处理字符串初步
  3. sts引入lombok_Spring Boot中lombok的安装与使用详解
  4. hdu5373(整除11)
  5. 自动开料机器人_工业4.0智能家具无人化生产线 自动化无人化大势所趋
  6. 【深度学习】——DNN后向传播、CNN后向传播文章汇总
  7. CF19E-Fairy【树形结构,差分】
  8. vi 编辑意外中断处理办法
  9. 芯片人才平均薪资近万元 2020年芯片人才缺口超30万
  10. 从0到1带你手撸一个请求重试组件,不信你学不会!
  11. java xml收文转对象_Springmvc发送json数据转Java对象接收
  12. 我的编程认知:多思考、多编码、多测试
  13. 为提升 DCP 传输效率,阿里工程师竟然这样做!
  14. 2020年1月1日起,谷歌 Patch Rewards 计划将降低准入门槛,提升开源项目的安全性...
  15. A Tour of the Dart Language(译文):五控制流语句
  16. Redis 缓存 + Spring 的集成示例(转)
  17. CodeBlocks 的下载安装
  18. android 仿站小工具,仿站小工具
  19. 饥荒联机版服务器重置,饥荒联机版服务器重置世界 | 手游网游页游攻略大全
  20. 香橙派python编程_香橙派Orange Pi 4开发板在Ubuntu系统下使用python 控制GPIO

热门文章

  1. 新型联网安卓多层锁机木马分析
  2. 云端存储数据,主要的安全因素是什么?
  3. 小伙为挽回女友雨雪中跪地6小时
  4. LightGBM原理
  5. CTFshow web入门——文件上传
  6. 获取魅族底部smartbar的高度
  7. 【NVIDIA JETSON】Xavier NX刷机
  8. 亿道丨三防手机丨手持PDA丨加固手机丨助力仓储管理
  9. 读书点评——《业力管理》
  10. 安利一个好用的Golang单元测试框架:gocheck