diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2018-03-30 16:28:05 -0400 |
---|---|---|
committer | Chris Loer <chris.loer@gmail.com> | 2018-04-02 17:42:46 -0700 |
commit | 7ccd39933d4545df758465939dfed1a5724c4b65 (patch) | |
tree | d1f11ca2e8a3aeb2772cd3aab2247b55110728a6 | |
parent | 8fab2a0c02962bc0620e52b674c867a113514fbc (diff) | |
download | qtlocation-mapboxgl-7ccd39933d4545df758465939dfed1a5724c4b65.tar.gz |
[core] only index features within tile boundaries
Previously we relied on tile buffers for querying features who's
rendered representations cross tile boundaries. Now we query multiple
tiles making it unnecessary to index features that are completely
outside a tile's boundaries.
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 9 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 2 |
2 files changed, 8 insertions, 3 deletions
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index ea0e8b61d1..a180dad9ed 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -28,8 +28,13 @@ void FeatureIndex::insert(const GeometryCollection& geometries, const std::string& bucketName) { for (const auto& ring : geometries) { auto envelope = mapbox::geometry::envelope(ring); - grid.insert(IndexedSubfeature(index, sourceLayerName, bucketName, sortIndex++), - {convertPoint<float>(envelope.min), convertPoint<float>(envelope.max)}); + if (envelope.min.x < util::EXTENT && + envelope.min.y < util::EXTENT && + envelope.max.x >= 0 && + envelope.max.y >= 0) { + grid.insert(IndexedSubfeature(index, sourceLayerName, bucketName, sortIndex++), + {convertPoint<float>(envelope.min), convertPoint<float>(envelope.max)}); + } } } diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index bcc3ed49ba..4c2c85e9a0 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -214,7 +214,7 @@ float GeometryTile::getQueryPadding(const std::vector<const RenderLayer*>& layer float queryPadding = 0; for (const RenderLayer* layer : layers) { auto bucket = getBucket(*layer->baseImpl); - if (bucket) { + if (bucket && bucket->hasData()) { queryPadding = std::max(queryPadding, bucket->getQueryRadius(*layer)); } } |