diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-12 11:45:12 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-13 09:01:32 -0700 |
commit | 39da776bd7f696351364440427a6cd0b8fc3589e (patch) | |
tree | bb48c1dcb873c0971c3950968a1cfad1833dccb3 /src/mbgl/geometry/feature_index.cpp | |
parent | 9a7b7f6af3894abfb6f15e826e33b88073d117f0 (diff) | |
download | qtlocation-mapboxgl-39da776bd7f696351364440427a6cd0b8fc3589e.tar.gz |
[core] Use mapbox::geometry::{box,envelope}
Diffstat (limited to 'src/mbgl/geometry/feature_index.cpp')
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 50 |
1 files changed, 9 insertions, 41 deletions
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index 164431199e..fff2fbd075 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -7,6 +7,8 @@ #include <mbgl/util/math.hpp> #include <mbgl/math/minmax.hpp> +#include <mapbox/geometry/envelope.hpp> + #include <cassert> #include <string> @@ -21,23 +23,8 @@ void FeatureIndex::insert(const GeometryCollection& geometries, const std::string& sourceLayerName, const std::string& bucketName) { for (const auto& ring : geometries) { - float minX = std::numeric_limits<float>::infinity(); - float minY = std::numeric_limits<float>::infinity(); - float maxX = -std::numeric_limits<float>::infinity(); - float maxY = -std::numeric_limits<float>::infinity(); - - for (const auto& p : ring) { - const float x = p.x; - const float y = p.y; - minX = util::min(minX, x); - minY = util::min(minY, y); - maxX = util::max(maxX, x); - maxY = util::max(maxY, y); - } - - grid.insert( - IndexedSubfeature { index, sourceLayerName, bucketName, sortIndex++ }, - { int32_t(minX), int32_t(minY), int32_t(maxX), int32_t(maxY) }); + grid.insert(IndexedSubfeature { index, sourceLayerName, bucketName, sortIndex++ }, + mapbox::geometry::envelope<GeometryCoordinates, int16_t>(ring)); } } @@ -72,30 +59,11 @@ void FeatureIndex::query( const GeometryTile& geometryTile, const Style& style) const { - const float pixelsToTileUnits = util::EXTENT / tileSize / scale; - - float additionalRadius = style.getQueryRadius() * pixelsToTileUnits; + mapbox::geometry::box<int16_t> box = mapbox::geometry::envelope<GeometryCollection, int16_t>(queryGeometry); - float minX = std::numeric_limits<float>::infinity(); - float minY = std::numeric_limits<float>::infinity(); - float maxX = -std::numeric_limits<float>::infinity(); - float maxY = -std::numeric_limits<float>::infinity(); - - for (const auto& ring : queryGeometry) { - for (const auto& p : ring) { - minX = util::min<float>(minX, p.x); - minY = util::min<float>(minY, p.y); - maxX = util::max<float>(maxX, p.x); - maxY = util::max<float>(maxY, p.y); - } - } - - std::vector<IndexedSubfeature> features = grid.query({ - int(minX - additionalRadius), - int(minY - additionalRadius), - int(maxX + additionalRadius), - int(maxY + additionalRadius) - }); + const float pixelsToTileUnits = util::EXTENT / tileSize / scale; + const int16_t additionalRadius = std::min<int16_t>(util::EXTENT, std::ceil(style.getQueryRadius() * pixelsToTileUnits)); + std::vector<IndexedSubfeature> features = grid.query({ box.min - additionalRadius, box.max + additionalRadius }); std::sort(features.begin(), features.end(), topDown); size_t previousSortIndex = std::numeric_limits<size_t>::max(); @@ -110,7 +78,7 @@ void FeatureIndex::query( // query symbol features assert(collisionTile); - std::vector<IndexedSubfeature> symbolFeatures = collisionTile->queryRenderedSymbols(minX, minY, maxX, maxY, scale); + std::vector<IndexedSubfeature> symbolFeatures = collisionTile->queryRenderedSymbols(box, scale); std::sort(symbolFeatures.begin(), symbolFeatures.end(), topDownSymbols); for (const auto& symbolFeature : symbolFeatures) { addFeature(result, symbolFeature, queryGeometry, filterLayerIDs, geometryTile, style, bearing, pixelsToTileUnits); |