summaryrefslogtreecommitdiff
path: root/include/mbgl/map/annotation.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/map/annotation.hpp')
-rw-r--r--include/mbgl/map/annotation.hpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/include/mbgl/map/annotation.hpp b/include/mbgl/map/annotation.hpp
new file mode 100644
index 0000000000..e88d98b5c6
--- /dev/null
+++ b/include/mbgl/map/annotation.hpp
@@ -0,0 +1,72 @@
+#ifndef MBGL_MAP_ANNOTATIONS
+#define MBGL_MAP_ANNOTATIONS
+
+#include <mbgl/map/tile.hpp>
+#include <mbgl/map/live_tile.hpp>
+#include <mbgl/util/geo.hpp>
+#include <mbgl/util/noncopyable.hpp>
+#include <mbgl/util/std.hpp>
+#include <mbgl/util/vec.hpp>
+
+#include <string>
+#include <vector>
+#include <map>
+#include <mutex>
+#include <memory>
+
+namespace mbgl {
+
+class Annotation;
+class Map;
+
+typedef std::vector<LatLng> AnnotationSegment;
+
+enum class AnnotationType : uint8_t {
+ Point,
+ Shape
+};
+
+class AnnotationManager : private util::noncopyable {
+public:
+ AnnotationManager();
+
+ void setDefaultPointAnnotationSymbol(std::string& symbol) { defaultPointAnnotationSymbol = symbol; }
+ std::pair<std::vector<Tile::ID>, std::vector<uint32_t>> addPointAnnotations(std::vector<LatLng>, std::vector<std::string>& symbols, const Map&);
+ std::vector<Tile::ID> removeAnnotations(std::vector<uint32_t>);
+ std::vector<uint32_t> getAnnotationsInBounds(LatLngBounds, const Map&) const;
+ LatLngBounds getBoundsForAnnotations(std::vector<uint32_t>) const;
+
+ const std::unique_ptr<LiveTile>& getTile(Tile::ID const& id);
+
+private:
+ uint32_t nextID() { return nextID_++; }
+ static vec2<double> projectPoint(LatLng& point);
+
+private:
+ std::mutex mtx;
+ std::string defaultPointAnnotationSymbol;
+ std::map<uint32_t, std::unique_ptr<Annotation>> annotations;
+ std::map<Tile::ID, std::pair<std::vector<uint32_t>, std::unique_ptr<LiveTile>>> annotationTiles;
+ std::unique_ptr<LiveTile> nullTile;
+ uint32_t nextID_ = 0;
+};
+
+class Annotation : private util::noncopyable {
+ friend class AnnotationManager;
+public:
+ Annotation(AnnotationType, std::vector<AnnotationSegment>);
+
+private:
+ LatLng getPoint() const;
+ LatLngBounds getBounds() const { return bounds; }
+
+private:
+ const AnnotationType type = AnnotationType::Point;
+ const std::vector<AnnotationSegment> geometry;
+ std::map<Tile::ID, std::vector<std::weak_ptr<const LiveTileFeature>>> tileFeatures;
+ LatLngBounds bounds;
+};
+
+}
+
+#endif