1 #include <mbgl/tile/geojson_tile.hpp>
2 #include <mbgl/tile/geojson_tile_data.hpp>
3 #include <mbgl/renderer/query.hpp>
4 #include <mbgl/renderer/tile_parameters.hpp>
5 
6 namespace mbgl {
7 
GeoJSONTile(const OverscaledTileID & overscaledTileID,std::string sourceID_,const TileParameters & parameters,mapbox::geometry::feature_collection<int16_t> features)8 GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
9                          std::string sourceID_,
10                          const TileParameters& parameters,
11                          mapbox::geometry::feature_collection<int16_t> features)
12     : GeometryTile(overscaledTileID, sourceID_, parameters) {
13     updateData(std::move(features));
14 }
15 
updateData(mapbox::geometry::feature_collection<int16_t> features)16 void GeoJSONTile::updateData(mapbox::geometry::feature_collection<int16_t> features) {
17     setData(std::make_unique<GeoJSONTileData>(std::move(features)));
18 }
19 
querySourceFeatures(std::vector<Feature> & result,const SourceQueryOptions & options)20 void GeoJSONTile::querySourceFeatures(
21     std::vector<Feature>& result,
22     const SourceQueryOptions& options) {
23 
24     // Ignore the sourceLayer, there is only one
25     if (auto tileData = getData()) {
26         if (auto layer = tileData->getLayer({})) {
27             auto featureCount = layer->featureCount();
28             for (std::size_t i = 0; i < featureCount; i++) {
29                 auto feature = layer->getFeature(i);
30 
31                 // Apply filter, if any
32                 if (options.filter && !(*options.filter)(style::expression::EvaluationContext { static_cast<float>(this->id.overscaledZ), feature.get() })) {
33                     continue;
34                 }
35 
36                 result.push_back(convertFeature(*feature, id.canonical));
37             }
38         }
39     }
40 }
41 
42 } // namespace mbgl
43