该程序运行后弹出界面,选择工作路径(nc文件所在文件夹)选择输出路径(tif文件输出文件夹) 点击运行后,开始自动转换: 面对不同的NC文件,其数据结构不同:# var_lon = f['longitude'][:] # var_lat = f['latitude'][:] # data = f['emission'][1, :, :]只需修改此部分即可
import tkinter as tk
from tkinter import *
from tkinter import filedialog
import numpy as np
import netCDF4 as nc
from osgeo import gdal, osr
import time
import os
# 选择路径函数
def select_path1():
global path_1
path_1 = filedialog.askdirectory()
print("工作路径:", path_1)
return (path_1)
def select_path3():
global path_3
path_3 = filedialog.askdirectory()
print("输出路径:", path_3)
return (path_3)
# 求nc转tif 面对不同的nc文件,其数据集结构不同,只需修改
# var_lon = f['longitude'][:]
# var_lat = f['latitude'][:]
# data = f['emission'][1, :, :]
# 这三个部分即可,其他地方不需要修改;
def nctif(x, y):
folder_path = x # 指定文件夹路径
file_path_list = [] # 存储文件路径的列表
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".nc"):
file_path = os.path.join(root, file)
file_path_list.append(file_path)
for i in file_path_list: # 读取nc
data = '"' + i + '"'
print(data)
f = nc.Dataset(i)
date = i[40:44] + i[46:48] # 提取2019和01作为日期
# 读取经纬度及排放量
var_lon = f['longitude'][:]
var_lat = f['latitude'][:]
data = f['emission'][1, :, :]
# 通过np包下的asarray将数据转换为数组
data_arr = np.asarray(data)
# 影像的左上角和右下角坐标
LonMin, LatMax, LonMax, LatMin = [var_lon.min(), var_lat.max(), var_lon.max(), var_lat.min()]
# 分辨率计算
N_Lat = len(var_lat)
N_Lon = len(var_lon)
Lon_Res = (LonMax - LonMin) / (float(N_Lon) - 1)
Lat_Res = (LatMax - LatMin) / (float(N_Lat) - 1)
# 创建.tif文件
driver = gdal.GetDriverByName('GTiff')
out_tif_name = y + '/' + date + ".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(data_arr) # 将数据写入内存,此时没有写入硬盘
out_tif.FlushCache() # 将数据写入硬盘
out_tif = None # 注意必须关闭tif文件
# 定义全局变量来存储路径
path_1 = None
path_3 = None
# 创建窗口
window = tk.Tk()
# 设置长宽
window.geometry("400x400")
# 设置颜色
window.configure(background="white")
# 窗口标题
window.title("nc转tif")
LABLE = Label(window, bg="#8c52ff", fg="#ffffff", text="欢迎使用nc转tif程序---CUIT", font=("Helvetica", 15, "bold"), pady=10)
LABLE.place(x=90, y=0)
# 工作路径
button1 = tk.Button(window, text="工作路径", command=None)
button1.place(x=55, y=60)
button1.configure(command=select_path1)
# 输出路径
button3 = tk.Button(window, text="输出路径", command=None)
button3.place(x=55, y=180)
button3.configure(command=select_path3)
# 运行
button4 = tk.Button(window, text="运行", command=None)
button4.place(x=200, y=200)
button4.configure(command=lambda: nctif(path_1, path_3))
window.mainloop()
如果运行程序时,遇到相关问题,欢迎私信我进行讨论!后续会制作各种小程序,处理RS数据处理中的:均值处理、投影变换、拼接、裁剪等小程序;欢迎大家关注!