diff options
Diffstat (limited to 'src/mbgl/tile/vector_tile.cpp')
-rw-r--r-- | src/mbgl/tile/vector_tile.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/mbgl/tile/vector_tile.cpp b/src/mbgl/tile/vector_tile.cpp index fc37363dda..dc4ed04d7f 100644 --- a/src/mbgl/tile/vector_tile.cpp +++ b/src/mbgl/tile/vector_tile.cpp @@ -1,11 +1,73 @@ #include <mbgl/tile/vector_tile.hpp> #include <mbgl/tile/tile_source_impl.hpp> +#include <mbgl/tile/geometry_tile.hpp> #include <mbgl/style/update_parameters.hpp> +#include <protozero/pbf_reader.hpp> + +#include <map> +#include <unordered_map> +#include <functional> #include <utility> namespace mbgl { +class VectorTileLayer; + +using pbf_iter_type = protozero::pbf_reader::const_uint32_iterator; +using packed_iter_type = std::pair<pbf_iter_type,pbf_iter_type>; + +class VectorTileFeature : public GeometryTileFeature { +public: + VectorTileFeature(protozero::pbf_reader, const VectorTileLayer&); + + FeatureType getType() const override { return type; } + optional<Value> getValue(const std::string&) const override; + std::unordered_map<std::string,Value> getProperties() const override; + optional<uint64_t> getID() const override; + GeometryCollection getGeometries() const override; + +private: + const VectorTileLayer& layer; + optional<uint64_t> id; + FeatureType type = FeatureType::Unknown; + packed_iter_type tags_iter; + packed_iter_type geometry_iter; +}; + +class VectorTileLayer : public GeometryTileLayer { +public: + VectorTileLayer(protozero::pbf_reader); + + std::size_t featureCount() const override { return features.size(); } + util::ptr<const GeometryTileFeature> getFeature(std::size_t) const override; + std::string getName() const override; + +private: + friend class VectorTile; + friend class VectorTileFeature; + + std::string name; + uint32_t version = 1; + uint32_t extent = 4096; + std::map<std::string, uint32_t> keysMap; + std::vector<std::reference_wrapper<const std::string>> keys; + std::vector<Value> values; + std::vector<protozero::pbf_reader> features; +}; + +class VectorTile : public GeometryTile { +public: + VectorTile(std::shared_ptr<const std::string> data); + + util::ptr<GeometryTileLayer> getLayer(const std::string&) const override; + +private: + std::shared_ptr<const std::string> data; + mutable bool parsed = false; + mutable std::map<std::string, util::ptr<GeometryTileLayer>> layers; +}; + VectorTileData::VectorTileData(const OverscaledTileID& id_, std::string sourceID, const style::UpdateParameters& parameters, |