[core] Pre-filter sources based on the layers they contain

This commit is contained in:
Thiago Marcos P. Santos
2016-10-04 15:51:00 +03:00
committed by Thiago Marcos P. Santos
parent 105673efc1
commit dd604a7b36

View File

@@ -13,6 +13,7 @@
#include <mbgl/style/layers/raster_layer.hpp>
#include <mbgl/style/layer_impl.hpp>
#include <mbgl/style/parser.hpp>
#include <mbgl/style/query_parameters.hpp>
#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/class_dictionary.hpp>
#include <mbgl/style/update_parameters.hpp>
@@ -393,10 +394,23 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions) const {
}
std::vector<Feature> Style::queryRenderedFeatures(const QueryParameters& parameters) const {
std::unordered_set<std::string> sourceFilter;
if (parameters.layerIDs) {
for (const auto& layerID : *parameters.layerIDs) {
auto layer = getLayer(layerID);
if (layer) sourceFilter.emplace(layer->baseImpl->source);
}
}
std::vector<Feature> result;
std::unordered_map<std::string, std::vector<Feature>> resultsByLayer;
for (const auto& source : sources) {
if (!sourceFilter.empty() && sourceFilter.find(source->getID()) == sourceFilter.end()) {
continue;
}
auto sourceResults = source->baseImpl->queryRenderedFeatures(parameters);
std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin()));
}