From 2923b4a698bd791137486efc914cbc8c96632c1e Mon Sep 17 00:00:00 2001 From: Erik Broberg Date: Thu, 7 Jul 2016 12:58:03 -0400 Subject: [PATCH] Clean up initialization of TileDataset --- modules/globebrowsing/tile/tiledataset.cpp | 65 ++++++++++++++++++---- modules/globebrowsing/tile/tiledataset.h | 22 ++++++-- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/modules/globebrowsing/tile/tiledataset.cpp b/modules/globebrowsing/tile/tiledataset.cpp index 63438489ae..d103c713cb 100644 --- a/modules/globebrowsing/tile/tiledataset.cpp +++ b/modules/globebrowsing/tile/tiledataset.cpp @@ -117,27 +117,64 @@ namespace openspace { bool doPreprocessing, GLuint dataType) : _doPreprocessing(doPreprocessing) , _maxLevel(-1) + , hasBeenInitialized(false) { - // 1. First make sure GDAL has been initialized + _initData = { gdalDatasetDesc, minimumPixelSize, dataType }; + ensureInitialized(); + } + + void TileDataset::ensureInitialized() { + if (!hasBeenInitialized) { + initialize(); + hasBeenInitialized = true; + } + } + + void TileDataset::initialize() { + gdalEnsureInitialized(); + _dataset = gdalDataset(_initData.gdalDatasetDesc); + + //Do any other initialization needed for the TileDataset + _dataLayout = TileDataLayout(_dataset, _initData.dataType); + _depthTransform = calculateTileDepthTransform(); + _tileLevelDifference = calculateTileLevelDifference(_initData.minimumPixelSize); + + LDEBUG(_initData.gdalDatasetDesc << " - " << _tileLevelDifference); + } + + void TileDataset::gdalEnsureInitialized() { if (!GdalHasBeenInitialized) { GDALAllRegister(); CPLSetConfigOption("GDAL_DATA", absPath("${MODULE_GLOBEBROWSING}/gdal_data").c_str()); GdalHasBeenInitialized = true; } + } - //2. Secondly, open the GDAL dataset. Other methods depends on this - _dataset = (GDALDataset *)GDALOpen(gdalDatasetDesc.c_str(), GA_ReadOnly); - if (!_dataset) { + GDALDataset* TileDataset::gdalDataset(const std::string& gdalDatasetDesc) { + GDALDataset* dataset = (GDALDataset *)GDALOpen(gdalDatasetDesc.c_str(), GA_ReadOnly); + if (!dataset) { throw ghoul::RuntimeError("Failed to load dataset:\n" + gdalDatasetDesc); } - //3. Do any other initialization needed for the TileDataset - _dataLayout = TileDataLayout(_dataset, dataType); - _depthTransform = calculateTileDepthTransform(); - _tileLevelDifference = calculateTileLevelDifference(minimumPixelSize); - _description = gdalDatasetDesc; + const std::string originalDriverName = dataset->GetDriverName(); + + if (originalDriverName != "WMS") { + LDEBUG(" " << originalDriverName); + LDEBUG(" " << dataset->GetGCPProjection()); + LDEBUG(" " << dataset->GetProjectionRef()); - LDEBUG(gdalDatasetDesc << " - " << _tileLevelDifference); + GDALDriver* driver = dataset->GetDriver(); + char** metadata = driver->GetMetadata(); + for (int i = 0; metadata[i] != nullptr; i++) { + LDEBUG(" " << metadata[i]); + } + + const char* in_memory = ""; + //GDALDataset* vrtDataset = driver->CreateCopy(in_memory, dataset, false, nullptr, nullptr, nullptr); + } + + + return dataset; } @@ -153,6 +190,7 @@ namespace openspace { ////////////////////////////////////////////////////////////////////////////////// std::shared_ptr TileDataset::readTileData(ChunkIndex chunkIndex) { + ensureInitialized(); IODescription io = getIODescription(chunkIndex); CPLErr worstError = CPLErr::CE_None; @@ -173,6 +211,7 @@ namespace openspace { } int TileDataset::maxChunkLevel() { + ensureInitialized(); if (_maxLevel < 0) { int numOverviews = _dataset->GetRasterBand(1)->GetOverviewCount(); _maxLevel = -_tileLevelDifference; @@ -183,11 +222,13 @@ namespace openspace { return _maxLevel; } - TileDepthTransform TileDataset::getDepthTransform() const { + TileDepthTransform TileDataset::getDepthTransform() { + ensureInitialized(); return _depthTransform; } - const TileDataLayout& TileDataset::getDataLayout() const { + const TileDataLayout& TileDataset::getDataLayout() { + ensureInitialized(); return _dataLayout; } diff --git a/modules/globebrowsing/tile/tiledataset.h b/modules/globebrowsing/tile/tiledataset.h index 1106b01140..59fa31a907 100644 --- a/modules/globebrowsing/tile/tiledataset.h +++ b/modules/globebrowsing/tile/tiledataset.h @@ -101,8 +101,8 @@ namespace openspace { ////////////////////////////////////////////////////////////////////////////////// std::shared_ptr readTileData(ChunkIndex chunkIndex); int maxChunkLevel(); - TileDepthTransform getDepthTransform() const; - const TileDataLayout& getDataLayout() const; + TileDepthTransform getDepthTransform() ; + const TileDataLayout& getDataLayout() ; const static glm::ivec2 tilePixelStartOffset; @@ -114,8 +114,10 @@ namespace openspace { ////////////////////////////////////////////////////////////////////////////////// // Initialization // - ////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////\ + void initialize(); + void ensureInitialized(); TileDepthTransform calculateTileDepthTransform(); int calculateTileLevelDifference(int minimumPixelSize); @@ -123,7 +125,8 @@ namespace openspace { ////////////////////////////////////////////////////////////////////////////////// // GDAL helper methods // ////////////////////////////////////////////////////////////////////////////////// - + void gdalEnsureInitialized(); + GDALDataset* gdalDataset(const std::string& gdalDatasetDesc); bool gdalHasOverviews() const; int gdalOverview(const PixelRange& baseRegionSize) const; int gdalOverview(const ChunkIndex& chunkIndex) const; @@ -152,11 +155,18 @@ namespace openspace { // Member variables // ////////////////////////////////////////////////////////////////////////////////// + // init data + struct InitData { + std::string gdalDatasetDesc; + int minimumPixelSize; + GLuint dataType; + } _initData; + + int _maxLevel; double _tileLevelDifference; - std::string _description; TileDepthTransform _depthTransform; GDALDataset* _dataset; @@ -165,7 +175,7 @@ namespace openspace { bool _doPreprocessing; static bool GdalHasBeenInitialized; - + bool hasBeenInitialized; };