summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/util/geo.hpp2
-rw-r--r--src/mbgl/map/map.cpp44
-rw-r--r--src/mbgl/source/source.cpp27
-rw-r--r--src/mbgl/source/source.hpp9
-rw-r--r--src/mbgl/style/style.cpp8
-rw-r--r--src/mbgl/style/style.hpp8
-rw-r--r--src/mbgl/style/style_query_parameters.hpp18
7 files changed, 63 insertions, 53 deletions
diff --git a/include/mbgl/util/geo.hpp b/include/mbgl/util/geo.hpp
index 0fa782e06a..86274c1a7c 100644
--- a/include/mbgl/util/geo.hpp
+++ b/include/mbgl/util/geo.hpp
@@ -6,6 +6,7 @@
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/point_arithmetic.hpp>
+#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/box.hpp>
#include <cmath>
@@ -16,6 +17,7 @@ class CanonicalTileID;
class UnwrappedTileID;
using ScreenCoordinate = mapbox::geometry::point<double>;
+using ScreenLineString = mapbox::geometry::line_string<double>;
using ScreenBox = mapbox::geometry::box<double>;
class LatLng {
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 2c2b9f910c..5773b3f658 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -10,6 +10,7 @@
#include <mbgl/style/style_layer.hpp>
#include <mbgl/style/property_transition.hpp>
#include <mbgl/style/style_update_parameters.hpp>
+#include <mbgl/style/style_query_parameters.hpp>
#include <mbgl/layer/custom_layer.hpp>
#include <mbgl/renderer/painter.hpp>
#include <mbgl/storage/file_source.hpp>
@@ -725,43 +726,32 @@ AnnotationIDs Map::getPointAnnotationsInBounds(const LatLngBounds& bounds) {
#pragma mark - Feature query api
-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;
-}
-
std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, const optional<std::vector<std::string>>& layerIDs) {
if (!impl->style) return {};
- return impl->style->queryRenderedFeatures(
- pointsToCoordinates({ point }, impl->transform.getState()),
- impl->transform.getZoom(),
- impl->transform.getAngle(),
- layerIDs);
+ return impl->style->queryRenderedFeatures({
+ { point },
+ impl->transform.getState(),
+ layerIDs
+ });
}
std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const optional<std::vector<std::string>>& layerIDs) {
if (!impl->style) return {};
- std::vector<ScreenCoordinate> queryPoints {
- box.min,
- { box.max.x, box.min.y },
- box.max,
- { box.min.x, box.max.y },
- box.min
- };
-
- return impl->style->queryRenderedFeatures(
- pointsToCoordinates(queryPoints, impl->transform.getState()),
- impl->transform.getZoom(),
- impl->transform.getAngle(),
- layerIDs);
+ return impl->style->queryRenderedFeatures({
+ {
+ box.min,
+ { box.max.x, box.min.y },
+ box.max,
+ { box.min.x, box.max.y },
+ box.min
+ },
+ impl->transform.getState(),
+ layerIDs
+ });
}
-
#pragma mark - Style API
void Map::addCustomLayer(const std::string& id,
diff --git a/src/mbgl/source/source.cpp b/src/mbgl/source/source.cpp
index 91d4d6f738..1173de3f88 100644
--- a/src/mbgl/source/source.cpp
+++ b/src/mbgl/source/source.cpp
@@ -12,6 +12,7 @@
#include <mbgl/storage/file_source.hpp>
#include <mbgl/style/style_layer.hpp>
#include <mbgl/style/style_update_parameters.hpp>
+#include <mbgl/style/style_query_parameters.hpp>
#include <mbgl/platform/log.hpp>
#include <mbgl/math/minmax.hpp>
#include <mbgl/math/clamp.hpp>
@@ -323,6 +324,14 @@ 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);
return {
@@ -342,11 +351,9 @@ struct TileQuery {
double scale;
};
-std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures(
- const std::vector<TileCoordinate>& queryGeometry,
- const double zoom,
- const double bearing,
- const optional<std::vector<std::string>>& layerIDs) const {
+std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatures(const StyleQueryParameters& parameters) const {
+
+ std::vector<TileCoordinate> queryGeometry = pointsToCoordinates(parameters.geometry, parameters.transformState);
std::unordered_map<std::string, std::vector<Feature>> result;
@@ -384,19 +391,23 @@ std::unordered_map<std::string, std::vector<Feature>> Source::queryRenderedFeatu
if (it != tileQueries.end()) {
it->second.queryGeometry.push_back(std::move(tileSpaceQueryGeometry));
} else {
- (void)zoom;
tileQueries.emplace(tile.id.canonical, TileQuery{
tile.data,
{ tileSpaceQueryGeometry },
util::tileSize * tile.data.id.overscaleFactor(),
- std::pow(2, zoom - tile.data.id.overscaledZ)
+ std::pow(2, parameters.transformState.getZoom() - tile.data.id.overscaledZ)
});
}
}
for (const auto& it : tileQueries) {
auto& tileQuery = std::get<1>(it);
- tileQuery.tileData.queryRenderedFeatures(result, tileQuery.queryGeometry, bearing, tileQuery.tileSize, tileQuery.scale, layerIDs);
+ tileQuery.tileData.queryRenderedFeatures(result,
+ tileQuery.queryGeometry,
+ parameters.transformState.getAngle(),
+ tileQuery.tileSize,
+ tileQuery.scale,
+ parameters.layerIDs);
}
return result;
diff --git a/src/mbgl/source/source.hpp b/src/mbgl/source/source.hpp
index 7f435f8d9b..8bed717780 100644
--- a/src/mbgl/source/source.hpp
+++ b/src/mbgl/source/source.hpp
@@ -25,12 +25,12 @@ namespace mbgl {
class Style;
class StyleUpdateParameters;
+class StyleQueryParameters;
class Painter;
class FileSource;
class AsyncRequest;
class TransformState;
class Tile;
-class TileCoordinate;
struct ClipID;
class Source : private util::noncopyable {
@@ -80,11 +80,8 @@ public:
TileData* getTileData(const OverscaledTileID&) const;
- std::unordered_map<std::string, std::vector<Feature>> queryRenderedFeatures(
- const std::vector<TileCoordinate>& queryGeometry,
- const double zoom,
- const double bearing,
- const optional<std::vector<std::string>>& layerIDs) const;
+ std::unordered_map<std::string, std::vector<Feature>>
+ queryRenderedFeatures(const StyleQueryParameters&) const;
void setCacheSize(size_t);
void onLowMemory();
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 07147e4a4a..726b1f192b 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -317,14 +317,10 @@ RenderData Style::getRenderData() const {
return result;
}
-std::vector<Feature> Style::queryRenderedFeatures(
- const std::vector<TileCoordinate>& queryGeometry,
- const double zoom,
- const double bearing,
- const optional<std::vector<std::string>>& layerIDs) const {
+std::vector<Feature> Style::queryRenderedFeatures(const StyleQueryParameters& parameters) const {
std::vector<std::unordered_map<std::string, std::vector<Feature>>> sourceResults;
for (const auto& source : sources) {
- sourceResults.emplace_back(source->queryRenderedFeatures(queryGeometry, zoom, bearing, layerIDs));
+ sourceResults.emplace_back(source->queryRenderedFeatures(parameters));
}
std::vector<Feature> features;
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index 0c0b2293b7..875973683a 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -31,7 +31,7 @@ class StyleLayer;
class Tile;
class Bucket;
class StyleUpdateParameters;
-class TileCoordinate;
+class StyleQueryParameters;
struct RenderItem {
inline RenderItem(const StyleLayer& layer_,
@@ -109,11 +109,7 @@ public:
RenderData getRenderData() const;
- std::vector<Feature> queryRenderedFeatures(
- const std::vector<TileCoordinate>& queryGeometry,
- const double zoom,
- const double bearing,
- const optional<std::vector<std::string>>& layerIDs) const;
+ std::vector<Feature> queryRenderedFeatures(const StyleQueryParameters&) const;
float getQueryRadius() const;
diff --git a/src/mbgl/style/style_query_parameters.hpp b/src/mbgl/style/style_query_parameters.hpp
new file mode 100644
index 0000000000..33115bdfb2
--- /dev/null
+++ b/src/mbgl/style/style_query_parameters.hpp
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <mbgl/util/geo.hpp>
+
+#include <vector>
+
+namespace mbgl {
+
+class TransformState;
+
+class StyleQueryParameters {
+public:
+ const ScreenLineString& geometry;
+ const TransformState& transformState;
+ const optional<std::vector<std::string>>& layerIDs;
+};
+
+} // namespace mbgl