想了一下,先說一下讀寫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自帶的數據類型並沒有兼容。
之前發現了這個問題就放一邊了,沒時間想咋回事。要不是碰到今天這個問題數據,不知道還要擱置多久。。。