基于Python+GDAL實現nc格式轉geotiff格式
- 1. 目的
- 2. 版本
- 3. 基礎知識
- ?3.1 什么是nc文件?
- ?3.2 基于Python處理nc文件需要用到的庫
- 4. 程序示例
- 5. 問題
- ? 5.1 影像分辨率的設置
- 參考資料
1. 目的
(1)掌握基于Python處理nc格式文件的基本方法
(2)學會將程序函數化,提高程序可讀性【待補充】
2. 版本
(1)2019年6月20日; ? ?Version 1
3. 基礎知識
?3.1 什么是nc文件?
??NetCDF(network Common Data Form)網絡通用數據格式是由美國大學大氣研究協會(University Corporation for Atmospheric Research,UCAR)的Unidata項目科學家針對科學數據的特點開發的,是一種面向數組型并適于網絡共享的數據的描述和編碼標準。目前,NetCDF廣泛應用于大氣科學、水文、海洋學、環境模擬、地球物理等諸多領域。用戶可以借助多種方式方便地管理和操作NetCDF 數據集 [1] 。
?3.2 基于Python處理nc文件需要用到的庫
??基于Python處理nc數據必要的庫是 netCDF4 ,同時如果需要將nc文件轉換為tiff文件,還需要osgeo庫中的gdal子庫和osr子庫。
4. 程序示例
??以Python將nc格式的標準化降水蒸散發指數(SPEI)文件轉換為tif格式的文件為例,說明nc轉tif的python實現過程,SPEI數據下載自西班牙國家研究委員會(CSIC)下屬的SPEI下載網站 [2] 。
'''
1. 目的:基于Python將.nc文件轉換為.tif文件
2. 山東青島 2019年6月20日
'''
# 0. 模塊導入
import
numpy
as
np
import
netCDF4
as
Dataset
from
osgeo
import
gdal
,
osr
# 1. 路徑處理和變量定義
RootDir
=
r
'F:\SPEI_NC'
SPEI_NC
=
RootDir
+
'\\spei12.nc'
# 輸入文件
# 1.1 輸出路徑-OutPath
OutPath
=
RootDir
+
'\\SPEI_TIF'
if
os
.
path
.
exists
(
OutPath
)
:
shutil
.
rmtree
(
OutPath
)
os
.
mkdir
(
OutPath
)
else
:
os
.
mkdir
(
OutPath
)
OutTif
=
OutPath
+
'\\Global_SPEI_Test.tif'
# 2. NetCDF文件處理
NC_DS
=
Dataset
(
SPEI_NC
)
print
(
NC_DS
,
type
(
NC_DS
)
)
# 了解NC_DS的數據類型,
print
(
NC_DS
.
variables
)
# 了解變量的基本信息
print
(
NC_DS
.
variables
[
'spei'
]
)
# 了解SPEI的基本信息
Lat
=
NC_DS
.
variables
[
'lat'
]
[
:
]
Lon
=
NC_DS
.
variables
[
'Lon'
]
[
:
]
SPEI
=
NC_DS
.
variables
[
'spei'
]
[
13
,
:
,
:
]
# 1901年1月的SPEI_12,注意SPEI的存儲形式決定了讀取方式
print
(
type
(
SPEI
)
,
SPEI
.
shape
)
# 了解SPEI的數據類型,和維數
# 2.1 異常值處理
SPEI
=
np
.
asarray
(
SPEI
)
# 數據類型轉換
SPEI
[
np
.
where
(
SPEI
==
1.e+30
)
]
=
-
99
# 3. 將數據寫出到.tif文件中
# 3.1 影像的左上角和右下角坐標
LonMin
,
LatMax
,
LonMax
,
LatMin
=
[
Lon
.
min
(
)
,
Lat
.
max
(
)
,
Lon
.
max
(
)
,
Lat
.
min
(
)
]
# 3.2 影像的分辨率,此處float(N_Lon)-1是為了保證分辨率為0.5 degree,不知是否合理,望指正
N_Lat
=
len
(
Lat
)
N_Lon
=
len
(
Lon
)
Lon_Res
=
(
LonMax
-
LonMin
)
/
(
float
(
N_Lon
)
-
1
)
Lat_Res
=
(
LatMax
-
LatMin
)
/
(
float
(
N_Lat
)
-
1
)
# 3.3 構建.tiff文件框架
spei_ds
=
gdal
.
GetDriverByName
(
'Gtiff'
)
.
Create
(
OutTif
,
N_Lon
,
N_Lat
,
1
,
gdal
.
GDT_Float32
)
# 3.4 設置影像的顯示范圍
geotransform
=
(
LonMin
,
Lon_Res
,
0
,
LatMin
,
0
,
Lat_Res
)
spei_ds
.
SetGeoTransform
(
geotransform
)
# 3.5 地理坐標系統信息
srs
=
osr
.
SpatialReference
(
)
#獲取地理坐標系統信息,用于選取需要的地理坐標系統
print
(
type
(
srs
)
)
print
(
srs
)
srs
.
ImportFromEPSG
(
4326
)
# 定義輸出的坐標系為"WGS 84",AUTHORITY["EPSG","4326"]
spei_ds
.
SetProjection
(
srs
.
ExportToWkt
(
)
)
# 給新建圖層賦予投影信息
# 3.6 數據寫出
spei_ds
.
GetRasterBand
(
1
)
.
WriteArray
(
SPEI
)
# 將數據寫入內存,此時沒有寫入硬盤
spei_ds
.
FlushCache
(
)
# 將數據寫入硬盤
spei_ds
=
None
# 關閉spei_ds指針,注意必須關閉
print
(
'Finished'
)
5. 問題
? 5.1 影像分辨率的設置
# 3.2 影像的分辨率,此處float(N_Lon)-1是為了保證分辨率為0.5 degree,不知是否合理,望指正
N_Lat
=
len
(
Lat
)
N_Lon
=
len
(
Lon
)
Lon_Res
=
(
LonMax
-
LonMin
)
/
(
float
(
N_Lon
)
-
1
)
Lat_Res
=
(
LatMax
-
LatMin
)
/
(
float
(
N_Lat
)
-
1
)
參考資料
[1] : netCDF百度百科
[2] : MATLAB中利用ncread函數讀取nc文件
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
