利用GDAL根據柵格影像DN值實現顏色渲染

利用GDAL根據柵格影像DN值實現顏色渲染

項目需求

項目中需要使用影像做差值計算後根據其DN值進行密度分割渲染

項目構想

  • 1、主要根據CreateColorRamp()添加條帶
  • 2、根據SetRasterColorTable()渲染
    需要注意的是渲染值必須是int型或者byte,所以如果你的DN值是小數等,建議對數據進行拉伸處理,再進行渲染。

代碼實現

  • ReadTheRaster.py
    def writeRasterInformation(self, data, Savepath, nband):
        # driver = self.dataset.GetDriver()
        driver = gdal.GetDriverByName('GTiff')  # 自己指定生成類型
        writeable = driver.Create(Savepath, self.cols, self.rows, self.bands, gdal.GDT_Byte)  # TODO  新建數據集
        writeable.SetGeoTransform(self.geotrans)  # 寫入仿射變換參數
        writeable.SetProjection(self.proj)  # 寫入投影
        for i in range(nband):
            writeable.GetRasterBand(i + 1).WriteArray(data[i], 0, 0)
            writeable.GetRasterBand(i + 1).SetNoDataValue(0)  # todo 給各波段設置nodata值
            writeable.GetRasterBand(i + 1).FlushCache()  # todo 波段統計量

            #  獲取拉伸後數據最大值最小值  進行等分5分
            mindata = writeable.GetRasterBand(i + 1).GetStatistics(0, 1)[0]
            maxdata = writeable.GetRasterBand(i + 1).GetStatistics(0, 1)[1]
            ###渲染部分代碼
            itemdata = int((maxdata - mindata) / 5)  # 等分五份取整
            colortabledata = [(0, 255, 255), (72, 255, 72), (255, 255, 72), (255, 190, 72), (255, 72, 72), (255, 29, 29)]
            ct = gdal.ColorTable()
            for j in range(4):
                ct.CreateColorRamp(int(mindata + j * itemdata), colortabledata[j], int(mindata + (j + 1) * itemdata),
                                   colortabledata[j])
                band = writeable.GetRasterBand(i + 1)
                band.SetRasterColorTable(ct)
            ct.CreateColorRamp(int(mindata + 4 * itemdata), colortabledata[4], int(maxdata), colortabledata[5])
            band = writeable.GetRasterBand(i + 1)
            band.SetRasterColorTable(ct)
            ###渲染代碼
            returnData=[mindata,maxdata,colortabledata]
            print(writeable.GetRasterBand(i + 1).GetStatistics(0, 1))  # todo 計算波段統計量  輸出爲min\max \Mean\stddev
        return returnData
  • 調用

#TODO  RASTERFUNCTION
def computoffset(ds,db): # TODO 計算偏移量從而得出行列號
    data1=ds.computedoffset()
    data2=db.computedoffset()
    xoffset = int((data1[0] - data2[0]) / data1[1])
    yoffset = int((data1[3] - data2[3]) / data1[5])
    data = [xoffset, yoffset]
    return data
def getcludedata(n,ds,db):   # TODO 重新切片切成大小相同的
    # data = db.getRasterInformation(n)[38:25697, 97:10678]  #TODO 調整爲多少行多少列  先化爲相同行相同列 即二維數組切片
    data = db.getRasterInformation(n)[computoffset(ds,db)[1]:ds.computeRows()+computoffset(ds,db)[1], computoffset(ds,db)[0]:db.computeCols()]  # TODO 調整爲多少行多少列  先化爲相同行相同列 即二維數組切片
    return data
def getcludedata2(n,ds,db):
    data = ds.getRasterInformation(n)[0:ds.computeRows(),0:db.computeCols()-computoffset(ds,db)[0]]
    return data
def getIntersection(n,ds,db,strainRate):
    data1=getcludedata2(n,ds,db)
    data2=getcludedata(n,ds,db)
    data2[data1==0]=0 # todo 將data1中爲0位置的元素對應把data2中的元素也置爲0
    data1[data2==0]=0 # todo 將data2中爲0位置的元素對應把data1中的元素也置爲0
    result=abs(data2-data1)
    return  strainRate*result   ###線性拉伸
    
ds = ReadTheRaster.ReadRaster(TheFirstfilepath) #TODO 文件路徑
db = ReadTheRaster.ReadRaster(TheSecondefilepath)
status = ds.writeRasterInformation([getIntersection(1, ds, db,20)],outputfilepath, 1) 

效果展示

在這裏插入圖片描述

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