diff options
-rw-r--r-- | src/mbgl/tile/geojson_tile.cpp | 133 |
1 files changed, 52 insertions, 81 deletions
diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp index 09c12dff8f..a510b74dad 100644 --- a/src/mbgl/tile/geojson_tile.cpp +++ b/src/mbgl/tile/geojson_tile.cpp @@ -12,11 +12,29 @@ namespace mbgl { class GeoJSONTileFeature : public GeometryTileFeature { public: - GeoJSONTileFeature(FeatureType, GeometryCollection&&, PropertyMap&&); - FeatureType getType() const override; - optional<Value> getValue(const std::string&) const override; - PropertyMap getProperties() const override { return properties; } - GeometryCollection getGeometries() const override; + GeoJSONTileFeature(FeatureType type_, GeometryCollection&& geometries_, PropertyMap&& properties_) + : type(type_), geometries(std::move(geometries_)), properties(std::move(properties_)) { + } + + FeatureType getType() const override { + return type; + } + + PropertyMap getProperties() const override { + return properties; + } + + GeometryCollection getGeometries() const override { + return geometries; + } + + optional<Value> getValue(const std::string& key) const override { + auto it = properties.find(key); + if (it != properties.end()) { + return optional<Value>(it->second); + } + return optional<Value>(); + } private: const FeatureType type; @@ -26,60 +44,54 @@ private: class GeoJSONTileLayer : public GeometryTileLayer { public: - using Features = std::vector<std::shared_ptr<const GeoJSONTileFeature>>; + std::vector<std::shared_ptr<const GeoJSONTileFeature>> features; - GeoJSONTileLayer(Features&&); - std::size_t featureCount() const override; - util::ptr<const GeometryTileFeature> getFeature(std::size_t) const override; - std::string getName() const override { return ""; }; + std::string getName() const override { + return ""; + } -private: - const Features features; + std::size_t featureCount() const override { + return features.size(); + } + + util::ptr<const GeometryTileFeature> getFeature(std::size_t i) const override { + return features[i]; + } }; class GeoJSONTileData : public GeometryTileData { public: - GeoJSONTileData(std::shared_ptr<GeoJSONTileLayer>); - util::ptr<const GeometryTileLayer> getLayer(const std::string&) const override; + std::shared_ptr<GeoJSONTileLayer> layer = std::make_shared<GeoJSONTileLayer>(); -private: - const std::shared_ptr<GeoJSONTileLayer> layer; + 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) { - std::shared_ptr<GeoJSONTileLayer> layer; - - if (!features.empty()) { - std::vector<std::shared_ptr<const GeoJSONTileFeature>> convertedFeatures; - - ToFeatureType toFeatureType; - ToGeometryCollection toGeometryCollection; - - for (auto& feature : features) { - const FeatureType featureType = apply_visitor(toFeatureType, feature.geometry); - - if (featureType == FeatureType::Unknown) { - continue; - } + auto result = std::make_unique<GeoJSONTileData>(); - GeometryCollection geometry = apply_visitor(toGeometryCollection, feature.geometry); + for (auto& feature : features) { + const FeatureType featureType = apply_visitor(ToFeatureType(), feature.geometry); - // https://github.com/mapbox/geojson-vt-cpp/issues/44 - if (featureType == FeatureType::Polygon) { - geometry = fixupPolygons(geometry); - } + if (featureType == FeatureType::Unknown) { + continue; + } - PropertyMap properties = feature.properties; + GeometryCollection geometry = apply_visitor(ToGeometryCollection(), feature.geometry); - convertedFeatures.emplace_back(std::make_shared<GeoJSONTileFeature>( - featureType, std::move(geometry), std::move(properties))); + // https://github.com/mapbox/geojson-vt-cpp/issues/44 + if (featureType == FeatureType::Polygon) { + geometry = fixupPolygons(geometry); } - layer = std::make_unique<GeoJSONTileLayer>(std::move(convertedFeatures)); + result->layer->features.emplace_back(std::make_shared<GeoJSONTileFeature>( + featureType, std::move(geometry), PropertyMap(feature.properties))); } - return std::make_unique<GeoJSONTileData>(layer); + return result; } GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID, @@ -100,45 +112,4 @@ GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID, void GeoJSONTile::setNecessity(Necessity) {} -GeoJSONTileFeature::GeoJSONTileFeature(FeatureType type_, - GeometryCollection&& geometries_, - PropertyMap&& properties_) - : type(type_), geometries(std::move(geometries_)), properties(std::move(properties_)) { -} - -FeatureType GeoJSONTileFeature::getType() const { - return type; -} - -optional<Value> GeoJSONTileFeature::getValue(const std::string& key) const { - auto it = properties.find(key); - if (it != properties.end()) { - return optional<Value>(it->second); - } - return optional<Value>(); -} - -GeometryCollection GeoJSONTileFeature::getGeometries() const { - return geometries; -} - -GeoJSONTileLayer::GeoJSONTileLayer(Features&& features_) : features(std::move(features_)) { -} - -std::size_t GeoJSONTileLayer::featureCount() const { - return features.size(); -} - -util::ptr<const GeometryTileFeature> GeoJSONTileLayer::getFeature(std::size_t i) const { - return features[i]; -} - -GeoJSONTileData::GeoJSONTileData(std::shared_ptr<GeoJSONTileLayer> layer_) : layer(std::move(layer_)) { -} - -util::ptr<const GeometryTileLayer> GeoJSONTileData::getLayer(const std::string&) const { - // We're ignoring the layer name because GeoJSON tiles only have one layer. - return layer; -} - } // namespace mbgl |