diff options
author | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2017-09-14 14:03:58 +0200 |
---|---|---|
committer | Tobrun <tobrun.van.nuland@gmail.com> | 2017-09-14 15:39:09 +0200 |
commit | 7702e877b2a61af33354a66d337448ef0f81b8b4 (patch) | |
tree | 37cd55170718f6001567d395c37da23ba3f55879 | |
parent | a22825e2c31286a11881880881edb86adc249be1 (diff) | |
download | qtlocation-mapboxgl-upstream/9605-geometry-conversion-optional-query.tar.gz |
-rw-r--r-- | include/mbgl/renderer/query.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/geometry/feature_index.cpp | 7 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_data.cpp | 46 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_data.hpp | 8 |
4 files changed, 45 insertions, 18 deletions
diff --git a/include/mbgl/renderer/query.hpp b/include/mbgl/renderer/query.hpp index 74df1a8f57..fdbcd6bbdf 100644 --- a/include/mbgl/renderer/query.hpp +++ b/include/mbgl/renderer/query.hpp @@ -18,7 +18,7 @@ public: optional<bool> geometryConversion_ = true) : layerIDs(std::move(layerIDs_)), filter(std::move(filter_)), - geometryConversion(geometryConversion_) {} + geometryConversion(std::move(geometryConversion_)) {} /** layerIDs to include in the query */ optional<std::vector<std::string>> layerIDs; diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index d97706d345..4006382c58 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -131,11 +131,8 @@ void FeatureIndex::addFeature( continue; } - if (!options.geometryConversion || options.geometryConversion.value()){ - result[layerID].push_back(convertFeature(*geometryTileFeature, tileID)); - } else { - result[layerID].push_back(convertFeatureProperties(*geometryTileFeature)); - } + bool isConvertGeometry = options.geometryConversion.value_or(true); + result[layerID].push_back(convertFeature(*geometryTileFeature, tileID, isConvertGeometry)); } } diff --git a/src/mbgl/tile/geometry_tile_data.cpp b/src/mbgl/tile/geometry_tile_data.cpp index 91407ac1a8..bb3efeddca 100644 --- a/src/mbgl/tile/geometry_tile_data.cpp +++ b/src/mbgl/tile/geometry_tile_data.cpp @@ -173,15 +173,47 @@ static Feature::geometry_type convertGeometry(const GeometryTileFeature& geometr return Point<double>(); } -Feature convertFeature(const GeometryTileFeature& geometryTileFeature, const CanonicalTileID& tileID) { - Feature feature { convertGeometry(geometryTileFeature, tileID) }; - feature.properties = geometryTileFeature.getProperties(); - feature.id = geometryTileFeature.getID(); - return feature; +static Feature::geometry_type convertGeometryType(const GeometryTileFeature& geometryTileFeature) { + GeometryCollection geometries = geometryTileFeature.getGeometries(); + + switch (geometryTileFeature.getType()) { + case FeatureType::Unknown: { + assert(false); + return Point<double>(NAN, NAN); + } + + case FeatureType::Point: { + if(geometries.at(0).size() == 1){ + return Point<double>(); + } else { + return MultiPoint<double>(); + } + } + + case FeatureType::LineString: { + if(geometries.size() == 1){ + return LineString<double>(); + } else { + return MultiLineString<double>(); + } + } + + case FeatureType::Polygon: { + if (geometries.size() == 1) { + return Polygon<double>(); + } else { + return MultiPolygon<double>(); + } + } + } + + // Unreachable, but placate GCC. + return Point<double>(); } -Feature convertFeatureProperties(const GeometryTileFeature& geometryTileFeature) { - Feature feature { Point<double>() }; + +Feature convertFeature(const GeometryTileFeature& geometryTileFeature, const CanonicalTileID& tileID, bool isConvertGeometry) { + Feature feature { isConvertGeometry ? convertGeometry(geometryTileFeature, tileID) : convertGeometryType(geometryTileFeature)}; feature.properties = geometryTileFeature.getProperties(); feature.id = geometryTileFeature.getID(); return feature; diff --git a/src/mbgl/tile/geometry_tile_data.hpp b/src/mbgl/tile/geometry_tile_data.hpp index 5677db2b16..9673c35c74 100644 --- a/src/mbgl/tile/geometry_tile_data.hpp +++ b/src/mbgl/tile/geometry_tile_data.hpp @@ -75,11 +75,9 @@ std::vector<GeometryCollection> classifyRings(const GeometryCollection&); // Truncate polygon to the largest `maxHoles` inner rings by area. void limitHoles(GeometryCollection&, uint32_t maxHoles); -// convert from GeometryTileFeature to Feature (eventually we should eliminate GeometryTileFeature) -Feature convertFeature(const GeometryTileFeature&, const CanonicalTileID&); - -// convert from GeometryTileFeature to Feature without geometry (eventually we should eliminate GeometryTileFeature) -Feature convertFeatureProperties(const GeometryTileFeature&); +// convert from GeometryTileFeature to Feature with optional geometry conversion +// (eventually we should eliminate GeometryTileFeature) +Feature convertFeature(const GeometryTileFeature&, const CanonicalTileID&, const bool = true); // Fix up possibly-non-V2-compliant polygon geometry using angus clipper. // The result is guaranteed to have correctly wound, strictly simple rings. |