diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-05-08 12:02:16 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2020-05-26 20:35:04 +0300 |
commit | a6ea8d01cbfd48ba823d2e80442f741f7fcec328 (patch) | |
tree | 9f90e8fed1073549685814154cf1f882cefe15aa | |
parent | 6dc4e6029bda7155edf5d23363ba0a0ab1aa42f3 (diff) | |
download | qtlocation-mapboxgl-a6ea8d01cbfd48ba823d2e80442f741f7fcec328.tar.gz |
[core] Introduce TilesetSource
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | include/mbgl/style/source.hpp | 3 | ||||
-rw-r--r-- | include/mbgl/style/sources/raster_source.hpp | 11 | ||||
-rw-r--r-- | include/mbgl/style/sources/tileset_source.hpp | 27 | ||||
-rw-r--r-- | include/mbgl/style/sources/vector_source.hpp | 11 | ||||
-rw-r--r-- | src/mbgl/style/source.cpp | 42 | ||||
-rw-r--r-- | src/mbgl/style/sources/raster_source.cpp | 33 | ||||
-rw-r--r-- | src/mbgl/style/sources/tileset_source.cpp | 77 | ||||
-rw-r--r-- | src/mbgl/style/sources/vector_source.cpp | 32 |
9 files changed, 113 insertions, 125 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index fde902980d..afa82b0b75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -257,6 +257,7 @@ add_library( ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/image_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_dem_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/raster_source.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/tileset_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/sources/vector_source.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/style.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/style_property.hpp @@ -714,6 +715,7 @@ add_library( ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/raster_source_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/tileset_source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/style/sources/vector_source_impl.hpp diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp index cfb8e1f0dd..3d5b0b1cbb 100644 --- a/include/mbgl/style/source.hpp +++ b/include/mbgl/style/source.hpp @@ -175,9 +175,6 @@ public: protected: explicit Source(Immutable<Impl>); - void serializeUrlOrTileSet(Value&, const variant<std::string, Tileset>&) const; - void serializeTileSet(Value&, const mbgl::Tileset&) const; - virtual Mutable<Impl> createMutable() const noexcept = 0; virtual optional<conversion::Error> setPropertyInternal(const std::string& name, const conversion::Convertible& value); diff --git a/include/mbgl/style/sources/raster_source.hpp b/include/mbgl/style/sources/raster_source.hpp index 013c15a74c..d6715a69ce 100644 --- a/include/mbgl/style/sources/raster_source.hpp +++ b/include/mbgl/style/sources/raster_source.hpp @@ -1,6 +1,6 @@ #pragma once -#include <mbgl/style/source.hpp> +#include <mbgl/style/sources/tileset_source.hpp> #include <mbgl/util/tileset.hpp> #include <mbgl/util/variant.hpp> @@ -10,15 +10,11 @@ class AsyncRequest; namespace style { -class RasterSource : public Source { +class RasterSource : public TilesetSource { public: RasterSource(std::string id, variant<std::string, Tileset> urlOrTileset, uint16_t tileSize); ~RasterSource() override; - const Tileset* getTileset() const final; - optional<Resource> getResource() const final; - optional<std::string> getURL() const; - class Impl; const Impl& impl() const; @@ -30,8 +26,6 @@ public: return weakFactory.makeWeakPtr(); } - Value serialize() const override; - protected: RasterSource(Immutable<Impl>, variant<std::string, Tileset> urlOrTileset_); @@ -39,7 +33,6 @@ protected: virtual Mutable<Source::Impl> createMutable(Tileset tileset) const noexcept; private: - const variant<std::string, Tileset> urlOrTileset; std::unique_ptr<AsyncRequest> req; mapbox::base::WeakPtrFactory<Source> weakFactory {this}; }; diff --git a/include/mbgl/style/sources/tileset_source.hpp b/include/mbgl/style/sources/tileset_source.hpp new file mode 100644 index 0000000000..73e2b733ad --- /dev/null +++ b/include/mbgl/style/sources/tileset_source.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include <mbgl/style/source.hpp> +#include <mbgl/util/tileset.hpp> +#include <mbgl/util/variant.hpp> + +namespace mbgl { + +namespace style { + +class TilesetSource : public Source { +public: + ~TilesetSource() override; + + const Tileset* getTileset() const final; + optional<Resource> getResource() const final; + optional<std::string> getURL() const; + + Value serialize() const override; + +protected: + TilesetSource(Immutable<Impl>, variant<std::string, Tileset> urlOrTileset); + const variant<std::string, Tileset> urlOrTileset; +}; + +} // namespace style +} // namespace mbgl diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp index ff87084e19..c4e64cf777 100644 --- a/include/mbgl/style/sources/vector_source.hpp +++ b/include/mbgl/style/sources/vector_source.hpp @@ -1,6 +1,6 @@ #pragma once -#include <mbgl/style/source.hpp> +#include <mbgl/style/sources/tileset_source.hpp> #include <mbgl/util/tileset.hpp> #include <mbgl/util/variant.hpp> @@ -10,16 +10,12 @@ class AsyncRequest; namespace style { -class VectorSource final : public Source { +class VectorSource final : public TilesetSource { public: VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset, optional<float> maxZoom = nullopt, optional<float> minZoom = nullopt); ~VectorSource() final; - const Tileset* getTileset() const final; - optional<Resource> getResource() const final; - optional<std::string> getURL() const; - class Impl; const Impl& impl() const; @@ -31,13 +27,10 @@ public: return weakFactory.makeWeakPtr(); } - Value serialize() const override; - protected: Mutable<Source::Impl> createMutable() const noexcept final; private: - const variant<std::string, Tileset> urlOrTileset; std::unique_ptr<AsyncRequest> req; optional<float> maxZoom; optional<float> minZoom; diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp index 37eff9b121..9366117fc6 100644 --- a/src/mbgl/style/source.cpp +++ b/src/mbgl/style/source.cpp @@ -141,48 +141,6 @@ Value Source::serialize() const { return result; } -std::string tilesetSchemeToString(mbgl::Tileset::Scheme scheme) { - switch (scheme) { - case mbgl::Tileset::Scheme::XYZ: - return "xyz"; - case mbgl::Tileset::Scheme::TMS: - return "tms"; - } - - return "xyz"; -} - -void Source::serializeTileSet(Value& value, const mbgl::Tileset& tileset) const { - assert(value.getObject()); - const auto json = value.getObject(); - std::vector<mapbox::base::Value> tiles; - tiles.reserve(tileset.tiles.size()); - for (const auto& tile : tileset.tiles) tiles.emplace_back(tile); - - json->insert({"tiles", std::move(tiles)}); - json->insert({"minzoom", tileset.zoomRange.min}); - json->insert({"maxzoom", tileset.zoomRange.max}); - json->insert({"scheme", tilesetSchemeToString(tileset.scheme)}); - - if (tileset.bounds.has_value()) { - json->insert({"bounds", - std::vector<mapbox::base::Value>{tileset.bounds->southwest().longitude(), - tileset.bounds->southwest().latitude(), - tileset.bounds->northeast().longitude(), - tileset.bounds->northeast().latitude()}}); - } -} - -void Source::serializeUrlOrTileSet(Value& value, const mbgl::variant<std::string, mbgl::Tileset>& urlOrTileSet) const { - assert(value.getObject()); - - urlOrTileSet.match( - [&](const std::string& url) { - value.getObject()->insert({"url", url}); - }, - [&](const mbgl::Tileset& tileset) { serializeTileSet(value, tileset); }); -} - uint16_t Source::getTileSize() const { return baseImpl->getTileSize(); } diff --git a/src/mbgl/style/sources/raster_source.cpp b/src/mbgl/style/sources/raster_source.cpp index 8ee442a200..255ef82186 100644 --- a/src/mbgl/style/sources/raster_source.cpp +++ b/src/mbgl/style/sources/raster_source.cpp @@ -14,10 +14,10 @@ namespace mbgl { namespace style { RasterSource::RasterSource(std::string id, variant<std::string, Tileset> urlOrTileset_, uint16_t tileSize) - : Source(makeMutable<Impl>(std::move(id), tileSize)), urlOrTileset(std::move(urlOrTileset_)) {} + : TilesetSource(makeMutable<Impl>(std::move(id), tileSize), std::move(urlOrTileset_)) {} RasterSource::RasterSource(Immutable<Impl> impl, variant<std::string, Tileset> urlOrTileset_) - : Source(std::move(impl)), urlOrTileset(std::move(urlOrTileset_)) {} + : TilesetSource(std::move(impl), std::move(urlOrTileset_)) {} RasterSource::~RasterSource() = default; @@ -25,29 +25,6 @@ const RasterSource::Impl& RasterSource::impl() const { return static_cast<const Impl&>(*baseImpl); } -const Tileset* RasterSource::getTileset() const { - if (urlOrTileset.is<Tileset>()) { - return &urlOrTileset.get<Tileset>(); - } - return nullptr; -} - -optional<std::string> RasterSource::getURL() const { - if (urlOrTileset.is<Tileset>()) { - return nullopt; - } - - return urlOrTileset.get<std::string>(); -} - -optional<Resource> RasterSource::getResource() const { - if (urlOrTileset.is<std::string>()) { - return Resource::source(urlOrTileset.get<std::string>()); - } - - return nullopt; -} - void RasterSource::loadDescription(FileSource& fileSource) { if (urlOrTileset.is<Tileset>()) { baseImpl = createMutable(urlOrTileset.get<Tileset>()); @@ -103,11 +80,5 @@ Mutable<Source::Impl> RasterSource::createMutable(Tileset tileset) const noexcep return staticMutableCast<Source::Impl>(makeMutable<Impl>(impl(), std::move(tileset))); } -Value RasterSource::serialize() const { - auto value = Source::serialize(); - serializeUrlOrTileSet(value, urlOrTileset); - return value; -} - } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/sources/tileset_source.cpp b/src/mbgl/style/sources/tileset_source.cpp new file mode 100644 index 0000000000..7de970969f --- /dev/null +++ b/src/mbgl/style/sources/tileset_source.cpp @@ -0,0 +1,77 @@ +#include <mbgl/style/sources/tileset_source.hpp> + +#include <mbgl/style/conversion/tileset.hpp> +#include <mbgl/style/conversion_impl.hpp> +#include <mbgl/tile/tile.hpp> +#include <mbgl/util/constants.hpp> +#include <mbgl/util/enum.hpp> + +namespace mbgl { + +using TilesetScheme = Tileset::Scheme; +MBGL_DEFINE_ENUM(TilesetScheme, {{TilesetScheme::XYZ, "xyz"}, {TilesetScheme::TMS, "tms"}}); + +namespace style { + +TilesetSource::TilesetSource(Immutable<Impl> impl_, variant<std::string, Tileset> urlOrTileset_) + : Source(std::move(impl_)), urlOrTileset(std::move(urlOrTileset_)) {} + +TilesetSource::~TilesetSource() = default; + +const Tileset* TilesetSource::getTileset() const { + if (urlOrTileset.is<Tileset>()) { + return &urlOrTileset.get<Tileset>(); + } + return nullptr; +} + +optional<std::string> TilesetSource::getURL() const { + if (urlOrTileset.is<Tileset>()) return nullopt; + return urlOrTileset.get<std::string>(); +} + +optional<Resource> TilesetSource::getResource() const { + if (urlOrTileset.is<std::string>()) { + return Resource::source(urlOrTileset.get<std::string>()); + } + return nullopt; +} + +namespace { + +void serializeTileSet(Value& value, const mbgl::Tileset& tileset) { + assert(value.getObject()); + PropertyMap* properties = value.getObject(); + std::vector<mapbox::base::Value> tiles; + tiles.reserve(tileset.tiles.size()); + for (const auto& tile : tileset.tiles) tiles.emplace_back(tile); + + properties->insert({"tiles", std::move(tiles)}); + properties->insert({"minzoom", tileset.zoomRange.min}); + properties->insert({"maxzoom", tileset.zoomRange.max}); + properties->insert({"scheme", conversion::makeValue(tileset.scheme)}); + + if (tileset.bounds.has_value()) { + properties->insert({"bounds", + std::vector<mapbox::base::Value>{tileset.bounds->southwest().longitude(), + tileset.bounds->southwest().latitude(), + tileset.bounds->northeast().longitude(), + tileset.bounds->northeast().latitude()}}); + } +} + +} // namespace + +Value TilesetSource::serialize() const { + auto result = Source::serialize(); + assert(result.getObject()); + urlOrTileset.match( + [&](const std::string& url) { + result.getObject()->insert({"url", url}); + }, + [&](const mbgl::Tileset& tileset) { serializeTileSet(result, tileset); }); + return result; +} + +} // namespace style +} // namespace mbgl diff --git a/src/mbgl/style/sources/vector_source.cpp b/src/mbgl/style/sources/vector_source.cpp index 39f6fde76c..853d993863 100644 --- a/src/mbgl/style/sources/vector_source.cpp +++ b/src/mbgl/style/sources/vector_source.cpp @@ -19,8 +19,7 @@ VectorSource::VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset_, optional<float> maxZoom_, optional<float> minZoom_) - : Source(makeMutable<Impl>(std::move(id))), - urlOrTileset(std::move(urlOrTileset_)), + : TilesetSource(makeMutable<Impl>(std::move(id)), std::move(urlOrTileset_)), maxZoom(std::move(maxZoom_)), minZoom(std::move(minZoom_)) {} @@ -30,29 +29,6 @@ const VectorSource::Impl& VectorSource::impl() const { return static_cast<const Impl&>(*baseImpl); } -const Tileset* VectorSource::getTileset() const { - if (urlOrTileset.is<Tileset>()) { - return &urlOrTileset.get<Tileset>(); - } - return nullptr; -} - -optional<std::string> VectorSource::getURL() const { - if (urlOrTileset.is<Tileset>()) { - return {}; - } - - return urlOrTileset.get<std::string>(); -} - -optional<Resource> VectorSource::getResource() const { - if (urlOrTileset.is<std::string>()) { - return Resource::source(urlOrTileset.get<std::string>()); - } - - return nullopt; -} - void VectorSource::loadDescription(FileSource& fileSource) { if (urlOrTileset.is<Tileset>()) { baseImpl = makeMutable<Impl>(impl(), urlOrTileset.get<Tileset>()); @@ -109,11 +85,5 @@ Mutable<Source::Impl> VectorSource::createMutable() const noexcept { return staticMutableCast<Source::Impl>(makeMutable<Impl>(impl())); } -Value VectorSource::serialize() const { - auto result = Source::serialize(); - serializeUrlOrTileSet(result, urlOrTileset); - return result; -} - } // namespace style } // namespace mbgl |