[gdal-dev] Rotating a GeoTransform from a KML Superoverlay

Chris Moulton cmoultonatx at gmail.com
Thu Feb 27 13:28:48 PST 2020


Hello GDAL Dev community!

First time question asker here, and it doesn't seem like this specific task
has been asked about before.

Problem: I have a bunch of KML superoverlays which I am tasked with
converting them all to geotiff. I am running into an issue with the
rotation values not being 0.0, which results in improperly georeferenced
rasters. I've attempted a few different solutions, which I'll outline below.

Here is a sample KML bounding box (exact coords omitted for anonymity):

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="
http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns:atom="http://www.w3.org/2005/Atom">
<GroundOverlay>
     <name>KML Name</name>
     <Icon>
          <href>image_path.jpg</href>
          <viewBoundScale>0.75</viewBoundScale>
     </Icon>
     <LatLonBox>
          <north>40.5</north>
          <south>40.4</south>
          <east>-105.2</east>
          <west>-105.1</west>
          <rotation>58.0</rotation>
     </LatLonBox>
</GroundOverlay>

The code snippet below is my current iteration, the only inputs are
IN_KML_PATH, OUT_TIFF_NAME, and then the ROTATION value in degrees read
directly from the KML LatLonBox.

Here it is:

'''
#Dependencies
import gdal
from affine import Affine

#Driver for writing geotiff
tiff_driver = gdal.GetDriverByName('GTiff')

#Setting up data source, getting GeoTransform and other relevant info
in_ds = gdal.OpenEx(IN_KML_PATH)
in_geotransform = in_ds.GetGeoTransform()
in_projection = in_ds.GetProjection()
primary_band = in_ds.GetRasterBand(1)

#Creating an affine geotransform and rotating it 58.0 degrees anticlockwise
(KML specs)
#This is obviously where I'm going wrong, but don't quite know what I'm
missing!
af_geotransform = Affine.from_gdal(*in_geotransform)
af_geotransform *= Affine.rotation(-58.0)

#Creating out tiff
out_ds = tiff_driver.Create(OUT_TIFF_NAME,
     primary_band.XSize,
     primary_band.YSize,
     in_ds.RasterCount,
     primary_band.DataType)

#Setting projection and new geotransform
out_ds.SetProjection(in_projection)
out_ds.SetGeoTransform(af_geotransform.to_gdal())


#Writing in bands to the output image
for i in range(1, in_ds.RasterCount + 1):
     in_band = in_ds.GetRasterBand(i)
     in_data = in_band.ReadAsArray()
     out_band = out_ds.GetRasterBand(i)
     out_band.WriteArray(in_data)

#Fin
out_ds.FlushCache()
del out_ds
'''

I've tried a few different methods for rotating the in_geotransform,
including:directly changing the 'rotation' values from default 0.0 to the
rotation value in the KML. This does not result in anything resembling what
I need. I assume I'm missing a translation step in the affine
transformation, but haven't gotten too far there.

I know this was a lengthy question, I tried to be as detailed as possible
about what I've attempted so far. I don't think there is anything going
wrong per say, just reaching out to the community to see if I could get any
direction here!


Cheers,

Chris Moulton
cmoultonatx at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20200227/5b73e76f/attachment.html>


More information about the gdal-dev mailing list