版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第基于Python实现nc批量转tif格式由于做项目需要运用到netCDF格式的气象数据,而ArcGIS中需要用栅格影像进行处理,对于较多的文件,ArcGIS一个个手动转换过于繁琐,因此我们采用Python进行转换,当然也可以采用matlab进行转换。
首先需要安装下面几个库:
importos
importnetCDF4asnc
importnumpyasnp
fromosgeoimportgdal,osr,ogr
importglob
我们可以在下面网址中寻找对应python安装版本的安装包,下载后,在pycharm控制台中直接安装即可。例如pipinstallnetCDF4-1.5.8-cp39-cp39-
win_amd64.whl
/~gohlke/pythonlibs/
安装之后即可进行转换:
defnc2tif(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)#5146
Num_lon=len(Lon_data)#7849
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)
foriinrange(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)#WGS84
out_tif.SetProjection(prj.ExportToWkt())
#数据导出
out_tif.GetRasterBand(1).WriteArray(tmp_arr[i])#将数据写入内存,此时没有写入到硬盘
out_tif.FlushCache()#将数据写入到硬盘
out_tif=None#关闭tif文件
defmain():
Input_folder=r"E:\competition\航天宏图\2-meterairtemperature_CMFD\Data_forcing_01yr_010deg\\"
#Input_folder=r"E:\competition\航天宏图\2-meterairtemperature_CMFD\Data_forcing_01mo_010deg\\"
Output_folder=r"E:\competition\航天宏图\2-meterairtemperature_CMFD\tif\\"
#读取所有数据
data_list=glob.glob(os.path.join(Input_folder+'*.nc'))
print(data_list)
foriinrange(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])
defNC_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)
foriinrange(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_pat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏南通市第一人民医院第一批招聘备案制工作人员102人备考题库附参考答案详解(综合题)
- 2026湖南邵阳市绥宁县事业单位人才引进9人备考题库含答案详解【巩固】
- 2026江苏苏州工业园区公共文化中心辅助人员招聘4人备考题库带答案详解(完整版)
- 2026宁波东方海纳人力资源服务有限公司招聘外包制工作人员1人备考题库【综合题】附答案详解
- 2026云南曲靖市陆良县人力资源和社会保障局招聘公益性岗位3人备考题库及完整答案详解【历年真题】
- 2026陕西延安市志丹县人力资源和社会保障局公益性岗位招聘50人备考题库及答案详解(易错题)
- 2026山东省新动能基金管理有限公司校园招聘8人备考题库及参考答案详解【夺分金卷】
- 2026上海华东师范大学物理学院综合秘书招聘1人备考题库及一套答案详解
- 2026福建漳州市龙文区教育局招聘43人备考题库及参考答案详解一套
- 2026上半年四川成都市大邑县医疗卫生事业单位考核招聘高层次人才23人备考题库参考答案详解
- 揭榜挂帅制度管理办法
- 医卫单招考试题库及答案
- 船舶气象仪现场比测方法
- 2025-2030中国皮肤健康检测设备行业应用状况与盈利前景预测报告
- TSG-21-2016-固定式压力容器安全技术监察规程
- CJ/T 407-2012城市轨道交通基于通信的列车自动控制系统技术要求
- TCACM1315-2019中医内科临床诊疗指南阿尔茨海默病
- 采购基础知识与技巧(第三版)课件:采购谈判
- 农田转租合同协议书范本
- TSG Z7002-2022特种设备检测机构核准规则
- 建筑工程行业发展趋势
评论
0/150
提交评论