diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-10-07 11:49:22 -0700 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-10-11 10:54:58 +0300 |
commit | 38e78e25dfa3bc5b69a29029d4e065e72f462c37 (patch) | |
tree | 45eb6f881081ab585bb6665b3d49f099fbcb6b43 /src | |
parent | 61d8ecefda3a01d0860746af98d632b73c526d98 (diff) | |
download | qtlocation-mapboxgl-38e78e25dfa3bc5b69a29029d4e065e72f462c37.tar.gz |
[core] No need for feature querying to support multipolygons
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 18 | ||||
-rw-r--r-- | src/mbgl/geometry/feature_index.hpp | 8 | ||||
-rw-r--r-- | src/mbgl/style/layer_impl.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/style/layers/circle_layer_impl.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/layers/circle_layer_impl.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/style/layers/fill_layer_impl.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/layers/fill_layer_impl.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/style/layers/line_layer_impl.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/style/layers/line_layer_impl.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/util/intersection_tests.cpp | 49 | ||||
-rw-r--r-- | src/mbgl/util/intersection_tests.hpp | 6 |
12 files changed, 46 insertions, 57 deletions
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index 62db3b478d..cd131dde72 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -52,7 +52,7 @@ static bool topDownSymbols(const IndexedSubfeature& a, const IndexedSubfeature& void FeatureIndex::query( std::unordered_map<std::string, std::vector<Feature>>& result, - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const float bearing, const double tileSize, const double scale, @@ -93,7 +93,7 @@ void FeatureIndex::query( void FeatureIndex::addFeature( std::unordered_map<std::string, std::vector<Feature>>& result, const IndexedSubfeature& indexedFeature, - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const optional<std::vector<std::string>>& filterLayerIDs, const GeometryTileData& geometryTileData, const CanonicalTileID& tileID, @@ -128,8 +128,8 @@ void FeatureIndex::addFeature( } } -optional<GeometryCollection> FeatureIndex::translateQueryGeometry( - const GeometryCollection& queryGeometry, +optional<GeometryCoordinates> FeatureIndex::translateQueryGeometry( + const GeometryCoordinates& queryGeometry, const std::array<float, 2>& translate, const style::TranslateAnchorType anchorType, const float bearing, @@ -143,13 +143,9 @@ optional<GeometryCollection> FeatureIndex::translateQueryGeometry( translateVec = util::rotate(translateVec, -bearing); } - GeometryCollection translated; - for (const auto& ring : queryGeometry) { - translated.emplace_back(); - auto& translatedRing = translated.back(); - for (const auto& p : ring) { - translatedRing.push_back(p - translateVec); - } + GeometryCoordinates translated; + for (const auto& p : queryGeometry) { + translated.push_back(p - translateVec); } return translated; } diff --git a/src/mbgl/geometry/feature_index.hpp b/src/mbgl/geometry/feature_index.hpp index 0fddcb4700..021770c78d 100644 --- a/src/mbgl/geometry/feature_index.hpp +++ b/src/mbgl/geometry/feature_index.hpp @@ -35,7 +35,7 @@ public: void query( std::unordered_map<std::string, std::vector<Feature>>& result, - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const float bearing, const double tileSize, const double scale, @@ -44,8 +44,8 @@ public: const CanonicalTileID&, const style::Style&) const; - static optional<GeometryCollection> translateQueryGeometry( - const GeometryCollection& queryGeometry, + static optional<GeometryCoordinates> translateQueryGeometry( + const GeometryCoordinates& queryGeometry, const std::array<float, 2>& translate, const style::TranslateAnchorType, const float bearing, @@ -59,7 +59,7 @@ private: void addFeature( std::unordered_map<std::string, std::vector<Feature>>& result, const IndexedSubfeature&, - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const optional<std::vector<std::string>>& filterLayerIDs, const GeometryTileData&, const CanonicalTileID&, diff --git a/src/mbgl/style/layer_impl.hpp b/src/mbgl/style/layer_impl.hpp index 55b1ff058c..4bf2956a6d 100644 --- a/src/mbgl/style/layer_impl.hpp +++ b/src/mbgl/style/layer_impl.hpp @@ -69,7 +69,7 @@ public: virtual float getQueryRadius() const { return 0; } virtual bool queryIntersectsGeometry( - const GeometryCollection&, + const GeometryCoordinates&, const GeometryCollection&, const float, const float) const { return false; }; diff --git a/src/mbgl/style/layers/circle_layer_impl.cpp b/src/mbgl/style/layers/circle_layer_impl.cpp index e08d9df146..33699b6665 100644 --- a/src/mbgl/style/layers/circle_layer_impl.cpp +++ b/src/mbgl/style/layers/circle_layer_impl.cpp @@ -40,7 +40,7 @@ float CircleLayer::Impl::getQueryRadius() const { } bool CircleLayer::Impl::queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const { @@ -50,7 +50,7 @@ bool CircleLayer::Impl::queryIntersectsGeometry( auto circleRadius = paint.circleRadius * pixelsToTileUnits; - return util::multiPolygonIntersectsBufferedMultiPoint( + return util::polygonIntersectsBufferedMultiPoint( translatedQueryGeometry.value_or(queryGeometry), geometry, circleRadius); } diff --git a/src/mbgl/style/layers/circle_layer_impl.hpp b/src/mbgl/style/layers/circle_layer_impl.hpp index 555691b6b4..14baaf84e4 100644 --- a/src/mbgl/style/layers/circle_layer_impl.hpp +++ b/src/mbgl/style/layers/circle_layer_impl.hpp @@ -19,7 +19,7 @@ public: float getQueryRadius() const override; bool queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const override; diff --git a/src/mbgl/style/layers/fill_layer_impl.cpp b/src/mbgl/style/layers/fill_layer_impl.cpp index 2992312514..fc439f1cd1 100644 --- a/src/mbgl/style/layers/fill_layer_impl.cpp +++ b/src/mbgl/style/layers/fill_layer_impl.cpp @@ -49,7 +49,7 @@ float FillLayer::Impl::getQueryRadius() const { } bool FillLayer::Impl::queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const { @@ -57,7 +57,7 @@ bool FillLayer::Impl::queryIntersectsGeometry( auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry( queryGeometry, paint.fillTranslate, paint.fillTranslateAnchor, bearing, pixelsToTileUnits); - return util::multiPolygonIntersectsMultiPolygon(translatedQueryGeometry.value_or(queryGeometry), geometry); + return util::polygonIntersectsMultiPolygon(translatedQueryGeometry.value_or(queryGeometry), geometry); } } // namespace style diff --git a/src/mbgl/style/layers/fill_layer_impl.hpp b/src/mbgl/style/layers/fill_layer_impl.hpp index fc6578ecd1..54cfb80c86 100644 --- a/src/mbgl/style/layers/fill_layer_impl.hpp +++ b/src/mbgl/style/layers/fill_layer_impl.hpp @@ -19,7 +19,7 @@ public: float getQueryRadius() const override; bool queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const override; diff --git a/src/mbgl/style/layers/line_layer_impl.cpp b/src/mbgl/style/layers/line_layer_impl.cpp index 3cdd90b7fd..c116af5fc2 100644 --- a/src/mbgl/style/layers/line_layer_impl.cpp +++ b/src/mbgl/style/layers/line_layer_impl.cpp @@ -87,7 +87,7 @@ float LineLayer::Impl::getQueryRadius() const { } bool LineLayer::Impl::queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const { @@ -98,7 +98,7 @@ bool LineLayer::Impl::queryIntersectsGeometry( queryGeometry, paint.lineTranslate, paint.lineTranslateAnchor, bearing, pixelsToTileUnits); auto offsetGeometry = offsetLine(geometry, paint.lineOffset * pixelsToTileUnits); - return util::multiPolygonIntersectsBufferedMultiLine( + return util::polygonIntersectsBufferedMultiLine( translatedQueryGeometry.value_or(queryGeometry), offsetGeometry.value_or(geometry), halfWidth); diff --git a/src/mbgl/style/layers/line_layer_impl.hpp b/src/mbgl/style/layers/line_layer_impl.hpp index e130bc01bc..c6b4be3bec 100644 --- a/src/mbgl/style/layers/line_layer_impl.hpp +++ b/src/mbgl/style/layers/line_layer_impl.hpp @@ -19,7 +19,7 @@ public: float getQueryRadius() const override; bool queryIntersectsGeometry( - const GeometryCollection& queryGeometry, + const GeometryCoordinates& queryGeometry, const GeometryCollection& geometry, const float bearing, const float pixelsToTileUnits) const override; diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 1f64b6b6c6..46e2b414fe 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -136,7 +136,7 @@ void GeometryTile::queryRenderedFeatures( if (!featureIndex || !data) return; featureIndex->query(result, - { queryGeometry }, + queryGeometry, transformState.getAngle(), util::tileSize * id.overscaleFactor(), std::pow(2, transformState.getZoom() - id.overscaledZ), diff --git a/src/mbgl/util/intersection_tests.cpp b/src/mbgl/util/intersection_tests.cpp index 74b3bec388..a0feb8ec37 100644 --- a/src/mbgl/util/intersection_tests.cpp +++ b/src/mbgl/util/intersection_tests.cpp @@ -90,54 +90,47 @@ bool lineIntersectsBufferedLine(const GeometryCoordinates& lineA, const Geometry return false; } -bool multiPolygonIntersectsBufferedMultiPoint(const GeometryCollection& multiPolygon, const GeometryCollection& rings, float radius) { - for (auto& polygon : multiPolygon) { - for (auto& ring : rings) { - for (auto& point : ring) { - if (polygonContainsPoint(polygon, point)) return true; - if (pointIntersectsBufferedLine(point, polygon, radius)) return true; - } +bool polygonIntersectsBufferedMultiPoint(const GeometryCoordinates& polygon, const GeometryCollection& rings, float radius) { + for (auto& ring : rings) { + for (auto& point : ring) { + if (polygonContainsPoint(polygon, point)) return true; + if (pointIntersectsBufferedLine(point, polygon, radius)) return true; } } return false; } -bool multiPolygonIntersectsBufferedMultiLine(const GeometryCollection& multiPolygon, const GeometryCollection& multiLine, float radius) { +bool polygonIntersectsBufferedMultiLine(const GeometryCoordinates& polygon, const GeometryCollection& multiLine, float radius) { for (auto& line : multiLine) { - for (auto& polygon : multiPolygon) { - - if (polygon.size() >= 3) { - for (auto& p : line) { - if (polygonContainsPoint(polygon, p)) return true; - } + if (polygon.size() >= 3) { + for (auto& p : line) { + if (polygonContainsPoint(polygon, p)) return true; } - - if (lineIntersectsBufferedLine(polygon, line, radius)) return true; } + + if (lineIntersectsBufferedLine(polygon, line, radius)) return true; } return false; } -bool multiPolygonIntersectsMultiPolygon(const GeometryCollection& multiPolygonA, const GeometryCollection& multiPolygonB) { - if (multiPolygonA.size() == 1 && multiPolygonA.at(0).size() == 1) { - return multiPolygonContainsPoint(multiPolygonB, multiPolygonA.at(0).at(0)); +bool polygonIntersectsMultiPolygon(const GeometryCoordinates& polygon, const GeometryCollection& multiPolygon) { + if (polygon.size() == 1) { + return multiPolygonContainsPoint(multiPolygon, polygon.at(0)); } - for (auto& ring : multiPolygonB) { + for (auto& ring : multiPolygon) { for (auto& p : ring) { - if (multiPolygonContainsPoint(multiPolygonA, p)) return true; + if (polygonContainsPoint(polygon, p)) return true; } } - for (auto& polygon : multiPolygonA) { - for (auto& p : polygon) { - if (multiPolygonContainsPoint(multiPolygonB, p)) return true; - } + for (auto& p : polygon) { + if (multiPolygonContainsPoint(multiPolygon, p)) return true; + } - for (auto& polygonB : multiPolygonB) { - if (lineIntersectsLine(polygon, polygonB)) return true; - } + for (auto& polygonB : multiPolygon) { + if (lineIntersectsLine(polygon, polygonB)) return true; } return false; diff --git a/src/mbgl/util/intersection_tests.hpp b/src/mbgl/util/intersection_tests.hpp index be89d14ed6..6adb3b5fdf 100644 --- a/src/mbgl/util/intersection_tests.hpp +++ b/src/mbgl/util/intersection_tests.hpp @@ -5,9 +5,9 @@ namespace mbgl { namespace util { -bool multiPolygonIntersectsBufferedMultiPoint(const GeometryCollection&, const GeometryCollection&, float radius); -bool multiPolygonIntersectsBufferedMultiLine(const GeometryCollection&, const GeometryCollection&, float radius); -bool multiPolygonIntersectsMultiPolygon(const GeometryCollection&, const GeometryCollection&); +bool polygonIntersectsBufferedMultiPoint(const GeometryCoordinates&, const GeometryCollection&, float radius); +bool polygonIntersectsBufferedMultiLine(const GeometryCoordinates&, const GeometryCollection&, float radius); +bool polygonIntersectsMultiPolygon(const GeometryCoordinates&, const GeometryCollection&); } // namespace util } // namespace mbgl |