首頁 > 後端開發 > Python教學 > python gdal教程之:地圖代數與柵格資料的寫入

python gdal教程之:地圖代數與柵格資料的寫入

黄舟
發布: 2016-12-24 17:08:10
原創
2471 人瀏覽過

以計算NDVI為例:

NDVI=(NIR-RED)/(NIR+RED)

其中NIR為波段3,RED為波段2

編程重點如下:

data3,將波段2讀入數組data2

2.       計算公式為:

3.          計算公式為:

3.      當data3與data2皆為0時(例如以0表示NODATA),且會出現被崩潰的錯誤,導致程序崩潰。需要用mask來配合choose將0值去掉

程式碼如下,只有4行

data2 = band2.ReadAsArray(0, 0, cols,rows).astype(Numeric.Float16)

data3As.3.Read , 0, cols,rows).astype(Numeric.Float16)

mask = Numeric.greater(data3 + data2, 0)

ndvi = Numeric.choose(mask, (-99, (data3 - data2) / (data3 + data2)))

新柵格資料集

將剛才計算得到的資料寫入新的柵格資料集之中

首先要複製一份資料驅動:

driver = inDataset.GetDriver()

之後新建資料集

Create(, , , [], [])

其中bands的預設值為1,GDALDataType的預設類型為GDT_Byte,例如

outDataset = driver.Create(filename, cols, rows, 1, GDT_Float32)

在這條語句的執行過程中,儲存空間已經被分配到硬碟上了

在寫入之前,還需要先引入寫入之前,還需要先引入波段物件

outBand = outDataset.GetRasterBand(1)

波段物件支援直接寫入矩陣,兩個參數分別為x向偏移和y向偏移

outBand.WriteArray(ndvi, 0, 0)

outBand.WriteArray(ndvi, 0, 0)

以下的例子總結了這次和上一次的逐塊寫入方法

   xBlockSize = 64

   yBlockSize = 64

   for i in range(0, rows,

           numRows = yBlockSize

      else:

    for j in range(0, cols, xBlockSize):

           if j + xBlockSize

numCols = xBlockSize🠟🠟🠟

numCols = cols – j

           data = band.ReadAsArray(j, i, numCols, numRows)

)ations haha​​tions.

           outBand.WriteArray(outData, j, i)

band物件可以設定NoData值

outBand.SetNoDataValue(-99)

還可以讀取NoData值

ND = outBand.GetNoDataValue()

計算band的統計量

之後用GetStatistics(, )計算統計量。如果approx_ok=1那麼計算是基於pyramid的,如果force=0那麼當整幅圖都要重讀一遍的時候就不計算統計量了。

outBand.FlushCache()

outBand.GetStatistics(0, 1)

設定新圖的地理參考點

如果新圖與另一張圖的地理參考資訊完全一致,那就很簡單了

如果新圖與另一張圖的地理參考資訊完全一致,那就很簡單了

geoTransform = inDataset.GetGeoTransform()

outDataset.SetGeoTransform(geoTransform )

proj = inDataset.GetProjection()

outDataset。

gdal.SetConfigOption ('HFA_USE_RRD', 'YES')

強制建立pyramids

outDataset.BuildOverviews(overviewlist=[2,4, 8,16,32,64,128])🠎🠎的每張圖片🠎 53513513513535353535353333533333333333333333塊卷🠎5🠎5🠎135355353533333353333333333333塊紙🠎🠎5🠎1353535353533333333333333333333塊紙🠎5🠎5🠎13535353533353333333333333333塊紙🠎5🠎讀取行數與列數,原點(minX,maxY),像素長,像素寬,計算座標範圍

      maxX1 = minX1 + (cols1 * pixelWidth)

. .       計算輸出影像的座標範圍:

minX = min(minX1, minX2, …) maxX = max(maxX1, maxX2, ...)

minY = min(minX1, maxX2, ...)

minY = min(minX1, min2, max(maxY …)

3.       計算輸出影像的行數與列數:

cols = int((maxX – minX) / pixelWidth)

rows = int(He(3)) / pixelWidth)

rows = int((Heamax)p.建立並初始化輸出影像

5.       對每張待拼接的圖:計算offset值

xOffset1 = int((minX1 - minX) / pixelWidth)

yOset1 = amax(3) -Heamax(aconn) amax;讀入資料並依照上述計算的offset寫入

6.       對輸出影像:計算統計量,設定geotransform :[minX, pixelWidth, 0, maxY, 0, pixelHeight],projection,建立pyramids

 以上就是python gdal教學之:地圖代數與柵格資料的寫入的內容,更多相關內容請關注PHP中文網(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板