DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/TileSource

453 lines
15 KiB
Plaintext
Raw Normal View History

2024-12-24 23:49:36 +00:00
/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2020 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#ifndef OSGEARTH_TILE_SOURCE_H
#define OSGEARTH_TILE_SOURCE_H 1
// Need to undef Status in case it has been defined in Xlib.h. This can happen on Linux
#undef Status
#include <limits.h>
#include <osg/Version>
#include <osgEarth/Common>
#include <osgEarth/CachePolicy>
#include <osgEarth/TileKey>
#include <osgEarth/Profile>
#include <osgEarth/Threading>
#include <osgEarth/MemCache>
#include <osgEarth/Status>
#include <osgEarth/Containers>
#include <osg/Referenced>
#include <osg/Object>
#include <osg/Image>
#include <osg/Shape>
#include <osgDB/Options>
#include <string>
namespace osgEarth
{
class ProgressCallback;
class Map;
}
namespace osgEarth { namespace Contrib
{
/**
* Configuration options for a tile source driver.
* @deprecated For legacy application support only
*/
class OSGEARTH_EXPORT TileSourceOptions : public DriverConfigOptions
{
public:
/** File in which to store a tile blacklist. */
optional<std::string>& blacklistFilename() { return _blacklistFilename; }
const optional<std::string>& blacklistFilename() const { return _blacklistFilename; }
/** Define a profile for this source, overriding the one reported by the source. */
optional<ProfileOptions>& profile() { return _profileOptions; }
const optional<ProfileOptions>& profile() const { return _profileOptions; }
/** Size of the in-memory cache (in entries; default=16) */
optional<int>& L2CacheSize() { return _L2CacheSize; }
const optional<int>& L2CacheSize() const { return _L2CacheSize; }
/** Whether to use bilinear sampling when reprojecting data from this source
* (default = true) */
optional<bool>& bilinearReprojection() { return _bilinearReprojection; }
const optional<bool>& bilinearReprojection() const { return _bilinearReprojection; }
/** Whether to rasterize into coverage data, which contains discrete non-interpolable values. */
optional<bool>& coverage() { return _coverage; }
const optional<bool>& coverage() const { return _coverage; }
/** osgDB::Options option string to pass through to osgDB reader/writers. */
optional<std::string>& osgOptionString() { return _osgOptionString; }
const optional<std::string>& osgOptionString() const { return _osgOptionString; }
public:
TileSourceOptions( const ConfigOptions& options =ConfigOptions() );
/** dtor */
virtual ~TileSourceOptions() { }
public:
virtual Config getConfig() const;
protected:
virtual void mergeConfig( const Config& conf );
private:
void fromConfig( const Config& conf );
optional<ProfileOptions> _profileOptions;
optional<std::string> _blacklistFilename;
optional<int> _L2CacheSize;
optional<bool> _bilinearReprojection;
optional<bool> _coverage;
optional<std::string> _osgOptionString;
};
} }
OSGEARTH_SPECIALIZE_CONFIG(osgEarth::Contrib::TileSourceOptions);
namespace osgEarth { namespace Contrib
{
/**
* A collection of tiles that should be considered blacklisted
*/
class OSGEARTH_EXPORT TileBlacklist : public osg::Referenced
{
public:
/**
*Creates a new TileBlacklist
*/
TileBlacklist();
/** dtor */
virtual ~TileBlacklist() { }
/**
*Adds the given tile to the blacklist
*/
void add(const TileKey& key);
/**
*Removes the given tile from the blacklist
*/
void remove(const TileKey& key);
/**
*Removes all tiles from the blacklist
*/
void clear();
/**
*Returns whether the given tile is in the blacklist
*/
bool contains(const TileKey& key) const;
/**
*Reads a TileBlacklist from the given istream
*/
static TileBlacklist* read(std::istream &in);
/**
*Reads a TileBlacklist from the given filename
*/
static TileBlacklist* read(const std::string &filename);
/**
*Writes this TileBlacklist to the given ostream
*/
void write(std::ostream &output) const;
/**
*Writes this TileBlacklist to the given filename
*/
void write(const std::string &filename) const;
private:
mutable LRUCache<TileKey, bool> _tiles; // using as a set (value unused)
};
/**
* A TileSource is an object that can create image and/or heightfield tiles. Driver
* plugins are responsible for creating and returning a TileSource that the Map
* will then use to create tiles for tile keys.
* @deprecated For legacy application support only
*/
class OSGEARTH_EXPORT TileSource : public virtual osg::Object
{
public:
/** Modes: OR these together when you call open(). */
typedef unsigned Mode;
/** Open for reading only */
static const Mode MODE_READ;
/** Open for writing */
static const Mode MODE_WRITE;
/** When using MODE_WRITE, create the data store if necessary */
static const Mode MODE_CREATE;
/** interface name, used by the plugin system. */
static const char* INTERFACE_NAME;
public:
struct ImageOperation : public osg::Referenced {
virtual void operator()( osg::ref_ptr<osg::Image>& in_out_image ) =0;
};
struct HeightFieldOperation : public osg::Referenced {
virtual void operator()( osg::ref_ptr<osg::HeightField>& in_out_hf ) =0;
};
public:
/** Constructor */
TileSource(const TileSourceOptions& options);
/**
* Opens the tile source and returns the initial status.
*/
const Status& open(
const Mode& openMode =MODE_READ,
const osgDB::Options* dbOptions =0L);
//! Gets the status of this tile source.
const Status& getStatus() const { return _status; }
//! Gets the number of pixels per tile for this TileSource.
virtual int getPixelsPerTile() const;
virtual void setPixelsPerTile(unsigned size);
//! Gets the list of areas with data for this TileSource
const DataExtentList& getDataExtents() const { return _dataExtents; }
DataExtentList& getDataExtents() { return _dataExtents; }
//! Value representing no data
float getNoDataValue() const { return _noDataValue; }
void setNoDataValue(float value) { _noDataValue = value; }
//! Values less than this are considered "no data"
float getMinValidValue() const { return _minValidValue; }
void setMinValidValue(float value) { _minValidValue = value; }
//! Values greater than this are considered "no data"
float getMaxValidValue() const { return _maxValidValue; }
void setMaxValidValue(float value) { _maxValidValue = value; }
//! The attribution string to be displayed for this TileSource
virtual std::string getAttribution() const { return ""; }
/**
* Creates an image for the given TileKey. The TileKey's profile must match
* the profile of the TileSource.
*/
virtual osg::Image* createImage(
const TileKey& key,
ImageOperation* op =0L,
ProgressCallback* progress =0L );
/**
* Creates a heightfield for the given TileKey. The TileKey's profile must match
* the profile of the TileSource.
*/
virtual osg::HeightField* createHeightField(
const TileKey& key,
HeightFieldOperation* op =0L,
ProgressCallback* progress =0L );
/**
* Stores an image in the tile source for the given TileKey.
* The driver must support writing or this method will return false.
*/
virtual bool storeImage(const TileKey& key,
osg::Image* image,
ProgressCallback* progress) { return false; }
/**
* Stores a heightfield in the tile source for the given TileKey.
* The driver must support writing or this method will return false.
* (Note: The default implementation will convert the heightfield to an
* image with one 32-bit channel and call storeImage.)
*/
virtual bool storeHeightField(const TileKey& key,
const osg::HeightField* hf,
ProgressCallback* progress);
public:
/**
* Returns True if this tile source initialized properly and has a valid
* profile.
*/
virtual bool isOK() const;
bool isValid() const { return isOK(); }
/**
* TimeStamp indicating the last time the data at this source changed
* Default is 0, i.e. the beginning of time itself (1970). It is up to
* the TileSource implementation whether to populate this field. The
* Map engine can use it for per-session caching purposes.
*/
virtual TimeStamp getLastModifiedTime() const { return 0; }
/**
* Gets the Profile of the TileSource
*/
virtual const Profile* getProfile() const;
/**
* Gets the blacklist for this TileSource
*/
TileBlacklist* getBlacklist();
const TileBlacklist* getBlacklist() const;
/**
* Whether this TileSource produces tiles whose data can change after
* it's been created.
*/
virtual bool isDynamic() const { return false; }
/**
* A hint as to what kind of caching policy would be appropriate to employ
* on this data source. By default, this is the default, which is to use a
* cache if one is configured. But a TileSource can report that caching should
* not be used (for whatever reason) by returning CachePolicy::NO_CACHE.
*/
virtual CachePolicy getCachePolicyHint(const Profile* targetProfile) const
{ return CachePolicy::DEFAULT; }
/**
* The open mode (passed to startup).
*/
const Mode& getMode() const { return _mode; }
/**
* The options used to construct this tile source.
*/
const TileSourceOptions& getOptions() const { return _options; }
/**
* Set the L2 cache size default (if the size was not set in
* the options or environment). Must call this before open().
*/
void setDefaultL2CacheSize(int size);
public:
/* methods required by osg::Object */
virtual osg::Object* cloneType() const { return 0; } // cloneType() not appropriate
virtual osg::Object* clone(const osg::CopyOp&) const { return 0; } // clone() not appropriate
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const TileSource*>(obj)!=NULL; }
virtual const char* className() const { return "TileSource"; }
virtual const char* libraryName() const { return "osgEarth"; }
protected:
/**
* Initializes the tile source (called by open)
*
* The osgEarth engine calls this function to initialize a TileSource using an
* active osgDB::Options. The method returns a status code indicating whether
* intialization succeeded (in which case the owning layer will become enabled)
* or failed (in which case the owning layer will become disabled.
*
* The Subclass should override this to report a correct initialization status.
* The default implementation reports STATUS_OK (for compatibility).
*/
virtual Status initialize(const osgDB::Options* readOptions) =0;
/**
* Creates an image for the given TileKey.
* The returned object is new and is the responsibility of the caller.
*/
virtual osg::Image* createImage(
const TileKey& key,
ProgressCallback* progress );
/**
* Creates a heightfield for the given TileKey
* The returned object is new and is the responsibility of the caller.
*/
virtual osg::HeightField* createHeightField(
const TileKey& key,
ProgressCallback* progress );
protected:
virtual ~TileSource();
/**
* Subclass can call this to set a Profile after opening the
* data store.
*/
void setProfile( const Profile* profile );
/**
* Subclass can call this to set the status. Normally you set the
* status by returning it from initialize(), but you can call this
* later, e.g. in the event of an unrecoverable error.
*/
void setStatus(const Status& value) { _status = value; }
//! Compat - do not override
unsigned getTileSize() const { return getPixelsPerTile(); }
private:
osg::ref_ptr<const Profile> _profile;
TileSourceOptions _options;
friend class Map;
friend class TileSourceFactory;
osg::ref_ptr< TileBlacklist > _blacklist;
std::string _blacklistFilename;
osg::ref_ptr<MemCache> _memCache;
DataExtentList _dataExtents;
Status _status;
Mode _mode;
unsigned _tileSize;
float _noDataValue;
float _minValidValue;
float _maxValidValue;
bool _openCalled;
mutable std::mutex _mutex;
};
//--------------------------------------------------------------------
class OSGEARTH_EXPORT TileSourceDriver : public osgDB::ReaderWriter
{
protected:
const TileSourceOptions& getTileSourceOptions(const osgDB::Options* options) const;
const std::string getInterfaceName(const osgDB::Options* options) const;
TileSource::Mode getOpenMode(const osgDB::Options* options) const;
};
//--------------------------------------------------------------------
/**
* Creates TileSource instances.
*/
class OSGEARTH_EXPORT TileSourceFactory
{
public:
/**
* Creates a TileSource instance by loading the driver plugin
* specified in the options.
*/
static TileSource* create(const TileSourceOptions& options);
};
} }
#endif // OSGEARTH_TILE_SOURCE_H