Merge commit '4298677f776393f9eb1444b6a35a93cc38f59e10' into feature/globebrowsing

This commit is contained in:
Kalle
2016-07-08 12:46:10 -04:00
2 changed files with 69 additions and 18 deletions

View File

@@ -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<TileIOResult> 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;
}

View File

@@ -101,8 +101,8 @@ namespace openspace {
//////////////////////////////////////////////////////////////////////////////////
std::shared_ptr<TileIOResult> 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;
};