python 使用gdal生成tif數值不對的問題,另附python使用gdal讀寫tif文件

想了一下,先說一下讀寫tif這兩個基本操作吧

1、讀取tif爲矩陣

#獲取文件句柄

handle = gdal.Open(‘123.tif’)

#獲取文件的列數、行數和波段數

col = handle.RasterXsize

row = handle.RasterYsize

#獲取放射信息和投影信息

geotrans = handle.GetGeoTransform()

geoinfo = handle.GetProjectionRef()

#獲取數據,其中xoff,yoff是想要讀取的部分原點相對於源數據遠點的位置(xoff是列偏移量,yoff是行偏移量,一般設置成0,0)col,rowsize是要讀取數據的列數和行數

dataset = handle.ReadAsArray(xoff,yoff,xsize,rowsize) #一般使用dataset = handle.ReadAsArray(0,0,col,row)

#上面獲得的是三維矩陣,也可以先獲得某個波段(波段號從1開始),這裏面

bandset = handle.GetRasterBand(bandindex)

dataset = bandset.ReadAsArray(xoff,yoff,xsize,rowsize)

2、矩陣寫入tif

#註冊一個driver

driver = gdal.GetDriverByName('GTiff')

#創建數據集,參數爲文件名,列數,行數,波段數,數據類型

dataset = driver.Create(filename,width,height,band,datatype)

#設置放射矩陣,leftlon,leftlat 分別是左上角的經度緯度,lonres,latres分別是經度緯度的分辨率,剩下兩個0的參數是圖像的旋轉角度,對於北方朝上的圖像來說,這兩個值一般是0

dataset.SetGeoTransform(leftlon,lonres,0,leftlat,0,latres)

#設置投影信息,參數是OpenGis的 WKT字符串格式

dataset.SetProjection(WKT)

#寫數據,bandindex是波段序號,一般從1開始,data是矩陣數據

dataset.GetRasterBand(bandindex).WriteArray(data)

3、寫成tif時出現的數值錯誤的問題

之前我部門頭兒寫了個python使用gdal庫讀寫的tif的類,給我使用,發現了他把所有數據轉換成了int型,然後寫入,當時還想着說估計是疏忽了,所以給他加了一條判斷,代碼如下

跑完程序結果如下

分隔欄上面的是源數據,下面的事寫入dataset之後的樣子,沒錯,兩邊都是float怎麼會這樣呢,按理說是不存在類型轉換之間的問題。我還查看了一下

分隔欄上面是源數據類型,底下是寫入數據的類型,我查看了一下f4這個類型的name就是float32。沒道理,所以就嘗試着將轉換的矩陣轉換成了numpy類型,像這樣。

得到的結果,就對了,看來平時的float和numpy的float是不一樣的,至少,在gdal的內部轉化中是不一樣的,也可能是gdal的這個ReadAsArray對python自帶的數據類型並沒有兼容。

之前發現了這個問題就放一邊了,沒時間想咋回事。要不是碰到今天這個問題數據,不知道還要擱置多久。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章