[OSM-dev-fr] [OSM-talk-fr] Ombrage et relief...

yvecai yvecai at gmail.com
Jeu 23 Jan 19:33:06 UTC 2014


Update

OK, j'ai finalement réussi à convertir un hillshade global depuis 1 
bande en niveau de gris vers une bande toute noire et le hillshade dans 
une bande alpha.
Sauf que, au bout de plus de 10 jours, Gdaldem y serait encore, et si 
j'en crois sa barre de progression, pour quelques mois.
Par contre, avec le code ci-dessous, en 2 heures c'est plié sur un Tiff 
de 100Go, donc je le passe ici si ça vous donne des idées.

Je note aussi qu'avec Mapnik les performances sont bien meilleures quand 
on se passe du compositing et avec un tiff "TILED=YES".

Alors si ça peut servir :

    #!/usr/bin/python
    # read a file block by block, and write band 1 into band 2, fill
    band 1 with 0s.

    import gdal
    import numpy
    import sys

    from gdalconst import *

    ds = gdal.Open( 'DEM/3857-tiled.tif', GA_ReadOnly)

    band = ds.GetRasterBand(1)

    # Process by blocks, unless the dataset can fit into memory
    # Use blocks anyway, they are easy to read, and tiff is compressed
    block by block

    block_sizes = band.GetBlockSize()
    x_block_size = block_sizes[0]
    y_block_size = block_sizes[1]

    xsize = band.XSize
    ysize = band.YSize

    raster = gdal.GetDriverByName('GTiff')
    dst_ds = raster.Create('DEM/out.tif', xsize, ysize, 2, gdal.GDT_Byte,
                 options=[ 'TILED=YES', 'COMPRESS=DEFLATE',
    "BIGTIFF=YES", "ALPHA=YES" ])
    projection   = ds.GetProjection()
    #~ print 'proj: ', projection
    geotransform = ds.GetGeoTransform()
    #~ print 'geo: ', geotransform

    dst_ds.SetGeoTransform( geotransform )
    dst_ds.SetProjection(projection)
    #~ dst_ds.GetRasterBand(1).Fill(0)

    for i in range(0, ysize, y_block_size):
         sys.stdout.write(str((ysize,i,100*(1-(ysize-i)/ysize),"%
    left"))+'\n')
         sys.stdout.flush()
         if i + y_block_size < ysize:
             rows = y_block_size
         else:
             rows = ysize - i
         for j in range(0, xsize, x_block_size):
             if j + x_block_size < xsize:
                 cols = x_block_size
             else:
                 cols = xsize -j

             data=ds.GetRasterBand(1).ReadAsArray(j, i, cols, rows)
             inv=numpy.ones(data.shape, numpy.uint8) * 255
             data=inv-data
             dst_ds.GetRasterBand(2).WriteArray(data,j,i)
             z=numpy.zeros(data.shape, numpy.uint8)
             dst_ds.GetRasterBand(1).WriteArray(z,j,i)

    # Once we're done, close properly the dataset
    dst_ds = None
    ds = None

Yves
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://lists.openstreetmap.org/pipermail/dev-fr/attachments/20140123/be283fed/attachment.html>


Plus d'informations sur la liste de diffusion dev-fr