summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAsheem Mamoowala <asheemm@gmail.com>2017-02-21 18:34:45 -0800
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2017-03-04 15:42:07 -0800
commit60d10dd27df38ac4e97214d1cd514198c381695c (patch)
treef4ce0ecbf3a7eeb5c19f994d02152fc624b458d9 /src
parentac4e13416a36905b35401fc1a982c680ca37a3d0 (diff)
downloadqtlocation-mapboxgl-60d10dd27df38ac4e97214d1cd514198c381695c.tar.gz
[core] Add support for queryRenderedFeatures filter
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/geometry/feature_index.cpp19
-rw-r--r--src/mbgl/geometry/feature_index.hpp6
-rw-r--r--src/mbgl/map/map.cpp21
-rw-r--r--src/mbgl/style/query_parameters.hpp21
-rw-r--r--src/mbgl/style/source_impl.cpp16
-rw-r--r--src/mbgl/style/source_impl.hpp4
-rw-r--r--src/mbgl/style/style.cpp12
-rw-r--r--src/mbgl/style/style.hpp8
-rw-r--r--src/mbgl/tile/geometry_tile.cpp5
-rw-r--r--src/mbgl/tile/geometry_tile.hpp2
-rw-r--r--src/mbgl/tile/tile.cpp3
-rw-r--r--src/mbgl/tile/tile.hpp3
12 files changed, 61 insertions, 59 deletions
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp
index 5019d888ca..64fb7bd247 100644
--- a/src/mbgl/geometry/feature_index.cpp
+++ b/src/mbgl/geometry/feature_index.cpp
@@ -7,6 +7,9 @@
#include <mbgl/util/constants.hpp>
#include <mbgl/util/math.hpp>
#include <mbgl/math/minmax.hpp>
+#include <mbgl/map/query.hpp>
+#include <mbgl/style/filter.hpp>
+#include <mbgl/style/filter_evaluator.hpp>
#include <mapbox/geometry/envelope.hpp>
@@ -56,7 +59,7 @@ void FeatureIndex::query(
const float bearing,
const double tileSize,
const double scale,
- const optional<std::vector<std::string>>& filterLayerIDs,
+ const QueryOptions& queryOptions,
const GeometryTileData& geometryTileData,
const CanonicalTileID& tileID,
const style::Style& style,
@@ -76,7 +79,7 @@ void FeatureIndex::query(
if (indexedFeature.sortIndex == previousSortIndex) continue;
previousSortIndex = indexedFeature.sortIndex;
- addFeature(result, indexedFeature, queryGeometry, filterLayerIDs, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
+ addFeature(result, indexedFeature, queryGeometry, queryOptions, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
}
// Query symbol features, if they've been placed.
@@ -87,7 +90,7 @@ void FeatureIndex::query(
std::vector<IndexedSubfeature> symbolFeatures = collisionTile->queryRenderedSymbols(queryGeometry, scale);
std::sort(symbolFeatures.begin(), symbolFeatures.end(), topDownSymbols);
for (const auto& symbolFeature : symbolFeatures) {
- addFeature(result, symbolFeature, queryGeometry, filterLayerIDs, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
+ addFeature(result, symbolFeature, queryGeometry, queryOptions, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
}
}
@@ -95,7 +98,7 @@ void FeatureIndex::addFeature(
std::unordered_map<std::string, std::vector<Feature>>& result,
const IndexedSubfeature& indexedFeature,
const GeometryCoordinates& queryGeometry,
- const optional<std::vector<std::string>>& filterLayerIDs,
+ const QueryOptions& options,
const GeometryTileData& geometryTileData,
const CanonicalTileID& tileID,
const style::Style& style,
@@ -103,7 +106,7 @@ void FeatureIndex::addFeature(
const float pixelsToTileUnits) const {
auto& layerIDs = bucketLayerIDs.at(indexedFeature.bucketName);
- if (filterLayerIDs && !vectorsIntersect(layerIDs, *filterLayerIDs)) {
+ if (options.layerIDs && !vectorsIntersect(layerIDs, *options.layerIDs)) {
return;
}
@@ -114,7 +117,7 @@ void FeatureIndex::addFeature(
assert(geometryTileFeature);
for (const auto& layerID : layerIDs) {
- if (filterLayerIDs && !vectorContains(*filterLayerIDs, layerID)) {
+ if (options.layerIDs && !vectorContains(*options.layerIDs, layerID)) {
continue;
}
@@ -125,6 +128,10 @@ void FeatureIndex::addFeature(
continue;
}
+ if (options.filter && !(*options.filter)(*geometryTileFeature)) {
+ continue;
+ }
+
result[layerID].push_back(convertFeature(*geometryTileFeature, tileID));
}
}
diff --git a/src/mbgl/geometry/feature_index.hpp b/src/mbgl/geometry/feature_index.hpp
index ca813f4b6b..d2f68fd103 100644
--- a/src/mbgl/geometry/feature_index.hpp
+++ b/src/mbgl/geometry/feature_index.hpp
@@ -11,6 +11,8 @@
namespace mbgl {
+class QueryOptions;
+
namespace style {
class Style;
} // namespace style
@@ -39,7 +41,7 @@ public:
const float bearing,
const double tileSize,
const double scale,
- const optional<std::vector<std::string>>& layerIDs,
+ const QueryOptions& options,
const GeometryTileData&,
const CanonicalTileID&,
const style::Style&,
@@ -59,7 +61,7 @@ private:
std::unordered_map<std::string, std::vector<Feature>>& result,
const IndexedSubfeature&,
const GeometryCoordinates& queryGeometry,
- const optional<std::vector<std::string>>& filterLayerIDs,
+ const QueryOptions& options,
const GeometryTileData&,
const CanonicalTileID&,
const style::Style&,
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 857f088b62..f4f4d67148 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -12,7 +12,6 @@
#include <mbgl/style/observer.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/update_parameters.hpp>
-#include <mbgl/style/query_parameters.hpp>
#include <mbgl/renderer/painter.hpp>
#include <mbgl/storage/file_source.hpp>
#include <mbgl/storage/resource.hpp>
@@ -810,20 +809,20 @@ void Map::removeAnnotation(AnnotationID annotation) {
#pragma mark - Feature query api
-std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, const optional<std::vector<std::string>>& layerIDs) {
+std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, const QueryOptions& options) {
if (!impl->style) return {};
- return impl->style->queryRenderedFeatures({
+ return impl->style->queryRenderedFeatures(
{ point },
impl->transform.getState(),
- layerIDs
- });
+ options
+ );
}
-std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const optional<std::vector<std::string>>& layerIDs) {
+std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const QueryOptions& options) {
if (!impl->style) return {};
- return impl->style->queryRenderedFeatures({
+ return impl->style->queryRenderedFeatures(
{
box.min,
{ box.max.x, box.min.y },
@@ -832,12 +831,14 @@ std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const opti
box.min
},
impl->transform.getState(),
- layerIDs
- });
+ options
+ );
}
AnnotationIDs Map::queryPointAnnotations(const ScreenBox& box) {
- auto features = queryRenderedFeatures(box, {{ AnnotationManager::PointLayerID }});
+ QueryOptions options;
+ options.layerIDs = {{ AnnotationManager::PointLayerID }};
+ auto features = queryRenderedFeatures(box, options);
std::set<AnnotationID> set;
for (auto &feature : features) {
assert(feature.id);
diff --git a/src/mbgl/style/query_parameters.hpp b/src/mbgl/style/query_parameters.hpp
deleted file mode 100644
index 3c1abf3b70..0000000000
--- a/src/mbgl/style/query_parameters.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-
-#include <mbgl/util/geo.hpp>
-
-#include <vector>
-
-namespace mbgl {
-
-class TransformState;
-
-namespace style {
-
-class QueryParameters {
-public:
- const ScreenLineString& geometry;
- const TransformState& transformState;
- const optional<std::vector<std::string>>& layerIDs;
-};
-
-} // namespace style
-} // namespace mbgl
diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp
index 003df4f6b1..22e51f8885 100644
--- a/src/mbgl/style/source_impl.cpp
+++ b/src/mbgl/style/source_impl.cpp
@@ -4,12 +4,12 @@
#include <mbgl/renderer/render_tile.hpp>
#include <mbgl/renderer/painter.hpp>
#include <mbgl/style/update_parameters.hpp>
-#include <mbgl/style/query_parameters.hpp>
#include <mbgl/text/placement_config.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/math/clamp.hpp>
#include <mbgl/util/tile_cover.hpp>
#include <mbgl/util/enum.hpp>
+#include <mbgl/map/query.hpp>
#include <mbgl/algorithm/update_renderables.hpp>
#include <mbgl/algorithm/generate_clip_ids.hpp>
@@ -200,17 +200,19 @@ void Source::Impl::reloadTiles() {
}
}
-std::unordered_map<std::string, std::vector<Feature>> Source::Impl::queryRenderedFeatures(const QueryParameters& parameters) const {
+std::unordered_map<std::string, std::vector<Feature>> Source::Impl::queryRenderedFeatures(const ScreenLineString& geometry,
+ const TransformState& transformState,
+ const QueryOptions& options) const {
std::unordered_map<std::string, std::vector<Feature>> result;
- if (renderTiles.empty() || parameters.geometry.empty()) {
+ if (renderTiles.empty() || geometry.empty()) {
return result;
}
LineString<double> queryGeometry;
- for (const auto& p : parameters.geometry) {
+ for (const auto& p : geometry) {
queryGeometry.push_back(TileCoordinate::fromScreenCoordinate(
- parameters.transformState, 0, { p.x, parameters.transformState.getSize().height - p.y }).p);
+ transformState, 0, { p.x, transformState.getSize().height - p.y }).p);
}
mapbox::geometry::box<double> box = mapbox::geometry::envelope(queryGeometry);
@@ -245,8 +247,8 @@ std::unordered_map<std::string, std::vector<Feature>> Source::Impl::queryRendere
renderTile.tile.queryRenderedFeatures(result,
tileSpaceQueryGeometry,
- parameters.transformState,
- parameters.layerIDs);
+ transformState,
+ options);
}
return result;
diff --git a/src/mbgl/style/source_impl.hpp b/src/mbgl/style/source_impl.hpp
index e6340ae1cb..ea2135c3c1 100644
--- a/src/mbgl/style/source_impl.hpp
+++ b/src/mbgl/style/source_impl.hpp
@@ -66,7 +66,9 @@ public:
std::map<UnwrappedTileID, RenderTile>& getRenderTiles();
std::unordered_map<std::string, std::vector<Feature>>
- queryRenderedFeatures(const QueryParameters&) const;
+ queryRenderedFeatures(const ScreenLineString& geometry,
+ const TransformState& transformState,
+ const QueryOptions& options) const;
void setCacheSize(size_t);
void onLowMemory();
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index b6f14ecf4b..aacf811f4d 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -14,7 +14,6 @@
#include <mbgl/style/layers/raster_layer.hpp>
#include <mbgl/style/layer_impl.hpp>
#include <mbgl/style/parser.hpp>
-#include <mbgl/style/query_parameters.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/class_dictionary.hpp>
#include <mbgl/style/update_parameters.hpp>
@@ -31,6 +30,7 @@
#include <mbgl/util/logging.hpp>
#include <mbgl/util/math.hpp>
#include <mbgl/math/minmax.hpp>
+#include <mbgl/map/query.hpp>
#include <algorithm>
@@ -502,11 +502,13 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const
return result;
}
-std::vector<Feature> Style::queryRenderedFeatures(const QueryParameters& parameters) const {
+std::vector<Feature> Style::queryRenderedFeatures(const ScreenLineString& geometry,
+ const TransformState& transformState,
+ const QueryOptions& options) const {
std::unordered_set<std::string> sourceFilter;
- if (parameters.layerIDs) {
- for (const auto& layerID : *parameters.layerIDs) {
+ if (options.layerIDs) {
+ for (const auto& layerID : *options.layerIDs) {
auto layer = getLayer(layerID);
if (layer) sourceFilter.emplace(layer->baseImpl->source);
}
@@ -520,7 +522,7 @@ std::vector<Feature> Style::queryRenderedFeatures(const QueryParameters& paramet
continue;
}
- auto sourceResults = source->baseImpl->queryRenderedFeatures(parameters);
+ auto sourceResults = source->baseImpl->queryRenderedFeatures(geometry, transformState, options);
std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin()));
}
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index 4c4bcec63a..5246f6877d 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -28,6 +28,8 @@ class GlyphAtlas;
class SpriteAtlas;
class LineAtlas;
class RenderData;
+class TransformState;
+class QueryOptions;
namespace style {
@@ -95,8 +97,10 @@ public:
RenderData getRenderData(MapDebugOptions, float angle) const;
- std::vector<Feature> queryRenderedFeatures(const QueryParameters&) const;
-
+ std::vector<Feature> queryRenderedFeatures(const ScreenLineString& geometry,
+ const TransformState& transformState,
+ const QueryOptions& options) const;
+
float getQueryRadius() const;
void setSourceTileCacheSize(size_t);
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 9aeb35c821..83d130841d 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -13,6 +13,7 @@
#include <mbgl/text/collision_tile.hpp>
#include <mbgl/map/transform_state.hpp>
#include <mbgl/util/run_loop.hpp>
+#include <mbgl/map/query.hpp>
namespace mbgl {
@@ -141,7 +142,7 @@ void GeometryTile::queryRenderedFeatures(
std::unordered_map<std::string, std::vector<Feature>>& result,
const GeometryCoordinates& queryGeometry,
const TransformState& transformState,
- const optional<std::vector<std::string>>& layerIDs) {
+ const QueryOptions& options) {
if (!featureIndex || !data) return;
@@ -150,7 +151,7 @@ void GeometryTile::queryRenderedFeatures(
transformState.getAngle(),
util::tileSize * id.overscaleFactor(),
std::pow(2, transformState.getZoom() - id.overscaledZ),
- layerIDs,
+ options,
*data,
id.canonical,
style,
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index c61a510311..85a068ee01 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -44,7 +44,7 @@ public:
std::unordered_map<std::string, std::vector<Feature>>& result,
const GeometryCoordinates& queryGeometry,
const TransformState&,
- const optional<std::vector<std::string>>& layerIDs) override;
+ const QueryOptions& options) override;
void cancel() override;
diff --git a/src/mbgl/tile/tile.cpp b/src/mbgl/tile/tile.cpp
index e84eaaf780..4829ac8355 100644
--- a/src/mbgl/tile/tile.cpp
+++ b/src/mbgl/tile/tile.cpp
@@ -3,6 +3,7 @@
#include <mbgl/renderer/debug_bucket.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/logging.hpp>
+#include <mbgl/map/query.hpp>
namespace mbgl {
@@ -32,6 +33,6 @@ void Tile::queryRenderedFeatures(
std::unordered_map<std::string, std::vector<Feature>>&,
const GeometryCoordinates&,
const TransformState&,
- const optional<std::vector<std::string>>&) {}
+ const QueryOptions&) {}
} // namespace mbgl
diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp
index cebf913f56..0f0babf085 100644
--- a/src/mbgl/tile/tile.hpp
+++ b/src/mbgl/tile/tile.hpp
@@ -21,6 +21,7 @@ class DebugBucket;
class TransformState;
class TileObserver;
class PlacementConfig;
+class QueryOptions;
namespace style {
class Layer;
@@ -55,7 +56,7 @@ public:
std::unordered_map<std::string, std::vector<Feature>>& result,
const GeometryCoordinates& queryGeometry,
const TransformState&,
- const optional<std::vector<std::string>>& layerIDs);
+ const QueryOptions& options);
void setTriedOptional();