[core] - mutable geojson sources. make tiles protected for geojson_source_impl (#6347)
This commit is contained in:
@@ -83,6 +83,7 @@ protected:
|
||||
|
||||
Source& base;
|
||||
SourceObserver* observer = nullptr;
|
||||
std::map<OverscaledTileID, std::unique_ptr<Tile>> tiles;
|
||||
|
||||
private:
|
||||
// TileObserver implementation.
|
||||
@@ -93,7 +94,6 @@ private:
|
||||
virtual Range<uint8_t> getZoomRange() = 0;
|
||||
virtual std::unique_ptr<Tile> createTile(const OverscaledTileID&, const UpdateParameters&) = 0;
|
||||
|
||||
std::map<OverscaledTileID, std::unique_ptr<Tile>> tiles;
|
||||
std::map<UnwrappedTileID, RenderTile> renderTiles;
|
||||
TileCache cache;
|
||||
};
|
||||
|
||||
@@ -65,6 +65,24 @@ void GeoJSONSource::Impl::setGeoJSON(const GeoJSON& geoJSON) {
|
||||
geoJSONOrSupercluster =
|
||||
std::make_unique<mapbox::supercluster::Supercluster>(features, clusterOptions);
|
||||
}
|
||||
|
||||
for (auto const &item : tiles) {
|
||||
GeoJSONTile* geoJSONTile = static_cast<GeoJSONTile*>(item.second.get());
|
||||
setTileData(*geoJSONTile, geoJSONTile->id);
|
||||
}
|
||||
}
|
||||
|
||||
void GeoJSONSource::Impl::setTileData(GeoJSONTile& tile, const OverscaledTileID& tileID) {
|
||||
if (geoJSONOrSupercluster.is<GeoJSONVTPointer>()) {
|
||||
tile.updateData(geoJSONOrSupercluster.get<GeoJSONVTPointer>()->getTile(tileID.canonical.z,
|
||||
tileID.canonical.x,
|
||||
tileID.canonical.y).features);
|
||||
} else {
|
||||
assert(geoJSONOrSupercluster.is<SuperclusterPointer>());
|
||||
tile.updateData(geoJSONOrSupercluster.get<SuperclusterPointer>()->getTile(tileID.canonical.z,
|
||||
tileID.canonical.x,
|
||||
tileID.canonical.y));
|
||||
}
|
||||
}
|
||||
|
||||
void GeoJSONSource::Impl::loadDescription(FileSource& fileSource) {
|
||||
@@ -126,20 +144,9 @@ Range<uint8_t> GeoJSONSource::Impl::getZoomRange() {
|
||||
std::unique_ptr<Tile> GeoJSONSource::Impl::createTile(const OverscaledTileID& tileID,
|
||||
const UpdateParameters& parameters) {
|
||||
assert(loaded);
|
||||
if (geoJSONOrSupercluster.is<GeoJSONVTPointer>()) {
|
||||
return std::make_unique<GeoJSONTile>(tileID, base.getID(), parameters,
|
||||
geoJSONOrSupercluster.get<GeoJSONVTPointer>()->getTile(
|
||||
tileID.canonical.z,
|
||||
tileID.canonical.x,
|
||||
tileID.canonical.y).features);
|
||||
} else {
|
||||
assert(geoJSONOrSupercluster.is<SuperclusterPointer>());
|
||||
return std::make_unique<GeoJSONTile>(tileID, base.getID(), parameters,
|
||||
geoJSONOrSupercluster.get<SuperclusterPointer>()->getTile(
|
||||
tileID.canonical.z,
|
||||
tileID.canonical.x,
|
||||
tileID.canonical.y));
|
||||
}
|
||||
auto tilePointer = std::make_unique<GeoJSONTile>(tileID, base.getID(), parameters);
|
||||
setTileData(*tilePointer.get(), tileID);
|
||||
return std::move(tilePointer);
|
||||
}
|
||||
|
||||
} // namespace style
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <mbgl/style/source_impl.hpp>
|
||||
#include <mbgl/style/sources/geojson_source.hpp>
|
||||
#include <mbgl/util/variant.hpp>
|
||||
#include <mbgl/tile/geojson_tile.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
@@ -19,6 +20,7 @@ public:
|
||||
optional<std::string> getURL();
|
||||
|
||||
void setGeoJSON(const GeoJSON&);
|
||||
void setTileData(GeoJSONTile&, const OverscaledTileID& tileID);
|
||||
|
||||
void loadDescription(FileSource&) final;
|
||||
|
||||
|
||||
@@ -77,9 +77,11 @@ public:
|
||||
|
||||
GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
|
||||
std::string sourceID_,
|
||||
const style::UpdateParameters& parameters,
|
||||
const mapbox::geometry::feature_collection<int16_t>& features)
|
||||
const style::UpdateParameters& parameters)
|
||||
: GeometryTile(overscaledTileID, sourceID_, parameters) {
|
||||
}
|
||||
|
||||
void GeoJSONTile::updateData(const mapbox::geometry::feature_collection<int16_t>& features) {
|
||||
setData(std::make_unique<GeoJSONTileData>(features));
|
||||
}
|
||||
|
||||
|
||||
@@ -13,9 +13,10 @@ class GeoJSONTile : public GeometryTile {
|
||||
public:
|
||||
GeoJSONTile(const OverscaledTileID&,
|
||||
std::string sourceID,
|
||||
const style::UpdateParameters&,
|
||||
const mapbox::geometry::feature_collection<int16_t>&);
|
||||
const style::UpdateParameters&);
|
||||
|
||||
void updateData(const mapbox::geometry::feature_collection<int16_t>&);
|
||||
|
||||
void setNecessity(Necessity) final;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user