diff options
Diffstat (limited to 'src/mbgl/style')
-rw-r--r-- | src/mbgl/style/style.cpp | 38 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/style/style_bucket_parameters.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/style/style_bucket_parameters.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/style/style_layer.hpp | 8 |
5 files changed, 63 insertions, 3 deletions
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 553be89dd4..4d515b4e60 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -314,6 +314,44 @@ RenderData Style::getRenderData() const { return result; } +std::vector<std::string> Style::queryRenderedFeatures( + const std::vector<TileCoordinate>& queryGeometry, + const double zoom, + const double bearing, + const optional<std::vector<std::string>>& layerIDs) { + std::vector<std::unordered_map<std::string, std::vector<std::string>>> sourceResults; + for (const auto& source : sources) { + sourceResults.emplace_back(source->queryRenderedFeatures(queryGeometry, zoom, bearing, layerIDs)); + } + + + std::vector<std::string> features; + auto featuresInserter = std::back_inserter(features); + + // Combine all results based on the style layer order. + for (auto& layerPtr : layers) { + auto& layerID = layerPtr->id; + for (auto& sourceResult : sourceResults) { + auto it = sourceResult.find(layerID); + if (it != sourceResult.end()) { + auto& layerFeatures = it->second; + std::move(layerFeatures.begin(), layerFeatures.end(), featuresInserter); + } + } + } + + return features; +} + +float Style::getQueryRadius() const { + float additionalRadius = 0; + for (auto& layer : layers) { + additionalRadius = util::max(additionalRadius, layer->getQueryRadius()); + } + return additionalRadius; +} + + void Style::setSourceTileCacheSize(size_t size) { for (const auto& source : sources) { source->setCacheSize(size); diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 790518d08e..5dac4d4790 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -30,6 +30,7 @@ class StyleLayer; class Tile; class Bucket; class StyleUpdateParameters; +class TileCoordinate; struct RenderItem { inline RenderItem(const StyleLayer& layer_, @@ -107,6 +108,14 @@ public: RenderData getRenderData() const; + std::vector<std::string> queryRenderedFeatures( + const std::vector<TileCoordinate>& queryGeometry, + const double zoom, + const double bearing, + const optional<std::vector<std::string>>& layerIDs); + + float getQueryRadius() const; + void setSourceTileCacheSize(size_t); void onLowMemory(); diff --git a/src/mbgl/style/style_bucket_parameters.cpp b/src/mbgl/style/style_bucket_parameters.cpp index 8591dd430c..cf5184bd8b 100644 --- a/src/mbgl/style/style_bucket_parameters.cpp +++ b/src/mbgl/style/style_bucket_parameters.cpp @@ -5,7 +5,8 @@ namespace mbgl { void StyleBucketParameters::eachFilteredFeature(const Filter& filter, - std::function<void (const GeometryTileFeature&)> function) { + std::function<void (const GeometryTileFeature&, std::size_t index, const std::string& layerName)> function) { + auto name = layer.getName(); for (std::size_t i = 0; !cancelled() && i < layer.featureCount(); i++) { auto feature = layer.getFeature(i); @@ -13,7 +14,7 @@ void StyleBucketParameters::eachFilteredFeature(const Filter& filter, if (!Filter::visit(filter, evaluator)) continue; - function(*feature); + function(*feature, i, name); } } diff --git a/src/mbgl/style/style_bucket_parameters.hpp b/src/mbgl/style/style_bucket_parameters.hpp index c77980f37c..402e5810d3 100644 --- a/src/mbgl/style/style_bucket_parameters.hpp +++ b/src/mbgl/style/style_bucket_parameters.hpp @@ -16,6 +16,7 @@ class SpriteStore; class GlyphAtlas; class GlyphStore; class CollisionTile; +class FeatureIndex; class StyleBucketParameters { public: @@ -27,6 +28,7 @@ public: SpriteStore& spriteStore_, GlyphAtlas& glyphAtlas_, GlyphStore& glyphStore_, + FeatureIndex& featureIndex_, const MapMode mode_) : tileID(tileID_), layer(layer_), @@ -36,13 +38,14 @@ public: spriteStore(spriteStore_), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), + featureIndex(featureIndex_), mode(mode_) {} bool cancelled() const { return state == TileData::State::obsolete; } - void eachFilteredFeature(const Filter&, std::function<void (const GeometryTileFeature&)>); + void eachFilteredFeature(const Filter&, std::function<void (const GeometryTileFeature&, std::size_t index, const std::string& layerName)>); const TileID& tileID; const GeometryTileLayer& layer; @@ -52,6 +55,7 @@ public: SpriteStore& spriteStore; GlyphAtlas& glyphAtlas; GlyphStore& glyphStore; + FeatureIndex& featureIndex; const MapMode mode; }; diff --git a/src/mbgl/style/style_layer.hpp b/src/mbgl/style/style_layer.hpp index 9313138587..a568126e51 100644 --- a/src/mbgl/style/style_layer.hpp +++ b/src/mbgl/style/style_layer.hpp @@ -6,6 +6,7 @@ #include <mbgl/renderer/render_pass.hpp> #include <mbgl/util/noncopyable.hpp> #include <mbgl/util/rapidjson.hpp> +#include <mbgl/tile/geometry_tile.hpp> #include <memory> #include <string> @@ -60,6 +61,13 @@ public: // Checks whether this layer can be rendered. bool needsRendering() const; + virtual float getQueryRadius() const { return 0; } + virtual bool queryIntersectsGeometry( + const GeometryCollection&, + const GeometryCollection&, + const float, + const float) const { return false; }; + public: std::string id; std::string ref; |