#include #include #include #include #include #include #include #include #include namespace mbgl { CustomTile::CustomTile(const OverscaledTileID& overscaledTileID, std::string sourceID_, const TileParameters& parameters, const style::CustomVectorSource::TileOptions options_, ActorRef loader_) : GeometryTile(overscaledTileID, sourceID_, parameters), necessity(Resource::Optional), options(options_), loader(loader_), actor(*Scheduler::GetCurrent(), std::bind(&CustomTile::setTileData, this, std::placeholders::_1)) { } CustomTile::~CustomTile() { loader.invoke(&style::CustomTileLoader::removeTile, id); } void CustomTile::setTileData(const mapbox::geojson::geojson& geoJSON) { auto featureData = mapbox::geometry::feature_collection(); if (geoJSON.is() && !geoJSON.get().empty()) { const double scale = util::EXTENT / options.tileSize; mapbox::geojsonvt::TileOptions vtOptions; vtOptions.extent = util::EXTENT; vtOptions.buffer = std::round(scale * options.buffer); vtOptions.tolerance = scale * options.tolerance; featureData = mapbox::geojsonvt::geoJSONToTile(geoJSON, id.canonical.z, id.canonical.x, id.canonical.y, vtOptions).features; } setData(std::make_unique(std::move(featureData))); } void CustomTile::setNecessity(Necessity newNecessity) { if (newNecessity != necessity) { necessity = newNecessity; if (necessity == Necessity::Required) { loader.invoke(&style::CustomTileLoader::fetchTile, id, actor.self()); } else if(!isRenderable()) { loader.invoke(&style::CustomTileLoader::cancelTile, id); } } } void CustomTile::querySourceFeatures( std::vector& result, const SourceQueryOptions& queryOptions) { // Ignore the sourceLayer, there is only one auto layer = getData()->getLayer({}); if (layer) { auto featureCount = layer->featureCount(); for (std::size_t i = 0; i < featureCount; i++) { auto feature = layer->getFeature(i); // Apply filter, if any if (queryOptions.filter && !(*queryOptions.filter)(*feature)) { continue; } result.push_back(convertFeature(*feature, id.canonical)); } } } } // namespace mbgl