4 Star 31 Fork 13

fungis/python-gdal-test

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
09_文件转换之NC转ASC.py 4.01 KB
一键复制 编辑 原始数据 按行查看 历史
fungis 提交于 2023-03-15 20:03 . 文件转换之NC转ASC
# -*- coding: utf-8 -*-
"""
@File : 09_文件转换之NC转ASC.py
@Author : fungis@163.com
@notice :
"""
import os
import netCDF4 as nc
import numpy as np
filter_list = ['.NC', '.nc'] # 设置过滤后的文件类型 当然可以设置多个类型
def find_filter_file(dirname):
result = [] # 所有的文件
for maindir, subdir, file_name_list in os.walk(dirname):
# print("提示:当前主目录下的所有目录", "2:", subdir) # 当前主目录下的所有目录
# print("3:", file_name_list) # 当前主目录下的所有文件
for filename in file_name_list:
apath = os.path.join(maindir, filename) # 合并成一个完整路径
ext = os.path.splitext(apath)[1] # 获取文件后缀 [0]获取的是除了文件名以外的内容
# 设置过滤器,过滤不符合格式的文件
if ext in filter_list:
result.append(apath)
return result
def gis_NC_to_ASC(in_data, out_path):
"""
保存tif文件
:param dtype: 值类型 float or int
:param in_data: 原始数据路径
:param out_path: 保存tif文件路径
:param dtype: gdal数据类型, 默认自动根据输入识别
:return:
"""
if os.path.exists(in_data) is False:
raise Exception('[Errno 2] 该文件不存在: \'' + in_data + '\'')
nc_data_obj = nc.Dataset(in_data)
print(nc_data_obj.variables.keys()) # dict_keys(['latitude', 'longitude', 'time', 'GNPP'])
# print(nc_data_obj.variables) # 了解变量的基本信息
current_variables = nc_data_obj.variables['temperature']
layer_num = len(current_variables)
print(layer_num)
# 创建.tif文件
for i in range(layer_num):
# 这里要根据变量信息填写,不太的数据变量名称可能会不一致(高耦合)
longitude = nc_data_obj.variables['lon'][:]
latitude = nc_data_obj.variables['lat'][:]
attr = np.asarray(nc_data_obj.variables['temperature'][i]) # 这里根据需求输入想要转换的波段名称
# attr = np.nan_to_num(attr) # 快速将nan转换成0值
# 影像的左上角和右下角坐标
lon_min, lat_max, lon_max, lat_min = \
[longitude.min(), latitude.max(), longitude.max(), latitude.min()]
# 分辨率计算
lat_array = len(latitude)
lon_array = len(longitude)
# 经纬度分辨率
lon_res = (lon_max - lon_min) / (float(lon_array) - 1)
lat_res = (lat_max - lat_min) / (float(lat_array) - 1)
result_file_path = out_path + "_{}.asc".format(i)
# TODO 写入ASC栅格文件头 高耦合
with open(result_file_path, 'a+') as f:
# 写字符串
f.writelines(['ncols 720\n', 'nrows 360\n',
'xllcorner -180\n', 'yllcorner -90\n',
'cellsize 0.5\n', 'NODATA_value -9999\n']) # \n 换行符
# 写入数据
np.savetxt(f, attr)
f.close()
'''
ncols 720
nrows 360
xllcorner -179.75
yllcorner -90.25
cellsize 0.5
NODATA_value -9999
'''
if __name__ == '__main__':
input_file_path = r'./data-use/nc/global/' # 输入你的文件
output_file_path = r'./results/asc/20230315/' # 输出路径
if not os.path.exists(output_file_path):
# os.makedirs可以创建路径上多个
os.makedirs(output_file_path)
file_list = find_filter_file(input_file_path)
if len(file_list) > 0:
for raster_path in file_list:
# 输出文件路径
name = os.path.basename(raster_path).split('.')[0]
result_file = output_file_path + name # 输出文件位置
del name # 删除无效变量
# 执行转换函数
gis_NC_to_ASC(raster_path, result_file)
print('------处理完成------')
else:
raise Exception('[Errno 1] 该路径下无{}类型文件'.format(filter_list))
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/fungiser/python-gdal-test.git
git@gitee.com:fungiser/python-gdal-test.git
fungiser
python-gdal-test
python-gdal-test
master

搜索帮助