diff options
author | Asheem Mamoowala <asheemm@gmail.com> | 2017-02-21 18:34:45 -0800 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-03-04 15:42:07 -0800 |
commit | 60d10dd27df38ac4e97214d1cd514198c381695c (patch) | |
tree | f4ce0ecbf3a7eeb5c19f994d02152fc624b458d9 /src | |
parent | ac4e13416a36905b35401fc1a982c680ca37a3d0 (diff) | |
download | qtlocation-mapboxgl-60d10dd27df38ac4e97214d1cd514198c381695c.tar.gz |
[core] Add support for queryRenderedFeatures filter
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 19 | ||||
-rw-r--r-- | src/mbgl/geometry/feature_index.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 21 | ||||
-rw-r--r-- | src/mbgl/style/query_parameters.hpp | 21 | ||||
-rw-r--r-- | src/mbgl/style/source_impl.cpp | 16 | ||||
-rw-r--r-- | src/mbgl/style/source_impl.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 8 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/tile.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/tile/tile.hpp | 3 |
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(); |