From db7445999016f97e790e0c55b36f0d94768a5fe3 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 13 May 2016 08:55:46 -0700 Subject: [core] Use mapbox::geometry::envelope in Source::queryRenderedFeatures --- src/mbgl/source/source.cpp | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) (limited to 'src') 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 #include +#include #include @@ -324,16 +325,8 @@ bool Source::update(const StyleUpdateParameters& parameters) { return allTilesUpdated; } -std::vector pointsToCoordinates(const std::vector& queryPoints, const TransformState& transformState) { - std::vector queryGeometry; - for (auto& p : queryPoints) { - queryGeometry.push_back(TileCoordinate::fromScreenCoordinate(transformState, 0, { p.x, transformState.getHeight() - p.y })); - } - return queryGeometry; -} - -static Point coordinateToTilePoint(const CanonicalTileID& tileID, const TileCoordinate& coord) { - auto zoomedCoord = coord.zoomTo(tileID.z); +static Point coordinateToTilePoint(const CanonicalTileID& tileID, const Point& p) { + auto zoomedCoord = TileCoordinate { p, 0 }.zoomTo(tileID.z); return { int16_t(util::clamp((zoomedCoord.p.x - tileID.x) * util::EXTENT, std::numeric_limits::min(), @@ -352,31 +345,22 @@ struct TileQuery { }; std::unordered_map> Source::queryRenderedFeatures(const StyleQueryParameters& parameters) const { + LineString queryGeometry; - std::vector queryGeometry = pointsToCoordinates(parameters.geometry, parameters.transformState); - - std::unordered_map> result; - - double minX = std::numeric_limits::infinity(); - double minY = std::numeric_limits::infinity(); - double maxX = -std::numeric_limits::infinity(); - double maxY = -std::numeric_limits::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 box = mapbox::geometry::envelope(queryGeometry); + std::map 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> Source::queryRenderedFeatu } } + std::unordered_map> result; + for (const auto& it : tileQueries) { auto& tileQuery = std::get<1>(it); tileQuery.tileData.queryRenderedFeatures(result, -- cgit v1.2.1