/* -*-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 */ #ifndef OSGEARTH_ARCGISSERVER_H #define OSGEARTH_ARCGISSERVER_H #include #include #include #include #include /** * Layers that access an ArcGIS Server REST endpoint * http://services.arcgisonline.com/arcgis/sdk/rest/index.html */ namespace osgEarth { namespace ArcGISServer { class OSGEARTH_EXPORT MapServiceLayer { public: MapServiceLayer(int id, const std::string& name); int getId() const; const std::string& getName() const; private: int id; std::string name; }; using MapServiceLayerList = std::vector; class OSGEARTH_EXPORT TileInfo { public: TileInfo(); TileInfo(int tile_size, const std::string& format, int min_level, int max_level, int _num_tiles_wide, int _num_tiles_high); TileInfo(const TileInfo& rhs); bool isValid() const; int getTileSize() const; const std::string& getFormat() const; int getMinLevel() const; int getMaxLevel() const; int getNumTilesWide() const; int getNumTilesHigh() const; private: std::string format; int tile_size; int min_level, max_level; bool is_valid; int num_tiles_wide; int num_tiles_high; }; class OSGEARTH_EXPORT MapService { public: MapService(); /** * Initializes a map service interface and populates its metadata from the * provided REST API URL (e.g.: http://server/ArcGIS/rest/services/MyMapService) * Call isValid() to verify success. */ bool init(const URI& uri, const osgDB::Options* options = 0L); /** * Returns true if the map service initialized successfully. */ bool isValid() const; bool isTiled() const; /** * If isValid() returns false, this method will return the error message. */ const std::string& getError() const; /** * Gets the data profile associated with this map service. */ const Profile* getProfile() const; /** * Gets the tile information for this service. */ const TileInfo& getTileInfo() const; /** * Gets the copyright text for the layer */ const std::string& getCopyright() const; private: bool is_valid; URI uri; osg::ref_ptr profile; std::string error_msg; MapServiceLayerList layers; bool tiled; TileInfo tile_info; std::string _copyright; bool setError(const std::string&); }; }; } namespace osgEarth { class OSGEARTH_EXPORT ArcGISServerOptions { public: OE_OPTION(URI, url); OE_OPTION(std::string, token); OE_OPTION(std::string, format); OE_OPTION(std::string, layers); void readFrom(const Config& conf); void writeTo(Config&) const; }; /** * Image layer connected to an ESRI ArcGIS Server API endpoint */ class OSGEARTH_EXPORT ArcGISServerImageLayer : public ImageLayer { public: // serialization data class OSGEARTH_EXPORT Options : public ArcGISServerOptions, public ImageLayer::Options { public: META_LayerOptions(osgEarth, Options, ImageLayer::Options); virtual Config getConfig() const; private: void fromConfig(const Config& conf); }; public: META_Layer(osgEarth, ArcGISServerImageLayer, Options, ImageLayer, ArcGISServerImage); public: //! URL of the map service endpoint void setURL(const URI& value); const URI& getURL() const; //! API security token void setToken(const std::string& value); const std::string& getToken() const; //! Override the imagery format reported in the service's metadata void setFormat(const std::string& value); const std::string& getFormat() const; //! Override the layer specification reported in the service's metadata void setLayers(const std::string& value); const std::string& getLayers() const; public: // Layer //! Establishes a connection to the service virtual Status openImplementation(); //! Creates a raster image for the given tile key virtual GeoImage createImageImplementation(const TileKey& key, ProgressCallback* progress) const; protected: // Layer //! Called by constructors virtual void init(); protected: //! Destructor virtual ~ArcGISServerImageLayer(); private: optional _profileConf; std::string _map; std::string _layers; std::string _format, _dot_format; std::string _copyright; ArcGISServer::MapService _map_service; }; /** * Elevation layer connected to an ESRI ArcGIS Server API endpoint */ class OSGEARTH_EXPORT ArcGISServerElevationLayer : public ElevationLayer { public: // serialization data class OSGEARTH_EXPORT Options : public ArcGISServerOptions, public ElevationLayer::Options { public: META_LayerOptions(osgEarth, Options, ElevationLayer::Options); virtual Config getConfig() const; private: void fromConfig(const Config& conf); }; public: META_Layer(osgEarth, ArcGISServerElevationLayer, Options, ElevationLayer, ArcGISServerElevation); public: //! URL of the map service endpoint void setURL(const URI& value); const URI& getURL() const; //! API security token void setToken(const std::string& value); const std::string& getToken() const; //! Override the imagery format reported in the service's metadata void setFormat(const std::string& value); const std::string& getFormat() const; //! Override the layer specification reported in the service's metadata void setLayers(const std::string& value); const std::string& getLayers() const; public: // Layer virtual Status openImplementation(); virtual Status closeImplementation(); //! Creates a heightfield for the given tile key virtual GeoHeightField createHeightFieldImplementation(const TileKey& key, ProgressCallback* progress) const; protected: // Layer //! Called by constructors virtual void init(); protected: //! Destructor virtual ~ArcGISServerElevationLayer() {}; private: osg::ref_ptr _imageLayer; }; } // namespace osgEarth OSGEARTH_SPECIALIZE_CONFIG(osgEarth::ArcGISServerImageLayer::Options); OSGEARTH_SPECIALIZE_CONFIG(osgEarth::ArcGISServerElevationLayer::Options); #endif // OSGEARTH_ARCGISSERVER_H