#include #include #include #include namespace mbgl { namespace style { namespace expression { class GeoJSONFeature : public GeometryTileFeature { public: const Feature& feature; mutable optional geometry; GeoJSONFeature(const Feature& feature_) : feature(feature_) {} GeoJSONFeature(const Feature& feature_, const CanonicalTileID& canonical) : feature(feature_) { geometry = convertGeometry(feature.geometry, canonical); // https://github.com/mapbox/geojson-vt-cpp/issues/44 if (getType() == FeatureType::Polygon) { geometry = fixupPolygons(*geometry); } } 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; } optional getValue(const std::string& key) const override { auto it = feature.properties.find(key); if (it != feature.properties.end()) { return optional(it->second); } return optional(); } const GeometryCollection& getGeometries() const override { if (geometry) return *geometry; geometry = GeometryCollection(); return *geometry; } }; EvaluationResult Expression::evaluate(optional zoom, const Feature& feature, optional colorRampParameter) const { GeoJSONFeature f(feature); return this->evaluate(EvaluationContext(std::move(zoom), &f, std::move(colorRampParameter))); } EvaluationResult Expression::evaluate(optional zoom, const Feature& feature, optional colorRampParameter, const std::set& availableImages) const { GeoJSONFeature f(feature); return this->evaluate( EvaluationContext(std::move(zoom), &f, std::move(colorRampParameter)).withAvailableImages(&availableImages)); } EvaluationResult Expression::evaluate(optional zoom, const Feature& feature, optional colorRampParameter, const std::set& availableImages, const CanonicalTileID& canonical) const { GeoJSONFeature f(feature, canonical); return this->evaluate(EvaluationContext(std::move(zoom), &f, std::move(colorRampParameter)) .withAvailableImages(&availableImages) .withCanonicalTileID(&canonical)); } EvaluationResult Expression::evaluate(optional accumulated, const Feature& feature) const { GeoJSONFeature f(feature); return this->evaluate(EvaluationContext(std::move(accumulated), &f)); } } // namespace expression } // namespace style } // namespace mbgl