#pragma once #include #include #include #include #include namespace CesiumRasterOverlays { /** * @brief Holds the parameters for an existing Google Maps Tiles session. */ struct GoogleMapTilesExistingSession { /** * @brief The Google Map Tiles API key to use. */ std::string key; /** * @brief The session token value to include in all Map Tiles API requests. */ std::string session; /** * @brief A string that contains the time (in seconds since the epoch) at * which the token expires. * * Google documents that a session token is valid for two weeks from its * creation time, but that this policy might change without notice. */ std::string expiry; /** * @brief The width of the tiles measured in pixels. */ uint32_t tileWidth; /** * @brief The height of the tiles measured in pixels. */ uint32_t tileHeight; /** * @brief The image format, which can be either @ref * GoogleMapTilesImageFormat::png or @ref GoogleMapTilesImageFormat::jpeg. */ std::string imageFormat; /** * @brief Whether or not the @ref GoogleMapTilesRasterOverlay should show the * Google Maps logo. * * Google requires the logo to be shown, so setting this to false is only * valid when something else is already showing the logo. */ bool showLogo = true; /** * @brief The base URL for the Google Maps Tiles API. */ std::string apiBaseUrl{"https://tile.googleapis.com/"}; }; /** * @brief Standard values for @ref GoogleMapTilesNewSessionParameters::mapType. */ struct GoogleMapTilesMapType { /** * @brief The standard Google Maps painted map tiles. */ inline static const std::string roadmap = "roadmap"; /** * @brief Satellite imagery. */ inline static const std::string satellite = "satellite"; /** * @brief Terrain imagery. When selecting terrain as the map type, you must * also set the @ref GoogleMapTilesNewSessionParameters::layerTypes property * to @ref GoogleMapTilesLayerType::layerRoadmap. */ inline static const std::string terrain = "terrain"; /** * @brief Street View panoramas. This is a documented map type supported by * the service, but it is unlikely to work well as a raster overlay. */ inline static const std::string streetview = "streetview"; }; /** * @brief Standard values for @ref * GoogleMapTilesNewSessionParameters::layerTypes. */ struct GoogleMapTilesLayerType { /** * @brief Required if you specify terrain as the map type. Can also be * optionally overlaid on the satellite map type. Has no effect on roadmap * tiles. */ inline static const std::string layerRoadmap = "layerRoadmap"; /** * @brief Shows Street View-enabled streets and locations using blue outlines * on the map. */ inline static const std::string layerStreetview = "layerStreetview"; /** * @brief Displays current traffic conditions. */ inline static const std::string layerTraffic = "layerTraffic"; }; /** * @brief Standard values for @ref * GoogleMapTilesNewSessionParameters::imageFormat. */ struct GoogleMapTilesImageFormat { /** * @brief Portable Network Graphics format. This format supports transparency. */ inline static const std::string png = "png"; /** * @brief Joint Photographic Experts Group format. This format doesn't support * transparency. */ inline static const std::string jpeg = "jpeg"; }; /** * @brief Standard values for @ref GoogleMapTilesNewSessionParameters::scale. */ struct GoogleMapTilesScale { /** * @brief The default. */ inline static const std::string scaleFactor1x = "scaleFactor1x"; /** * @brief Doubles label size and removes minor feature labels. */ inline static const std::string scaleFactor2x = "scaleFactor2x"; /** * @brief Quadruples label size and removes minor feature labels. */ inline static const std::string scaleFactor4x = "scaleFactor4x"; }; /** * @brief Holds the parameters for starting a new Google Maps Tiles session. */ struct GoogleMapTilesNewSessionParameters { /** * @brief The Google Map Tiles API key to use. */ std::string key; /** * @brief The type of base map. See @ref GoogleMapTilesMapType for standard * values. */ std::string mapType{"satellite"}; /** * @brief An [IETF language * tag](https://en.wikipedia.org/wiki/IETF_language_tag) that specifies the * language used to display information on the tiles. For example, `en-US` * specifies the English language as spoken in the United States. */ std::string language{"en-US"}; /** * @brief A [Common Locale Data Repository](https://cldr.unicode.org/) region * identifier (two uppercase letters) that represents the physical location of * the user. For example, `US`. */ std::string region{"US"}; /** * @brief Specifies the file format to return. See @ref * GoogleMapTilesImageFormat for standard values. * * If you don't specify an `imageFormat`, then the best format for the tile is * chosen automatically. */ std::optional imageFormat{}; /** * @brief Scales-up the size of map elements (such as road labels), while * retaining the tile size and coverage area of the default tile. See @ref * GoogleMapTilesScale for standard value. * * Increasing the scale also reduces the number of labels on the map, which * reduces clutter. */ std::optional scale{}; /** * @brief Specifies whether to return high-resolution tiles. * * If the scale-factor is increased, `highDpi` is used to increase the size of * the tile. Normally, increasing the scale factor enlarges the resulting tile * into an image of the same size, which lowers quality. With `highDpi`, the * resulting size is also increased, preserving quality. DPI stands for Dots * per Inch, and High DPI means the tile renders using more dots per inch than * normal. If `true`, then the number of pixels in each of the x and y * dimensions is multiplied by the scale factor (that is , 2x or 4x). The * coverage area of the tile remains unchanged. This parameter works only with * @ref scale values of @ref GoogleMapTilesScale::scaleFactor2x or @ref * GoogleMapTilesScale::scaleFactor4x. It has no effect on @ref * GoogleMapTilesScale::scaleFactor1x scale tiles. */ std::optional highDpi{}; /** * @brief An array of values that specifies the layer types added to the map. * See @ref GoogleMapTilesLayerType for standard values. */ std::optional> layerTypes{}; /** * @brief An array of JSON style objects that specify the appearance and * detail level of map features such as roads, parks, and built-up areas. * * Styling is used to customize the standard Google base map. The `styles` * parameter is valid only if the map type is @ref * GoogleMapTilesMapType::roadmap. For the complete style syntax, see the * [Style * Reference](https://developers.google.com/maps/documentation/tile/style-reference). */ std::optional styles{}; /** * @brief A boolean value that specifies whether @ref layerTypes should be * rendered as a separate overlay, or combined with the base imagery. * * When `true`, the base map isn't displayed. If you haven't defined any * `layerTypes`, then this value is ignored. */ std::optional overlay{}; /** * @brief The base URL for the Google Maps Tiles API. */ std::string apiBaseUrl{"https://tile.googleapis.com/"}; }; /** * @brief A @ref RasterOverlay that retrieves imagery from the [Google Maps * Tiles API](https://developers.google.com/maps/documentation/tile). */ class CESIUMRASTEROVERLAYS_API GoogleMapTilesRasterOverlay : public RasterOverlay { public: /** * @brief Constructs a new overlay that will start a new Google Maps Tiles * session with the specified parameters. * * @param name The user-given name of this overlay layer. * @param newSessionParameters The parameters for starting a new session. * @param overlayOptions The @ref RasterOverlayOptions for this instance. */ GoogleMapTilesRasterOverlay( const std::string& name, const GoogleMapTilesNewSessionParameters& newSessionParameters, const RasterOverlayOptions& overlayOptions = {}); /** * @brief Constructs a new overlay that will use an existing Google Maps Tiles * session that was previously started. * * @param name The user-given name of this overlay layer. * @param existingSession The parameters for the existing session. * @param overlayOptions The @ref RasterOverlayOptions for this instance. */ GoogleMapTilesRasterOverlay( const std::string& name, const GoogleMapTilesExistingSession& existingSession, const RasterOverlayOptions& overlayOptions = {}); /** @inheritdoc */ virtual CesiumAsync::Future createTileProvider( const CreateRasterOverlayTileProviderParameters& parameters) const override; private: CesiumAsync::Future createNewSession( const CreateRasterOverlayTileProviderParameters& parameters) const; std::optional _newSessionParameters; std::optional _existingSession; }; } // namespace CesiumRasterOverlays