#include namespace mbgl { // Implements a simple in-memory Tile type that holds GeoJSON values. A GeoJSON tile can only have // one layer, and it is always returned regardless of which layer is requested. class GeoJSONTileFeature : public GeometryTileFeature { public: const mapbox::feature::feature& feature; GeoJSONTileFeature(const mapbox::feature::feature& feature_) : feature(feature_) { } FeatureType getType() const override { return apply_visitor(ToFeatureType(), feature.geometry); } const PropertyMap& getProperties() const override { return feature.properties; } FeatureIdentifier getID() const override { return feature.id; } GeometryCollection getGeometries() const override { GeometryCollection geometry = apply_visitor(ToGeometryCollection(), feature.geometry); // https://github.com/mapbox/geojson-vt-cpp/issues/44 if (getType() == FeatureType::Polygon) { geometry = fixupPolygons(geometry); } return geometry; } Value getValue(const std::string& key) const override { return feature.properties.count(key) ? feature.properties.at(key) : NullValue(); } }; class GeoJSONTileLayer : public GeometryTileLayer { public: GeoJSONTileLayer(std::shared_ptr> features_) : features(std::move(features_)) { } std::size_t featureCount() const override { return features->size(); } std::unique_ptr getFeature(std::size_t i) const override { return std::make_unique((*features)[i]); } std::string getName() const override { return ""; } private: std::shared_ptr> features; }; class GeoJSONTileData : public GeometryTileData { public: GeoJSONTileData(mapbox::feature::feature_collection features_) : features(std::make_shared>( std::move(features_))) { } GeoJSONTileData(std::shared_ptr> features_) : features(std::move(features_)) { } std::unique_ptr clone() const override { return std::make_unique(features); } std::unique_ptr getLayer(const std::string&) const override { return std::make_unique(features); } private: std::shared_ptr> features; }; } // namespace mbgl