基于Python+GDAL實(shí)現(xiàn)nc格式轉(zhuǎn)geotiff格式
- 1. 目的
- 2. 版本
- 3. 基礎(chǔ)知識
- ?3.1 什么是nc文件?
- ?3.2 基于Python處理nc文件需要用到的庫
- 4. 程序示例
- 5. 問題
- ? 5.1 影像分辨率的設(shè)置
- 參考資料
1. 目的
(1)掌握基于Python處理nc格式文件的基本方法
(2)學(xué)會將程序函數(shù)化,提高程序可讀性【待補(bǔ)充】
2. 版本
(1)2019年6月20日; ? ?Version 1
3. 基礎(chǔ)知識
?3.1 什么是nc文件?
??NetCDF(network Common Data Form)網(wǎng)絡(luò)通用數(shù)據(jù)格式是由美國大學(xué)大氣研究協(xié)會(University Corporation for Atmospheric Research,UCAR)的Unidata項(xiàng)目科學(xué)家針對科學(xué)數(shù)據(jù)的特點(diǎn)開發(fā)的,是一種面向數(shù)組型并適于網(wǎng)絡(luò)共享的數(shù)據(jù)的描述和編碼標(biāo)準(zhǔn)。目前,NetCDF廣泛應(yīng)用于大氣科學(xué)、水文、海洋學(xué)、環(huán)境模擬、地球物理等諸多領(lǐng)域。用戶可以借助多種方式方便地管理和操作NetCDF 數(shù)據(jù)集 [1] 。
?3.2 基于Python處理nc文件需要用到的庫
??基于Python處理nc數(shù)據(jù)必要的庫是 netCDF4 ,同時如果需要將nc文件轉(zhuǎn)換為tiff文件,還需要osgeo庫中的gdal子庫和osr子庫。
4. 程序示例
??以Python將nc格式的標(biāo)準(zhǔn)化降水蒸散發(fā)指數(shù)(SPEI)文件轉(zhuǎn)換為tif格式的文件為例,說明nc轉(zhuǎn)tif的python實(shí)現(xiàn)過程,SPEI數(shù)據(jù)下載自西班牙國家研究委員會(CSIC)下屬的SPEI下載網(wǎng)站 [2] 。
'''
1. 目的:基于Python將.nc文件轉(zhuǎn)換為.tif文件
2. 山東青島 2019年6月20日
'''
# 0. 模塊導(dǎo)入
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的數(shù)據(jù)類型,
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的存儲形式?jīng)Q定了讀取方式
print
(
type
(
SPEI
)
,
SPEI
.
shape
)
# 了解SPEI的數(shù)據(jù)類型,和維數(shù)
# 2.1 異常值處理
SPEI
=
np
.
asarray
(
SPEI
)
# 數(shù)據(jù)類型轉(zhuǎn)換
SPEI
[
np
.
where
(
SPEI
==
1.e+30
)
]
=
-
99
# 3. 將數(shù)據(jù)寫出到.tif文件中
# 3.1 影像的左上角和右下角坐標(biāo)
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 構(gòu)建.tiff文件框架
spei_ds
=
gdal
.
GetDriverByName
(
'Gtiff'
)
.
Create
(
OutTif
,
N_Lon
,
N_Lat
,
1
,
gdal
.
GDT_Float32
)
# 3.4 設(shè)置影像的顯示范圍
geotransform
=
(
LonMin
,
Lon_Res
,
0
,
LatMin
,
0
,
Lat_Res
)
spei_ds
.
SetGeoTransform
(
geotransform
)
# 3.5 地理坐標(biāo)系統(tǒng)信息
srs
=
osr
.
SpatialReference
(
)
#獲取地理坐標(biāo)系統(tǒng)信息,用于選取需要的地理坐標(biāo)系統(tǒng)
print
(
type
(
srs
)
)
print
(
srs
)
srs
.
ImportFromEPSG
(
4326
)
# 定義輸出的坐標(biāo)系為"WGS 84",AUTHORITY["EPSG","4326"]
spei_ds
.
SetProjection
(
srs
.
ExportToWkt
(
)
)
# 給新建圖層賦予投影信息
# 3.6 數(shù)據(jù)寫出
spei_ds
.
GetRasterBand
(
1
)
.
WriteArray
(
SPEI
)
# 將數(shù)據(jù)寫入內(nèi)存,此時沒有寫入硬盤
spei_ds
.
FlushCache
(
)
# 將數(shù)據(jù)寫入硬盤
spei_ds
=
None
# 關(guān)閉spei_ds指針,注意必須關(guān)閉
print
(
'Finished'
)
5. 問題
? 5.1 影像分辨率的設(shè)置
# 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函數(shù)讀取nc文件
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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