?
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間資料轉換庫,它利用抽象資料模型來表達所支持的各種檔案格式,它還有一系列命令列工具來進行資料轉換和處理,
Python的GDAL庫作為柵格資料的處理轉換庫,其支持幾百種柵格資料格式,如常見的TIFF、ENVI、HFA、HDF4等,因為遙感影像大部分都是柵格資料,所以GDAL庫非常適合處理遙感影像、如光譜指數計算、波段合成、批量下載、柵格轉面等,
本次介紹如何通過遙感影像的仿射地理變換引數將像素坐標轉為地理/投影坐標,在ENVI或者ArcGIS中都是自動轉換,所以你在點擊影像的某一像元時,它就會顯示對應的地理/投影坐標,但如果你想用Python去實作,就需要使用影像的放射地理引數,
一、獲取仿射地理變換引數
之前發布【Python&RS】GDAL計算遙感影像光譜指數(如NDVI、NDWI、EVI等)時就已經用過這部分代碼,沒啥好說的,就是獲取影像的基本引數,代碼中除了仿射地理變換引數其他沒啥用,但我習慣全部輸出,
def Get_data(filepath):
"""
:param filepath: 輸入影像的路徑
:return: 回傳仿射地理變換引數
"""
ds = gdal.Open(filepath) # 打開資料集dataset
ds_width = ds.RasterXSize # 獲取資料寬度
ds_height = ds.RasterYSize # 獲取資料高度
ds_bands = ds.RasterCount # 獲取波段數
ds_geo = ds.GetGeoTransform() # 獲取仿射地理變換引數
ds_prj = ds.GetProjection() # 獲取投影資訊
print("影像的寬度為:" + str(ds_width))
print("影像的高度為:" + str(ds_height))
print("仿射地理變換引數為:" + str(ds_geo))
print("投影坐標系為:" + str(ds_prj))
return ds_geo
# data = https://www.cnblogs.com/RSran/p/ds.ReadAsArray(0, 0, ds_width, ds_height) # 以陣列的形式讀取整個資料集
二、像素坐標轉地理/投影坐標
這里先介紹一下仿射地理變換引數(3497294, 0.1, 0.0, 3438148, 0.0, -0.1),這樣大家可以更直觀的明白代碼的意思,
0:影像左上角的X坐標
1:影像東西方向解析度
2:旋轉角度,如果影像北方朝上,該值為0
3:影像左上角的Y坐標
4:旋轉角度,如果影像北方朝上,該值為0
5:影像南北方向解析度
def Pixel_Coordinate(x, y, ds_geo):
"""
:param x: 輸入x像素坐標
:param y: 輸入y像素坐標
:param ds_geo: 輸入仿射地理變換引數
:return: 回傳x,y的地理/投影坐標
"""
x_geo = ds_geo[0]+ds_geo[1]*x + y*ds_geo[2]
y_geo = ds_geo[3]+ds_geo[4]*x + y*ds_geo[5]
print(x_geo, y_geo)
return x_geo, y_geo
從代碼中我們可以看到使用仿射地理變換引數將像素坐標轉成地理坐標時,就是將左上角的x,y值加上x,y的像素坐標乘以解析度(即實際距離),然后再加上偏轉就行了,這和我之前寫的通過圖片中心點地理坐標推算整張圖片所有像素點地理坐標的原理是一樣的,只不過這里的仿射地理變換引數是影像自帶的,而之前寫的【Python&GIS】根據像素坐標計算圖片某點的地理/投影坐標中的偏轉角度是自己算出來的,
三、地理/投影坐標轉像素坐標
def Coordinate_Pixel(x_geo, y_geo, ds_geo):
"""
:param x_geo: 輸入x地理坐標
:param y_geo: 輸入y地理坐標
:param ds_geo: 輸入仿射地理變換引數
:return: 回傳x,y像素坐標
"""
y = ((y_geo - ds_geo[3] - ds_geo[4] / ds_geo[1] * x_geo + ds_geo[4] / ds_geo[1] * ds_geo[
0]) / (ds_geo[5] - ds_geo[4] / ds_geo[1] * ds_geo[2]))
x = ((x_geo - ds_geo[0] - y * ds_geo[2]) / ds_geo[1])
return int(x), int(y)
?本文章主要是分享個人在學習Python程序中寫過的一些代碼,有些部分借鑒了前人以及官網的教程,如有侵權請聯系作者洗掉,大家有問題可以隨時留言交流,博主會及時回復,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554530.html
標籤:Python
下一篇:返回列表
