From c3eae0347cb511c8c36e4e13d9c91dfa97f643c7 Mon Sep 17 00:00:00 2001 From: kalbl Date: Tue, 25 Oct 2016 23:32:08 +0200 Subject: [PATCH] Add default geo transform for global maps if it is not specified. --- modules/globebrowsing/tile/tiledataset.cpp | 32 +++++++++++++++------- modules/globebrowsing/tile/tiledataset.h | 11 +++++++- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/modules/globebrowsing/tile/tiledataset.cpp b/modules/globebrowsing/tile/tiledataset.cpp index 2bd8b5660e..d69042857f 100644 --- a/modules/globebrowsing/tile/tiledataset.cpp +++ b/modules/globebrowsing/tile/tiledataset.cpp @@ -438,8 +438,24 @@ namespace globebrowsing { } - - + std::array TileDataset::getGeoTransform() const { + std::array padfTransform; + CPLErr err = _dataset->GetGeoTransform(&padfTransform[0]); + if (err == CE_Failure) { + GeodeticPatch globalCoverage(Geodetic2(0,0), Geodetic2(M_PI / 2, M_PI)); + padfTransform[1] = Angle::fromRadians( + globalCoverage.size().lon).asDegrees() / _dataset->GetRasterXSize(); + padfTransform[5] = -Angle::fromRadians( + globalCoverage.size().lat).asDegrees() / _dataset->GetRasterYSize(); + padfTransform[0] = Angle::fromRadians( + globalCoverage.getCorner(Quad::NORTH_WEST).lon).asDegrees(); + padfTransform[3] = Angle::fromRadians( + globalCoverage.getCorner(Quad::NORTH_WEST).lat).asDegrees(); + padfTransform[2] = 0; + padfTransform[4] = 0; + } + return padfTransform; + } ////////////////////////////////////////////////////////////////////////////////// // ReadTileData helper functions // @@ -447,11 +463,8 @@ namespace globebrowsing { PixelCoordinate TileDataset::geodeticToPixel(const Geodetic2& geo) const { - double padfTransform[6]; - CPLErr err = _dataset->GetGeoTransform(padfTransform); - - ghoul_assert(err != CE_Failure, "Failed to get transform"); - + std::array padfTransform = getGeoTransform(); + Scalar Y = Angle::fromRadians(geo.lat).asDegrees(); Scalar X = Angle::fromRadians(geo.lon).asDegrees(); @@ -484,10 +497,9 @@ namespace globebrowsing { } Geodetic2 TileDataset::pixelToGeodetic(const PixelCoordinate& p) const { - double padfTransform[6]; - CPLErr err = _dataset->GetGeoTransform(padfTransform); - ghoul_assert(err != CE_Failure, "Failed to get transform"); + std::array padfTransform = getGeoTransform(); Geodetic2 geodetic; + // Should be using radians and not degrees? geodetic.lon = padfTransform[0] + p.x * padfTransform[1] + p.y * padfTransform[2]; geodetic.lat = padfTransform[3] + p.x * padfTransform[4] + p.y * padfTransform[5]; return geodetic; diff --git a/modules/globebrowsing/tile/tiledataset.h b/modules/globebrowsing/tile/tiledataset.h index 61bd368880..7bf49b45ad 100644 --- a/modules/globebrowsing/tile/tiledataset.h +++ b/modules/globebrowsing/tile/tiledataset.h @@ -147,6 +147,15 @@ namespace globebrowsing { // ReadTileData helper functions // ////////////////////////////////////////////////////////////////////////////////// + /** + Returns the geo transform from raster space to projection coordinates as defined + by GDAL. + + If the transform is not available, the function returns a transform to map + the pixel coordinates to cover the whole geodetic lat long space. + */ + std::array getGeoTransform() const; + PixelCoordinate geodeticToPixel(const Geodetic2& geo) const; Geodetic2 pixelToGeodetic(const PixelCoordinate& p) const; IODescription getIODescription(const TileIndex& tileIndex) const; @@ -189,4 +198,4 @@ namespace globebrowsing { } // namespace globebrowsing } // namespace openspace -#endif // __TILE_DATASET_H__ \ No newline at end of file +#endif // __TILE_DATASET_H__