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