[gdal-dev] Modify DST_SRS in Python RasterizeLayer

Even Rouault even.rouault at spatialys.com
Wed Dec 18 07:52:58 PST 2024


William,

Le 18/12/2024 à 13:05, Starms, William (MU-Student) via gdal-dev a écrit :
>
> Howdy! I’m trying to rasterize a shape that is in absolute pixel/line 
> coordinates, but it gets burned wrong if the destination dataset has 
> an srs due to coordinate conversion. There aren’t any docs for that 
> specific function 
> (https://gdal.org/en/stable/api/python/utilities.html#osgeo.gdal.RasterizeLayer) 
> so I dug into the C++/CLI options 
> (https://gdal.org/en/latest/api/gdal_alg.html#_CPPv432GDALCreateGenImgProjTransformer212GDALDatasetH12GDALDatasetHPPc) 
> but couldn’t get them working.
>
You can't directly pass transformer options that apply to 
GDALCreateGenImgProjTransformer() though GDALRasterizeLayer(). The 
former will use the later and compose transformer options with the logic 
at https://github.com/OSGeo/gdal/blob/master/alg/gdalrasterize.cpp#L1659

There were 2 issues in your code:

- you didn't attach the SRS to the vector layer

- the bounds of your raster minx,miny=(30,30)-maxx,maxy=(40,40) don't 
intersect the envelope of your geometry minx,miny=(3,5)-maxx,maxy=(24,29)

Fixed version below, with a modified geometry within the raster extent 
and with an option to use a geotransform or GCPs:

"""

from osgeo import gdal, ogr, osr

gdal.UseExceptions()

def make_ogr_feature(spatial_ref, shape):
     rast_ogr_ds = ogr.GetDriverByName('Memory').CreateDataSource('wrk')
     rast_mem_lyr = rast_ogr_ds.CreateLayer('poly', srs=spatial_ref)
     feat = ogr.Feature(rast_mem_lyr.GetLayerDefn())
     feat.SetGeometryDirectly(ogr.Geometry(wkt=shape))
     rast_mem_lyr.CreateFeature(feat)
     return rast_mem_lyr, rast_ogr_ds

driver = gdal.GetDriverByName('GTiff')
ds = driver.Create('set.tif', xsize=100, ysize=100, bands=3, 
eType=gdal.GDT_Byte)

srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)  # ask for 
longitude, latitude order

layer, layer_ds = make_ogr_feature(srs, 'Polygon ((32 33,38 33,38 38,32 
38,32 33))')

use_geotransform = False
if use_geotransform:
   ds.SetSpatialRef(srs)
   ds.SetGeoTransform([30,(40 - 30) / ds.RasterXSize,0,40,0, - (40 - 30) 
/ ds.RasterYSize])
else:
   ds.SetGCPs([gdal.GCP(30,40, 0, 0.5, 0.5, '', 'UpperLeft'),
               gdal.GCP(40,40, 0, 99.5, 0.5, '', 'UpperRight'),
               gdal.GCP(40,30,0,99.5,99.5,'','LowerRight'),
               gdal.GCP(30,30,0,0.5,99.5, '','LowerLeft')], srs)

gdal.RasterizeLayer(ds, [1,2,3], layer, burn_values=[255,255,255])

"""

Even

-- 
http://www.spatialys.com
My software is free, but my time generally not.
Butcher of all kinds of standards, open or closed formats. At the end, this is just about bytes.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20241218/832dd916/attachment.htm>


More information about the gdal-dev mailing list