[core] - mutable geojson sources. make tiles protected for geojson_source_impl (#6347)

This commit is contained in:
Tobrun
2016-09-20 20:50:27 +02:00
committed by GitHub
parent 3755d48441
commit 7df9a21f41
5 changed files with 31 additions and 19 deletions

View File

@@ -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;
};

View File

@@ -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

View File

@@ -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;

View File

@@ -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));
}

View File

@@ -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;
};