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

441 lines
12 KiB
Plaintext
Raw Permalink 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_WMS_H
#define OSGEARTH_WMS_H
#include <osgEarth/Common>
#include <osgEarth/ImageLayer>
#include <osgEarth/URI>
#include <osgEarth/TimeControl>
#include <osg/ImageSequence>
#include <set>
namespace osgEarth {
class WMSImageLayer;
namespace Util {
class XmlElement;
}
}
/**
* WMS (OGC Web Map Service)
* https://www.opengeospatial.org/standards/wms
*/
//! WMS namespace contains WMS support classes used to the Layers
namespace osgEarth { namespace WMS
{
class WMSImageLayerOptions;
/**
* WMS style definition
*/
class OSGEARTH_EXPORT Style : public osg::Referenced
{
public:
//! Constructs a new style
Style();
Style(const std::string& name, const std::string& title);
//! DTOR
virtual ~Style() { }
/**
*Gets the name of the style
*/
const std::string& getName() const {return _name;}
/**
*Sets the name of the style
*/
void setName(const std::string &name) {_name = name;}
/**
*Gets the title of the style
*/
const std::string& getTitle() const {return _title;}
/**
*Sets the title of the style
*/
void setTitle(const std::string &title) {_title = title;}
protected:
std::string _name;
std::string _title;
};
/**
* WMS server layer definition (unrelated to an osgEarth layer)
*/
class OSGEARTH_EXPORT Layer : public osg::Referenced
{
public:
Layer();
/** dtor */
virtual ~Layer() { }
/**
*Gets the name of the layer
*/
const std::string& getName() const {return _name;}
/**
*Sets the name of the layer
*/
void setName(const std::string &name) {_name = name;}
/**
*Gets the title of the layer
*/
const std::string& getTitle() const {return _title;}
/**
*Sets the title of the layer
*/
void setTitle(const std::string &title) {_title = title;}
/**
*Gets the abstract of the layer
*/
const std::string& getAbstract() const {return _abstract;}
/**
*Sets the abstract of the layer
*/
void setAbstract(const std::string &abstract) {_abstract = abstract;}
/**
*Gets the lat lon extents of the layer
*/
void getLatLonExtents(double &minLon, double &minLat, double &maxLon, double &maxLat) const;
/**
*Sets the lat lon extents of the layer
*/
void setLatLonExtents(double minLon, double minLat, double maxLon, double maxLat);
/**
*Gets the extents of the layer
*/
void getExtents(double &minX, double &minY, double &maxX, double &maxY) const;
/**
*Sets the extents of the layer
*/
void setExtents(double minX, double minY, double maxX, double maxY);
/**A list of Styles*/
typedef std::vector<Style> StyleList;
/**
*Gets this Layer's list of defined Styles
*/
StyleList& getStyles() {return _styles;}
/**A list of spatial references*/
typedef std::set<std::string> SRSList;
/**
*Gets this Layer's list of spatial references
*/
SRSList& getSpatialReferences() {return _spatialReferences;}
/**A list of Layers*/
typedef std::vector< osg::ref_ptr<Layer> > LayerList;
/**
*Gets this Layer's list of child Layers
*/
LayerList& getLayers() {return _layers;}
/**
*Gets this Layer's parent layer
*/
Layer* getParentLayer() const {return _parentLayer;}
/**
*Sets this Layer's parent layer
*/
void setParentLayer( Layer* layer ) {_parentLayer = layer;}
/**
*Finds the child Layer with the given name.
*@returns
* The Layer with the given name or NULL if not found.
*/
Layer* getLayerByName(const std::string &name) const;
protected:
std::string _name;
std::string _title;
std::string _abstract;
double _minLon, _minLat, _maxLon, _maxLat;
double _minX, _minY, _maxX, _maxY;
StyleList _styles;
SRSList _spatialReferences;
LayerList _layers;
Layer* _parentLayer;
};
/**
* WMS Capabilities exposes the available services of a WMS service
*/
class OSGEARTH_EXPORT Capabilities : public osg::Referenced
{
public:
Capabilities();
/** dtor */
virtual ~Capabilities() { }
/**
*Gets the WMS capabilities version
*/
const std::string& getVersion() const {return _version;}
/**
*Sets the WMS capabilities version
*/
void setVersion(const std::string& version) {_version = version;}
/**A list of supported formats*/
typedef std::vector<std::string> FormatList;
/**
*Gets the list of supported formats
*/
FormatList& getFormats() {return _formats;}
/**
*Gets the Layer's for the Capabilities.
*/
Layer::LayerList& getLayers() {return _layers;}
/**
*Suggests an extension to use for WMS layers defined for the service.
*This function will analyze the list of formats contained in the Capabilities request
*and recommend the first format that has an OpenSceneGraph ReaderWriter that can support
*it's extension.
*@returns
* The suggested extension.
*/
std::string suggestExtension() const;
/**
*Finds the child Layer with the given name.
*@returns
* The Layer with the given name or NULL if not found.
*/
Layer* getLayerByName(const std::string &name) const;
//! Finds the child Layer with the given name from a list of layers
Layer* getLayerByName(const std::string& name, const WMS::Layer::LayerList& layers) const;
protected:
FormatList _formats;
Layer::LayerList _layers;
std::string _version;
};
/**
* Reads WMS Capabilities from a URL or file
*/
class OSGEARTH_EXPORT CapabilitiesReader
{
public:
//! Reads WMS caps from a URI. The URI must be complete, to include
//! the WMS query string (e.g., ?SERVICE=WMS&REQUEST=GetCapabilities etc.)
//! @param location URI from which to read
//! @param options I/O options (or NULL)
static Capabilities* read( const URI& location, const osgDB::Options *options );
//! Reads WMS caps from a stream.
static Capabilities* read( std::istream &in );
private:
CapabilitiesReader(){}
CapabilitiesReader(const CapabilitiesReader &cr){}
static void readLayers(XmlElement* e, Layer* parentLayer, Layer::LayerList& layers);
};
/**
* Driver for direct communicating with a WMS service.
* It is rarely necessary to use this class directly. Instead, use a
* WMSImageLayer.
*/
class Driver : public osg::Referenced
{
public:
//! Construct the WMS driver
Driver(
const WMSImageLayerOptions& myOptions,
const osgDB::Options* readOptions);
//! Connect to the WMS service, query capabilities, and prepare the driver
Status open(
osg::ref_ptr<const Profile>& profile,
DataExtentList& out_dataExtents);
//! Create and return an image for the tile key
osg::Image* createImage( const TileKey& key, ProgressCallback* progress ) const;
//! Temporal extent of the data if any
const DateTimeExtent& getDateTimeExtent() const;
protected:
osg::Image* fetchTileImage(
const TileKey& key,
const std::string& extraAttrs,
ProgressCallback* progress,
ReadResult& out_response ) const;
osg::Image* createTimeSeriesImage(
const TileKey& key,
ProgressCallback* progress ) const;
std::string createURI( const TileKey& key ) const;
const WMSImageLayerOptions* _options;
const WMSImageLayerOptions& options() const;
std::string _formatToUse;
std::string _srsToUse;
osg::ref_ptr<const Profile> _profile;
std::string _prototype;
std::vector<std::string> _timesVec;
osg::ref_ptr<const osgDB::Options> _readOptions;
DateTimeExtent _dateTimeExtent;
};
/**
* Serialization options for a WMS image layer.
*/
class OSGEARTH_EXPORT WMSImageLayerOptions : public ImageLayer::Options
{
public:
META_LayerOptions(osgEarth, WMSImageLayerOptions, ImageLayer::Options);
OE_OPTION(URI, url);
OE_OPTION(URI, capabilitiesUrl);
OE_OPTION(std::string, layers);
OE_OPTION(std::string, style);
OE_OPTION(std::string, format);
OE_OPTION(std::string, wmsFormat);
OE_OPTION(std::string, wmsVersion);
OE_OPTION(std::string, srs);
OE_OPTION(std::string, crs);
OE_OPTION(bool, transparent);
OE_OPTION(std::string, times);
OE_OPTION(double, secondsPerFrame);
static Config getMetadata();
virtual Config getConfig() const;
private:
void fromConfig( const Config& conf );
};
} } // namespace osgEarth::WMS
namespace osgEarth
{
/**
* Image layer connected to a WMS service
*/
class OSGEARTH_EXPORT WMSImageLayer : public ImageLayer
{
public:
typedef WMS::WMSImageLayerOptions Options;
public:
META_Layer(osgEarth, WMSImageLayer, Options, ImageLayer, WMSImage);
//! Base URL for service requests
void setURL(const URI& value);
const URI& getURL() const;
//! Custom capabilibies URL (optional)
void setCapabilitiesURL(const URI& value);
const URI& getCapabilitiesURL() const;
//! Whitespace-separated list of layer names
void setLayers(const std::string& value);
const std::string& getLayers() const;
//! Name of WMS style to request be applied to the data
void setStyle(const std::string& value);
const std::string& getStyle() const;
//! Data format to request (e.g., mime type)
void setFormat(const std::string& value);
const std::string& getFormat() const;
//! Spatial reference to request
void setSRS(const std::string& value);
const std::string& getSRS() const;
//! CRS to request
void setCRS(const std::string& value);
const std::string& getCRS() const;
//! Whether to request a transparent background
void setTransparent(const bool& value);
const bool& getTransparent() const;
//! Comma-separated list of timestamps for experimental WMS-T support
void setTimes(const std::string& value);
const std::string& getTimes() const;
public: // Layer
//! Called by constructors
virtual void init() override;
//! Establishes a connection to the WMS service
virtual Status openImplementation() override;
//! Gets a raster image for the given tile key
virtual GeoImage createImageImplementation(const TileKey& key, ProgressCallback* progress) const override;
//! Date/Time range if this is WMS-T.
virtual DateTimeExtent getDateTimeExtent() const override;
protected:
//! Destructor
virtual ~WMSImageLayer() { }
private:
osg::ref_ptr<osg::Referenced> _driver;
bool _isPlaying;
};
} // namespace osgEarth
OSGEARTH_SPECIALIZE_CONFIG(osgEarth::WMSImageLayer::Options);
#endif // OSGEARTH_WMS_H