diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-13 08:55:46 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-17 13:20:25 -0700 |
commit | db7445999016f97e790e0c55b36f0d94768a5fe3 (patch) | |
tree | 96602cbee6ef66bb6a8a466b824464310ba7c1cd /src/mbgl/source/source.cpp | |
parent | 7e5d0ff49e2b5a6a3caa45464d8056e93431d780 (diff) | |
download | qtlocation-mapboxgl-db7445999016f97e790e0c55b36f0d94768a5fe3.tar.gz |
[core] Use mapbox::geometry::envelope in Source::queryRenderedFeatures
Diffstat (limited to 'src/mbgl/source/source.cpp')
-rw-r--r-- | src/mbgl/source/source.cpp | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/src/mbgl/source/source.cpp b/src/mbgl/source/source.cpp index 285b79127c..b6db4ee901 100644 --- a/src/mbgl/source/source.cpp +++ b/src/mbgl/source/source.cpp @@ -31,6 +31,7 @@ #include <mapbox/geojsonvt.hpp> #include <mapbox/geojsonvt/convert.hpp> +#include <mapbox/geometry/envelope.hpp> #include <rapidjson/error/en.h> @@ -324,16 +325,8 @@ bool Source::update(const StyleUpdateParameters& parameters) { return allTilesUpdated; } -std::vector<TileCoordinate> pointsToCoordinates(const std::vector<ScreenCoordinate>& queryPoints, const TransformState& transformState) { - std::vector<TileCoordinate> queryGeometry; - for (auto& p : queryPoints) { - queryGeometry.push_back(TileCoordinate::fromScreenCoordinate(transformState, 0, { p.x, transformState.getHeight() - p.y })); - } - return queryGeometry; -} - -static Point<int16_t> coordinateToTilePoint(const CanonicalTileID& tileID, const TileCoordinate& coord) { - auto zoomedCoord = coord.zoomTo(tileID.z); +static Point<int16_t> coordinateToTilePoint(const CanonicalTileID& tileID, const Point<double>& p) { + auto zoomedCoord = TileCoordinate { p, 0 }.zoomTo(tileID.z); return { int16_t(util::clamp<int64_t>((zoomedCoord.p.x - tileID.x) * util::EXTENT, std::numeric_limits<int16_t>::min(), @@ -352,31 +345,22 @@ struct TileQuery { }; std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures(const StyleQueryParameters& parameters) const { + LineString<double> queryGeometry; - std::vector<TileCoordinate> queryGeometry = pointsToCoordinates(parameters.geometry, parameters.transformState); - - std::unordered_map<std::string, std::vector<Feature>> result; - - double minX = std::numeric_limits<double>::infinity(); - double minY = std::numeric_limits<double>::infinity(); - double maxX = -std::numeric_limits<double>::infinity(); - double maxY = -std::numeric_limits<double>::infinity(); - double z = queryGeometry[0].z; - - for (const auto& c : queryGeometry) { - minX = util::min(minX, c.p.x); - minY = util::min(minY, c.p.y); - maxX = util::max(maxX, c.p.x); - maxY = util::max(maxY, c.p.y); + for (const auto& p : parameters.geometry) { + queryGeometry.push_back(TileCoordinate::fromScreenCoordinate( + parameters.transformState, 0, { p.x, parameters.transformState.getHeight() - p.y }).p); } + mapbox::geometry::box<double> box = mapbox::geometry::envelope(queryGeometry); + std::map<CanonicalTileID, TileQuery> tileQueries; for (const auto& tilePtr : tiles) { const auto& tile = tilePtr.second; - auto tileSpaceBoundsMin = coordinateToTilePoint(tile.id.canonical, { { minX, minY }, z }); - auto tileSpaceBoundsMax = coordinateToTilePoint(tile.id.canonical, { { maxX, maxY }, z }); + auto tileSpaceBoundsMin = coordinateToTilePoint(tile.id.canonical, box.min); + auto tileSpaceBoundsMax = coordinateToTilePoint(tile.id.canonical, box.max); if (tileSpaceBoundsMin.x >= util::EXTENT || tileSpaceBoundsMin.y >= util::EXTENT || tileSpaceBoundsMax.x < 0 || tileSpaceBoundsMax.y < 0) continue; @@ -400,6 +384,8 @@ std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatu } } + std::unordered_map<std::string, std::vector<Feature>> result; + for (const auto& it : tileQueries) { auto& tileQuery = std::get<1>(it); tileQuery.tileData.queryRenderedFeatures(result, |