Add simple TemporalTileProvider implementation

This commit is contained in:
Erik Broberg
2016-06-01 20:55:32 -04:00
parent 1097db4b5f
commit b8496f8d57
2 changed files with 119 additions and 0 deletions

View File

@@ -31,8 +31,12 @@
#include <ghoul/logging/logmanager.h>
#include <openspace/util/time.h>
#include <string>
#include <fstream>
#include <streambuf>
@@ -43,6 +47,73 @@ namespace {
namespace openspace {
const std::string TemporalTileProvider::TIME_PLACEHOLDER("${t}");
TemporalTileProvider::TemporalTileProvider(const std::string& datasetFile,
const TileProviderInitData& tileProviderInitData)
: _datasetFile(datasetFile)
, _tileProviderInitData(tileProviderInitData)
{
std::ifstream in(datasetFile.c_str());
ghoul_assert(errno == 0, strerror(errno) << std::endl << datasetFile);
// read file
std::string str( (std::istreambuf_iterator<char>(in)), (std::istreambuf_iterator<char>()));
_dataSourceXmlTemplate = std::string(str);
}
std::shared_ptr<TileProvider> TemporalTileProvider::getTileProvider(Time t) {
TimeKey timekey = getTimeKey(t);
auto it = _tileProviderMap.find(timekey);
if (it != _tileProviderMap.end()) {
return it->second;
}
else {
auto tileProvider = initTileProvider(timekey);
_tileProviderMap[timekey] = tileProvider;
return tileProvider;
}
}
std::shared_ptr<TileProvider> TemporalTileProvider::initTileProvider(TimeKey timekey) {
std::string gdalDatasetXml = getGdalDatasetXML(timekey);
std::shared_ptr<TileDataset> tileDataset = std::shared_ptr<TileDataset>(
new TileDataset(gdalDatasetXml, _tileProviderInitData.minimumPixelSize));
std::shared_ptr<ThreadPool> threadPool = std::shared_ptr<ThreadPool>(
new ThreadPool(_tileProviderInitData.threads));
std::shared_ptr<AsyncTileDataProvider> tileReader = std::shared_ptr<AsyncTileDataProvider>(
new AsyncTileDataProvider(tileDataset, threadPool));
std::shared_ptr<TileProvider> tileProvider= std::shared_ptr<TileProvider>(
new TileProvider(tileReader,
_tileProviderInitData.cacheSize,
_tileProviderInitData.framesUntilRequestQueueFlush));
return tileProvider;
}
TemporalTileProvider::TimeKey TemporalTileProvider::getTimeKey(const Time& t) {
std::string datestring = t.ISO8601();
datestring = datestring.substr(0, 10);
return datestring;
}
std::string TemporalTileProvider::getGdalDatasetXML(Time t) {
return getGdalDatasetXML(getTimeKey(t));
}
std::string TemporalTileProvider::getGdalDatasetXML(TimeKey timeKey) {
std::string xmlTemplate(_dataSourceXmlTemplate);
size_t pos = xmlTemplate.find(TIME_PLACEHOLDER);
size_t numChars = TIME_PLACEHOLDER.length();
ghoul_assert(pos != std::string::npos, "Invalid dataset file");
std::string timeSpecifiedXml = xmlTemplate.replace(pos, numChars, timeKey);
return timeSpecifiedXml;
}
} // namespace openspace

View File

@@ -30,6 +30,15 @@
#include <modules/globebrowsing/geodetics/geodetic2.h>
#include <modules/globebrowsing/other/tileprovider.h>
#include <openspace/util/time.h>
#include <unordered_map>
#include "gdal_priv.h"
#include "vrtdataset.h"
//////////////////////////////////////////////////////////////////////////////////////////
// TILE PROVIDER //
@@ -37,11 +46,50 @@
namespace openspace {
struct TileProviderInitData {
int minimumPixelSize;
int threads;
int cacheSize;
int framesUntilRequestQueueFlush;
};
class TemporalTileProvider {
public:
TemporalTileProvider(const std::string& datasetFile, const TileProviderInitData& tileProviderInitData);
std::shared_ptr<TileProvider> getTileProvider(Time t = Time::ref());
private:
typedef std::string TimeKey;
std::string getGdalDatasetXML(Time t);
std::string getGdalDatasetXML(TimeKey key);
static const std::string TIME_PLACEHOLDER;
TimeKey getTimeKey(const Time& t);
std::shared_ptr<TileProvider> initTileProvider(TimeKey timekey);
//////////////////////////////////////////////////////////////////////////////////
// Members variables //
//////////////////////////////////////////////////////////////////////////////////
const std::string _datasetFile;
std::string _dataSourceXmlTemplate;
std::unordered_map<TimeKey, std::shared_ptr<TileProvider> > _tileProviderMap;
TileProviderInitData _tileProviderInitData;
};
} // namespace openspace