summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2017-10-31 14:46:33 -0700
committerChris Loer <chris.loer@mapbox.com>2017-11-01 10:49:07 -0700
commit56c34e6b9c89efa37cd6d8eb763eae5451672ab6 (patch)
treee12773ac932f7c7f68acc2363dc7b4bbcbc34919
parentfd606bbad3cbf876692b5646afdcce89e9847a61 (diff)
downloadqtlocation-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.cpp8
-rw-r--r--src/mbgl/text/collision_index.cpp4
-rw-r--r--src/mbgl/util/grid_index.cpp14
-rw-r--r--src/mbgl/util/grid_index.hpp3
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;