diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-06 17:34:52 -0700 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-06-10 12:42:14 +0200 |
commit | 91ddcbce20b69ae4b5615723670fe0f310a528e3 (patch) | |
tree | 8dd64ba7dffce47bb76ee4f326ecfa9a8a59c2f3 | |
parent | d62baffb1b73b0dd135c253e0a52565fcc33f2ec (diff) | |
download | qtlocation-mapboxgl-91ddcbce20b69ae4b5615723670fe0f310a528e3.tar.gz |
[core] Merge GeoJSONTileSource into GeoJSONTileData
-rw-r--r-- | src/mbgl/tile/geojson_tile_data.cpp | 75 | ||||
-rw-r--r-- | src/mbgl/tile/geojson_tile_data.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/tile/geojson_tile_source.cpp | 99 | ||||
-rw-r--r-- | src/mbgl/tile/geojson_tile_source.hpp | 34 |
4 files changed, 70 insertions, 143 deletions
diff --git a/src/mbgl/tile/geojson_tile_data.cpp b/src/mbgl/tile/geojson_tile_data.cpp index fb0cd13f35..fb68a158f8 100644 --- a/src/mbgl/tile/geojson_tile_data.cpp +++ b/src/mbgl/tile/geojson_tile_data.cpp @@ -1,21 +1,86 @@ #include <mbgl/tile/geojson_tile_data.hpp> -#include <mbgl/tile/geojson_tile_source.hpp> +#include <mbgl/tile/geojson_tile.hpp> #include <mbgl/style/update_parameters.hpp> +#include <mapbox/geojsonvt.hpp> + namespace mbgl { +// Converts the geojsonvt::Tile to a a GeoJSONTile. They have a differing internal structure. +std::unique_ptr<GeoJSONTile> convertTile(const mapbox::geojsonvt::Tile& tile) { + std::shared_ptr<GeoJSONTileLayer> layer; + + if (tile) { + std::vector<std::shared_ptr<const GeoJSONTileFeature>> features; + GeometryCoordinates line; + + for (auto& feature : tile.features) { + const FeatureType featureType = + (feature.type == mapbox::geojsonvt::TileFeatureType::Point + ? FeatureType::Point + : (feature.type == mapbox::geojsonvt::TileFeatureType::LineString + ? FeatureType::LineString + : (feature.type == mapbox::geojsonvt::TileFeatureType::Polygon + ? FeatureType::Polygon + : FeatureType::Unknown))); + if (featureType == FeatureType::Unknown) { + continue; + } + + GeometryCollection geometry; + + // Flatten the geometry; GeoJSONVT distinguishes between a Points array and Rings array + // (Points = GeoJSON types Point, MultiPoint, LineString) + // (Rings = GeoJSON types MultiLineString, Polygon, MultiPolygon) + // However, in Mapbox GL, we use one structure for both types, and just have one outer + // element for Points. + if (feature.tileGeometry.is<mapbox::geojsonvt::TilePoints>()) { + line.clear(); + for (auto& point : feature.tileGeometry.get<mapbox::geojsonvt::TilePoints>()) { + line.emplace_back(point.x, point.y); + } + geometry.emplace_back(std::move(line)); + } else if (feature.tileGeometry.is<mapbox::geojsonvt::TileRings>()) { + for (auto& ring : feature.tileGeometry.get<mapbox::geojsonvt::TileRings>()) { + line.clear(); + for (auto& point : ring) { + line.emplace_back(point.x, point.y); + } + geometry.emplace_back(std::move(line)); + } + } + + // https://github.com/mapbox/geojson-vt-cpp/issues/44 + if (featureType == FeatureType::Polygon) { + geometry = fixupPolygons(geometry); + } + + Feature::property_map properties{ feature.tags.begin(), feature.tags.end() }; + + features.emplace_back(std::make_shared<GeoJSONTileFeature>( + featureType, std::move(geometry), std::move(properties))); + } + + layer = std::make_unique<GeoJSONTileLayer>(std::move(features)); + } + + return std::make_unique<GeoJSONTile>(layer); +} + GeoJSONTileData::GeoJSONTileData(const OverscaledTileID& overscaledTileID, std::string sourceID, const style::UpdateParameters& parameters, mapbox::geojsonvt::GeoJSONVT* geojsonvt) : GeometryTileData(overscaledTileID, sourceID, parameters.style, parameters.mode) { - tileSource = std::make_unique<GeoJSONTileSource>(*this, geojsonvt, overscaledTileID); + if (geojsonvt) { + auto tile = convertTile( + geojsonvt->getTile(id.canonical.z, id.canonical.x, id.canonical.y)); + setData(std::move(tile), {}, {}); + } } GeoJSONTileData::~GeoJSONTileData() = default; -void GeoJSONTileData::setNecessity(Necessity necessity) { - tileSource->setNecessity(static_cast<TileSource::Necessity>(necessity)); -} +void GeoJSONTileData::setNecessity(Necessity) {} } // namespace mbgl diff --git a/src/mbgl/tile/geojson_tile_data.hpp b/src/mbgl/tile/geojson_tile_data.hpp index 2110b4b9c8..613ef2d962 100644 --- a/src/mbgl/tile/geojson_tile_data.hpp +++ b/src/mbgl/tile/geojson_tile_data.hpp @@ -10,8 +10,6 @@ class GeoJSONVT; namespace mbgl { -class TileSource; - namespace style { class UpdateParameters; } @@ -25,9 +23,6 @@ public: ~GeoJSONTileData(); void setNecessity(Necessity) final; - -private: - std::unique_ptr<TileSource> tileSource; }; } // namespace mbgl diff --git a/src/mbgl/tile/geojson_tile_source.cpp b/src/mbgl/tile/geojson_tile_source.cpp deleted file mode 100644 index fb526fd9fb..0000000000 --- a/src/mbgl/tile/geojson_tile_source.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include <mbgl/tile/geojson_tile_source.hpp> -#include <mbgl/tile/geojson_tile.hpp> -#include <mbgl/tile/geometry_tile_data.hpp> - -#include <mbgl/util/async_request.hpp> - -#include <mapbox/geojsonvt.hpp> - -namespace mbgl { - -GeoJSONTileSource::GeoJSONTileSource(GeometryTileData& tileData_, - mapbox::geojsonvt::GeoJSONVT* geojsonvt_, - const OverscaledTileID& id) - : GeometryTileSource(tileData_), tileID(id), geojsonvt(geojsonvt_) { - update(); -} - -GeoJSONTileSource::~GeoJSONTileSource() = default; - -// A monitor can have its GeoJSONVT object swapped out (e.g. when loading a new GeoJSON file). -// In that case, we're sending new notifications to all observers. -void GeoJSONTileSource::setGeoJSONVT(mapbox::geojsonvt::GeoJSONVT* vt) { - // Don't duplicate notifications in case of nil changes. - if (geojsonvt != vt) { - geojsonvt = vt; - update(); - } -} - -// Converts the geojsonvt::Tile to a a GeoJSONTile. They have a differing internal structure. -std::unique_ptr<GeoJSONTile> convertTile(const mapbox::geojsonvt::Tile& tile) { - std::shared_ptr<GeoJSONTileLayer> layer; - - if (tile) { - std::vector<std::shared_ptr<const GeoJSONTileFeature>> features; - GeometryCoordinates line; - - for (auto& feature : tile.features) { - const FeatureType featureType = - (feature.type == mapbox::geojsonvt::TileFeatureType::Point - ? FeatureType::Point - : (feature.type == mapbox::geojsonvt::TileFeatureType::LineString - ? FeatureType::LineString - : (feature.type == mapbox::geojsonvt::TileFeatureType::Polygon - ? FeatureType::Polygon - : FeatureType::Unknown))); - if (featureType == FeatureType::Unknown) { - continue; - } - - GeometryCollection geometry; - - // Flatten the geometry; GeoJSONVT distinguishes between a Points array and Rings array - // (Points = GeoJSON types Point, MultiPoint, LineString) - // (Rings = GeoJSON types MultiLineString, Polygon, MultiPolygon) - // However, in Mapbox GL, we use one structure for both types, and just have one outer - // element for Points. - if (feature.tileGeometry.is<mapbox::geojsonvt::TilePoints>()) { - line.clear(); - for (auto& point : feature.tileGeometry.get<mapbox::geojsonvt::TilePoints>()) { - line.emplace_back(point.x, point.y); - } - geometry.emplace_back(std::move(line)); - } else if (feature.tileGeometry.is<mapbox::geojsonvt::TileRings>()) { - for (auto& ring : feature.tileGeometry.get<mapbox::geojsonvt::TileRings>()) { - line.clear(); - for (auto& point : ring) { - line.emplace_back(point.x, point.y); - } - geometry.emplace_back(std::move(line)); - } - } - - // https://github.com/mapbox/geojson-vt-cpp/issues/44 - if (featureType == FeatureType::Polygon) { - geometry = fixupPolygons(geometry); - } - - Feature::property_map properties{ feature.tags.begin(), feature.tags.end() }; - - features.emplace_back(std::make_shared<GeoJSONTileFeature>( - featureType, std::move(geometry), std::move(properties))); - } - - layer = std::make_unique<GeoJSONTileLayer>(std::move(features)); - } - - return std::make_unique<GeoJSONTile>(layer); -} - -void GeoJSONTileSource::update() { - if (geojsonvt) { - auto tile = convertTile( - geojsonvt->getTile(tileID.canonical.z, tileID.canonical.x, tileID.canonical.y)); - tileData.setData(std::move(tile), {}, {}); - } -} - -} // namespace mbgl diff --git a/src/mbgl/tile/geojson_tile_source.hpp b/src/mbgl/tile/geojson_tile_source.hpp deleted file mode 100644 index faae757eb4..0000000000 --- a/src/mbgl/tile/geojson_tile_source.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include <mbgl/tile/tile_source.hpp> -#include <mbgl/tile/geometry_tile.hpp> -#include <mbgl/tile/tile_id.hpp> - -#include <unordered_map> - -namespace mapbox { -namespace geojsonvt { -class GeoJSONVT; -} // namespace geojsonvt -} // namespace mapbox - -namespace mbgl { - -class GeoJSONTileSource final : public GeometryTileSource { -public: - GeoJSONTileSource(GeometryTileData&, mapbox::geojsonvt::GeoJSONVT*, const OverscaledTileID&); - virtual ~GeoJSONTileSource(); - - void setGeoJSONVT(mapbox::geojsonvt::GeoJSONVT*); - -private: - void update(); - -public: - const OverscaledTileID tileID; - -private: - mapbox::geojsonvt::GeoJSONVT* geojsonvt = nullptr; -}; - -} // namespace mbgl |