Skip to content

Commit

Permalink
KMLSuperOverlay: report color table of single overlay datasets, and a…
Browse files Browse the repository at this point in the history
…lso handle some variation in the KML structure (fixes https://issues.qgis.org/issues/20173)
  • Loading branch information
rouault committed Feb 6, 2019
1 parent 10d43e1 commit ec4bd32
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 1 deletion.
21 changes: 21 additions & 0 deletions autotest/gdrivers/data/small_world_in_document_folder_pct.kml
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<Folder>
<GroundOverlay>
<name>small_world</name>
<color>ffffffff</color>
<Icon>
<href>small_world_pct.tif</href>
<viewBoundScale>1</viewBoundScale>
</Icon>
<LatLonBox>
<north>90</north>
<south>-90</south>
<east>180</east>
<west>-180</west>
</LatLonBox>
</GroundOverlay>
</Folder>
</Document>
</kml>
16 changes: 16 additions & 0 deletions autotest/gdrivers/kmlsuperoverlay.py
Expand Up @@ -284,6 +284,22 @@ def test_kmlsuperoverlay_7():
assert cs == 30111
assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand

###############################################################################
# Test raster KML with single Overlay (such as https://issues.qgis.org/issues/20173)


def test_kmlsuperoverlay_single_overlay_document_folder_pct():

ds = gdal.Open('data/small_world_in_document_folder_pct.kml')
assert ds.GetProjectionRef().find('WGS_1984') >= 0
got_gt = ds.GetGeoTransform()
ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9]
for i in range(6):
assert abs(got_gt[i] - ref_gt[i]) <= 1e-6

assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_PaletteIndex
assert ds.GetRasterBand(1).GetColorTable()

###############################################################################
# Test that a raster with lots of blank space doesn't have unnecessary child
# KML/PNG files in transparent areas
Expand Down
46 changes: 45 additions & 1 deletion gdal/frmts/kmlsuperoverlay/kmlsuperoverlaydataset.cpp
Expand Up @@ -2450,7 +2450,47 @@ GDALDataset* KmlSingleOverlayRasterDataset::Open(const char* pszFilename,
{
CPLXMLNode* psGO = CPLGetXMLNode(psRoot, "=kml.GroundOverlay");
if( psGO == nullptr )
return nullptr;
{
// Otherwise look for kml.Document.Folder.GroundOverlay if there's
// a single occurence of Folder and GroundOverlay
auto psDoc = CPLGetXMLNode(psRoot, "=kml.Document");
if( psDoc == nullptr )
{
return nullptr;
}
CPLXMLNode* psFolder = nullptr;
for( auto psIter = psDoc->psChild; psIter; psIter = psIter->psNext )
{
if( psIter->eType == CXT_Element &&
strcmp(psIter->pszValue, "Folder") == 0 )
{
if( psFolder == nullptr )
psFolder = psIter;
else
return nullptr;
}
}
if( psFolder == nullptr )
{
return nullptr;
}
for( auto psIter = psFolder->psChild; psIter; psIter = psIter->psNext )
{
if( psIter->eType == CXT_Element &&
strcmp(psIter->pszValue, "GroundOverlay") == 0 )
{
if( psGO == nullptr )
psGO = psIter;
else
return nullptr;
}
}
if( psGO == nullptr )
{
return nullptr;
}
}

const char* pszHref = CPLGetXMLValue(psGO, "Icon.href", nullptr);
if( pszHref == nullptr )
return nullptr;
Expand Down Expand Up @@ -2483,6 +2523,10 @@ GDALDataset* KmlSingleOverlayRasterDataset::Open(const char* pszFilename,

poDS->GetRasterBand(i)->SetColorInterpretation(
poImageDS->GetRasterBand(i)->GetColorInterpretation() );

auto poCT = poImageDS->GetRasterBand(i)->GetColorTable();
if( poCT )
poDS->GetRasterBand(i)->SetColorTable(poCT);
}
poImageDS->Dereference();
double adfGeoTransform[6] = {
Expand Down

0 comments on commit ec4bd32

Please sign in to comment.