summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobrun Van Nuland <tobrun.van.nuland@gmail.com>2017-09-14 14:03:58 +0200
committerTobrun <tobrun.van.nuland@gmail.com>2017-09-14 15:39:09 +0200
commit7702e877b2a61af33354a66d337448ef0f81b8b4 (patch)
tree37cd55170718f6001567d395c37da23ba3f55879
parenta22825e2c31286a11881880881edb86adc249be1 (diff)
downloadqtlocation-mapboxgl-upstream/9605-geometry-conversion-optional-query.tar.gz
-rw-r--r--include/mbgl/renderer/query.hpp2
-rw-r--r--src/mbgl/geometry/feature_index.cpp7
-rw-r--r--src/mbgl/tile/geometry_tile_data.cpp46
-rw-r--r--src/mbgl/tile/geometry_tile_data.hpp8
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.