diff options
author | Chris Loer <chris.loer@gmail.com> | 2017-10-31 14:46:33 -0700 |
---|---|---|
committer | Chris Loer <chris.loer@mapbox.com> | 2017-11-01 10:49:07 -0700 |
commit | 56c34e6b9c89efa37cd6d8eb763eae5451672ab6 (patch) | |
tree | e12773ac932f7c7f68acc2363dc7b4bbcbc34919 | |
parent | fd606bbad3cbf876692b5646afdcce89e9847a61 (diff) | |
download | qtlocation-mapboxgl-56c34e6b9c89efa37cd6d8eb763eae5451672ab6.tar.gz |
GridIndex: add separate "query" method that doesn't return bounding boxes, for use by unit test and FeatureIndex.
Also: fix a bug that would cause results to be duplicated for query boxes that completely contained the index.
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/text/collision_index.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/util/grid_index.cpp | 14 | ||||
-rw-r--r-- | src/mbgl/util/grid_index.hpp | 3 |
4 files changed, 17 insertions, 12 deletions
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index 5ddba511df..1d80c055b0 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -61,15 +61,9 @@ void FeatureIndex::query( // Query the grid index mapbox::geometry::box<int16_t> box = mapbox::geometry::envelope(queryGeometry); - typedef std::pair<IndexedSubfeature, GridIndex<IndexedSubfeature>::BBox> QueryResult; - std::vector<QueryResult> queryResults = grid.query({ convertPoint<float>(box.min - additionalRadius), + std::vector<IndexedSubfeature> features = grid.query({ convertPoint<float>(box.min - additionalRadius), convertPoint<float>(box.max + additionalRadius) }); - // TODO: clumsy way to discard this data - std::vector<IndexedSubfeature> features; - for (auto& queryResult : queryResults) { - features.push_back(queryResult.first); - } std::sort(features.begin(), features.end(), topDown); size_t previousSortIndex = std::numeric_limits<size_t>::max(); diff --git a/src/mbgl/text/collision_index.cpp b/src/mbgl/text/collision_index.cpp index 0e3966e7de..d6ca55bbd2 100644 --- a/src/mbgl/text/collision_index.cpp +++ b/src/mbgl/text/collision_index.cpp @@ -268,7 +268,7 @@ std::vector<IndexedSubfeature> CollisionIndex::queryRenderedSymbols(const Geomet typedef std::pair<IndexedSubfeature, GridIndex<IndexedSubfeature>::BBox> QueryResult; std::vector<QueryResult> thisTileFeatures; - std::vector<QueryResult> features = collisionGrid.query({{minX, minY}, {maxX, maxY}}); + std::vector<QueryResult> features = collisionGrid.queryWithBoxes({{minX, minY}, {maxX, maxY}}); for (auto& queryResult : features) { auto& feature = queryResult.first; @@ -278,7 +278,7 @@ std::vector<IndexedSubfeature> CollisionIndex::queryRenderedSymbols(const Geomet } } - std::vector<QueryResult> ignoredFeatures = ignoredGrid.query({{minX, minY}, {maxX, maxY}}); + std::vector<QueryResult> ignoredFeatures = ignoredGrid.queryWithBoxes({{minX, minY}, {maxX, maxY}}); for (auto& queryResult : ignoredFeatures) { auto& feature = queryResult.first; CanonicalTileID featureTileID(feature.z, feature.x, feature.y); diff --git a/src/mbgl/util/grid_index.cpp b/src/mbgl/util/grid_index.cpp index 5a24d23e20..5869ee48ac 100644 --- a/src/mbgl/util/grid_index.cpp +++ b/src/mbgl/util/grid_index.cpp @@ -62,7 +62,17 @@ void GridIndex<T>::insert(T&& t, const BCircle& bcircle) { } template <class T> -std::vector<std::pair<T, typename GridIndex<T>::BBox>> GridIndex<T>::query(const BBox& queryBBox) const { +std::vector<T> GridIndex<T>::query(const BBox& queryBBox) const { + std::vector<T> result; + query(queryBBox, [&](const T& t, const BBox&) -> bool { + result.push_back(t); + return false; + }); + return result; +} + +template <class T> +std::vector<std::pair<T, typename GridIndex<T>::BBox>> GridIndex<T>::queryWithBoxes(const BBox& queryBBox) const { std::vector<std::pair<T, BBox>> result; query(queryBBox, [&](const T& t, const BBox& bbox) -> bool { result.push_back(std::make_pair(t, bbox)); @@ -116,7 +126,6 @@ void GridIndex<T>::query(const BBox& queryBBox, std::function<bool (const T&, co if (noIntersection(queryBBox)) { return; } else if (completeIntersection(queryBBox)) { - // TODO: std::for_each? for (auto& element : boxElements) { if (resultFn(element.first, element.second)) { return; @@ -127,6 +136,7 @@ void GridIndex<T>::query(const BBox& queryBBox, std::function<bool (const T&, co return; }; } + return; } auto cx1 = convertToXCellCoord(queryBBox.min.x); diff --git a/src/mbgl/util/grid_index.hpp b/src/mbgl/util/grid_index.hpp index 30b033cedd..46c610691f 100644 --- a/src/mbgl/util/grid_index.hpp +++ b/src/mbgl/util/grid_index.hpp @@ -65,7 +65,8 @@ public: void insert(T&& t, const BBox&); void insert(T&& t, const BCircle&); - std::vector<std::pair<T,BBox>> query(const BBox&) const; + std::vector<T> query(const BBox&) const; + std::vector<std::pair<T,BBox>> queryWithBoxes(const BBox&) const; bool hitTest(const BBox&) const; bool hitTest(const BCircle&) const; |