4

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

N. Smeding
  • 364
  • 2
  • 14

1 Answers1

2

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,...)

tgrandje
  • 2,332
  • 11
  • 33
  • thx man, I think this is the best possible optie if you have only access to the geotiff. – N. Smeding Dec 15 '20 at 09:51
  • 1
    You're welcome. I just realise I've forgotten to explain why the "ar[3]" accessor : this is about rasterio / gdal which is converting the tuples of the image's pixels to independant layers/bands. So when you access an Image's data (with PIL for example) you will call ar[:,:,3] to get the alpha channel though with rasterio it will be ar[3] – tgrandje Dec 15 '20 at 09:58