[core] Simplify GeoJSONTile constructor

This commit is contained in:
John Firebaugh
2016-08-25 17:54:02 -07:00
parent d2abb1b6d5
commit f07f592078
3 changed files with 32 additions and 55 deletions

View File

@@ -128,11 +128,17 @@ std::unique_ptr<Tile> GeoJSONSource::Impl::createTile(const OverscaledTileID& ti
assert(loaded);
if (geoJSONOrSupercluster.is<GeoJSONVTPointer>()) {
return std::make_unique<GeoJSONTile>(tileID, base.getID(), parameters,
*geoJSONOrSupercluster.get<GeoJSONVTPointer>());
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>());
geoJSONOrSupercluster.get<SuperclusterPointer>()->getTile(
tileID.canonical.z,
tileID.canonical.x,
tileID.canonical.y));
}
}

View File

@@ -63,51 +63,38 @@ class GeoJSONTileData : public GeometryTileData {
public:
std::shared_ptr<GeoJSONTileLayer> layer = std::make_shared<GeoJSONTileLayer>();
GeoJSONTileData(const mapbox::geometry::feature_collection<int16_t>& features) {
for (auto& feature : features) {
const FeatureType featureType = apply_visitor(ToFeatureType(), feature.geometry);
if (featureType == FeatureType::Unknown) {
continue;
}
GeometryCollection geometry = apply_visitor(ToGeometryCollection(), feature.geometry);
// https://github.com/mapbox/geojson-vt-cpp/issues/44
if (featureType == FeatureType::Polygon) {
geometry = fixupPolygons(geometry);
}
layer->features.emplace_back(std::make_shared<GeoJSONTileFeature>(
featureType, std::move(geometry), PropertyMap(feature.properties)));
}
}
util::ptr<const GeometryTileLayer> getLayer(const std::string&) const override {
// We're ignoring the layer name because GeoJSON tiles only have one layer.
return layer;
}
};
// Converts the geojsonvt::Tile to a a GeoJSONTile. They have a differing internal structure.
std::unique_ptr<GeoJSONTileData> convertTile(const mapbox::geometry::feature_collection<int16_t>& features) {
auto result = std::make_unique<GeoJSONTileData>();
for (auto& feature : features) {
const FeatureType featureType = apply_visitor(ToFeatureType(), feature.geometry);
if (featureType == FeatureType::Unknown) {
continue;
}
GeometryCollection geometry = apply_visitor(ToGeometryCollection(), feature.geometry);
// https://github.com/mapbox/geojson-vt-cpp/issues/44
if (featureType == FeatureType::Polygon) {
geometry = fixupPolygons(geometry);
}
result->layer->features.emplace_back(std::make_shared<GeoJSONTileFeature>(
featureType, std::move(geometry), PropertyMap(feature.properties)));
}
return result;
}
GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
std::string sourceID_,
const style::UpdateParameters& parameters,
mapbox::geojsonvt::GeoJSONVT& geojsonvt)
const mapbox::geometry::feature_collection<int16_t>& features)
: GeometryTile(overscaledTileID, sourceID_, parameters.style, parameters.mode) {
setData(convertTile(geojsonvt.getTile(id.canonical.z, id.canonical.x, id.canonical.y).features));
}
GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
std::string sourceID_,
const style::UpdateParameters& parameters,
mapbox::supercluster::Supercluster& supercluster)
: GeometryTile(overscaledTileID, sourceID_, parameters.style, parameters.mode) {
setData(convertTile(supercluster.getTile(id.canonical.z, id.canonical.x, id.canonical.y)));
setData(std::make_unique<GeoJSONTileData>(features));
}
void GeoJSONTile::setNecessity(Necessity) {}

View File

@@ -1,18 +1,7 @@
#pragma once
#include <mbgl/tile/geometry_tile.hpp>
namespace mapbox {
namespace geojsonvt {
class GeoJSONVT;
} // namespace geojsonvt
namespace supercluster {
class Supercluster;
} // namespace supercluster
} // namespace mapbox
#include <mbgl/util/feature.hpp>
namespace mbgl {
@@ -25,12 +14,7 @@ public:
GeoJSONTile(const OverscaledTileID&,
std::string sourceID,
const style::UpdateParameters&,
mapbox::geojsonvt::GeoJSONVT&);
GeoJSONTile(const OverscaledTileID&,
std::string sourceID,
const style::UpdateParameters&,
mapbox::supercluster::Supercluster&);
const mapbox::geometry::feature_collection<int16_t>&);
void setNecessity(Necessity) final;
};