summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geometry_tile_data.cpp46
-rw-r--r--src/mbgl/tile/geometry_tile_data.hpp8
2 files changed, 42 insertions, 12 deletions
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.