基于Python的nc批量转tif
由于做项目需要运用到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相关推荐
- PythonR | nc批量转tif
nc批量转tif 1. nc数据介绍: 2. 编程实践 (1) 基于Python (2) 基于R语言 3. nc数据处理再实践(时间维度为:年月日时分秒) 1. nc数据介绍: NetCDF(netw ...
- python空间数据处理_基于Python的空间数据批量处理方法
第 34 卷 第 4 期 2011 年 8 月 测绘与空间地理信息 GEOMATICS & SPATIAL INFORMATION TECHNOLOGY Vol. 34,No. 4 Aug. ...
- 基于Python使用ffmpeg批量缩放图片
基于Python使用ffmpeg批量缩放图片 一.前言 笔者因为项目原因或者个人撰文需要,经常要写大量技术文档,文档中通常需要配图,但配图就有一个比较讨厌的问题:截图大小不一,宽度通常要手动调整, ...
- 基于Python的文件批量重命名(附详细过程解读)
基于Python的文件批量重命名(附详细过程解读) 0.闲言碎语 hi ~ 欢迎关注公众号"壹贰叁言"! 啥都写,图一乐哈哈! 1.前因后果 前几日,我在用arcgis处理一些数据 ...
- 【Python+图片切割+图片合并】基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配、填充黑边的问题)
基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配.填充黑边的问题) 前言 效果图 1.批量读取文件 2.清空目标目录方法(配合切割图片方法使用) 3.批量切割图片(像素不足 ...
- python应用如何实现升级_一种基于Python实现BMC批量升级的方法与流程
本发明涉及BMC批量升级,尤其涉及一种基于Python实现BMC批量升级的方法. 背景技术: 随着现代服务器主板技术的发展,主板设计形态复杂多变.无论是设计成本还是后期使用过程中的维护成本都很高.如何 ...
- Python读取nc文件转tif
前言 使用Python解析.nc文件,并导出为WGS84地理坐标系的tif格式文件. PS: Anaconda 安装netCDF4库,在prompt中输入: conda install netCDF4 ...
- 气象数据NC批量转TIF及月尺度计算年尺度-同理其他指标
大部分气象数据都是NC.NC4文件格式,因此如何读取NC文件,对于气象数据而言是十分重要的.本章主要涉及NC转TIF计算,以及批量读取TIF,批量计算年累计蒸发. 涉及库包括netCDF4.gdal, ...
- python处理nc数据转换为tif格式
应用背景 最近在做蒸散发的相关数据处理,上一篇用ArcPy进行处理,发现太慢了,于是继续寻找简便方法.此篇文章为可运行代码. 参考文献:<使用Python语言将.nc格式影像转换成TIF格式,. ...
最新文章
- Hadoop fs命令详解
- Windows驱动开发-_驱动对象学习和内核处理字符串初步
- sts引入lombok_Spring Boot中lombok的安装与使用详解
- hdu5373(整除11)
- 自动开料机器人_工业4.0智能家具无人化生产线 自动化无人化大势所趋
- 【深度学习】——DNN后向传播、CNN后向传播文章汇总
- CF19E-Fairy【树形结构,差分】
- vi 编辑意外中断处理办法
- 芯片人才平均薪资近万元 2020年芯片人才缺口超30万
- 从0到1带你手撸一个请求重试组件,不信你学不会!
- java xml收文转对象_Springmvc发送json数据转Java对象接收
- 我的编程认知:多思考、多编码、多测试
- 为提升 DCP 传输效率,阿里工程师竟然这样做!
- 2020年1月1日起,谷歌 Patch Rewards 计划将降低准入门槛,提升开源项目的安全性...
- A Tour of the Dart Language(译文):五控制流语句
- Redis 缓存 + Spring 的集成示例(转)
- CodeBlocks 的下载安装
- android 仿站小工具,仿站小工具
- 饥荒联机版服务器重置,饥荒联机版服务器重置世界 | 手游网游页游攻略大全
- 香橙派python编程_香橙派Orange Pi 4开发板在Ubuntu系统下使用python 控制GPIO