Search code examples
pythongeolocationgdalgeotiff

gdal python background not really transparent


When I merge my geotiffs using buildVRT and translate from gdal the transparity is showed as transparity blocks instead of the content of layer behind it.

see image:

example

used code for merging geotiff:

demList = glob.glob(os.path.dirname(os.path.abspath(__file__)) + "//..//icons//*.tif")
print(demList)

VRToptions = gdal.BuildVRTOptions(srcNodata="255 255 255")
vrt = gdal.BuildVRT(os.path.dirname(os.path.abspath(__file__)) + "//merged.vrt", demList, options=VRToptions)
translateOptions = gdal.TranslateOptions(creationOptions=["TILED=YES"])
gdal.Translate(os.path.dirname(os.path.abspath(__file__)) + "//mergedDEM.tif", vrt, options=translateOptions)
vrt = None

my question is how i can use the previous layer as background instead of the transparity blocks.

Compleet code with problem: https://github.com/NickSmeding/MergeGeotiff


Solution

  • What about this (using rasterio and it's extension rioxarray) and using both your tifs :

    import rioxarray
    import rioxarray.merge
    
    icon = "./tiffs/horse2.tif"
    background = "./tiffs/4c5ae720f274505972ecedf4066bb32dfb28b63e5785030a7eb55b4e9978602c.tif"
    
    # open the rasters
    with rioxarray.open_rasterio('./tiffs/horse2.tif') as rds1:
        with rioxarray.open_rasterio(background) as rds2:
    
            # ensure the rasters have the same projection/transform/shape
            rds3 = rds1.rio.reproject_match(rds2)
            ar = rds3.values
            
            #look for pixels in icon having alpha = 255
            ix = (ar[3] == 255)
            
            #update background pixels with icon
            for k in range(4):
                rds2.values[k][ix]=ar[k][ix]
            
            #save updated raster
            rds2.rio.to_raster("test.tif")
    

    The icon is a bit pixelised, but it's only because the resolution of you background is less than the one in your icon/tif. Maybe you could reproject both the arrays to the maximum resolution of both layers, but IMHO that would be another subject.

    enter image description here

    (Note that you icon TIF is ok ; I tried to open it in QGIS and you can superpose the layers alright. I also tried to edit it to re-declare a nodata value, but I still got the same result as you. Maybe if your background and icon tif shared the same nodata value there could be a way to compute it without accessing the pixels as I did,...)