#include #include #include #include #include #include #include #include #include #include #include namespace mbgl { CustomGeometryTile::CustomGeometryTile(const OverscaledTileID& overscaledTileID, std::string sourceID_, const TileParameters& parameters, Immutable options_, ActorRef loader_) : GeometryTile(overscaledTileID, std::move(sourceID_), parameters), necessity(TileNecessity::Optional), options(std::move(options_)), loader(std::move(loader_)), mailbox(std::make_shared(*Scheduler::GetCurrent())), actorRef(*this, mailbox) {} CustomGeometryTile::~CustomGeometryTile() { loader.invoke(&style::CustomTileLoader::removeTile, id); } void CustomGeometryTile::setTileData(const GeoJSON& geoJSON) { auto featureData = mapbox::feature::feature_collection(); if (geoJSON.is() && !geoJSON.get().empty()) { auto scale = util::EXTENT / options->tileSize; assert(util::EXTENT % options->tileSize == 0); mapbox::geojsonvt::TileOptions vtOptions; vtOptions.extent = util::EXTENT; vtOptions.buffer = ::round(scale * options->buffer); vtOptions.tolerance = scale * options->tolerance; featureData = mapbox::geojsonvt::geoJSONToTile( geoJSON, id.canonical.z, id.canonical.x, id.canonical.y, vtOptions, options->wrap, options->clip) .features; } setData(std::make_unique(std::move(featureData))); } void CustomGeometryTile::invalidateTileData() { stale = true; observer->onTileChanged(*this); } //Fetching tile data for custom sources is assumed to be an expensive operation. // Only required tiles make fetchTile requests. Attempt to cancel a tile // that is no longer required. void CustomGeometryTile::setNecessity(TileNecessity newNecessity) { if (newNecessity != necessity || stale ) { necessity = newNecessity; if (necessity == TileNecessity::Required) { loader.invoke(&style::CustomTileLoader::fetchTile, id, actorRef); stale = false; } else if (!isRenderable()) { loader.invoke(&style::CustomTileLoader::cancelTile, id); } } } void CustomGeometryTile::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)(style::expression::EvaluationContext { static_cast(id.overscaledZ), feature.get() })) { continue; } result.push_back(convertFeature(*feature, id.canonical)); } } } } // namespace mbgl