#include #include #include #include #include #include #include #include #include #include namespace mbgl { CustomGeometryTile::CustomGeometryTile(const OverscaledTileID& overscaledTileID, std::string sourceID_, const TileParameters& parameters, const style::CustomGeometrySource::TileOptions options_, ActorRef loader_) : GeometryTile(overscaledTileID, sourceID_, parameters), necessity(TileNecessity::Optional), options(options_), loader(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::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 = ::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; } else { setNecessity(TileNecessity::Optional); } 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