summaryrefslogtreecommitdiff
path: root/src/mbgl/style
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style')
-rw-r--r--src/mbgl/style/style.cpp38
-rw-r--r--src/mbgl/style/style.hpp9
-rw-r--r--src/mbgl/style/style_bucket_parameters.cpp5
-rw-r--r--src/mbgl/style/style_bucket_parameters.hpp6
-rw-r--r--src/mbgl/style/style_layer.hpp8
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;