<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於做專案需要運用到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/
安裝之後即可進行轉換:
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) # 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) 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) # WGS84 out_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_CMFDData_forcing_01yr_010deg\" # Input_folder = r"E:competition航天宏圖2-meter air temperature_CMFDData_forcing_01mo_010deg\" Output_folder = r"E:competition航天宏圖2-meter air temperature_CMFDtif\" # 讀取所有資料 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格式的文章就介紹到這了,更多相關Python nc轉tif內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45