Skip to content

Commit cb2be68

Browse files
committed
handle multi-polygon
1 parent 8755223 commit cb2be68

File tree

2 files changed

+42
-20
lines changed

2 files changed

+42
-20
lines changed

src/mbgl/tile/vector_mlt_tile_data.cpp

+40-19
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,25 @@ namespace mbgl {
1111

1212
VectorMLTTileFeature::VectorMLTTileFeature(std::shared_ptr<const MapLibreTile> tile_,
1313
const mlt::Feature& feature_,
14-
std::uint32_t extent_)
14+
std::uint32_t extent_,
15+
int version_)
1516
: tile(std::move(tile_)),
1617
feature(feature_),
17-
extent(extent_) {}
18+
extent(extent_),
19+
version(version_) {}
1820

1921
FeatureType VectorMLTTileFeature::getType() const {
2022
using mlt::metadata::tileset::GeometryType;
2123
switch (feature.getGeometry().type) {
2224
case GeometryType::POINT:
2325
return FeatureType::Point;
26+
case GeometryType::MULTIPOINT:
27+
case GeometryType::MULTILINESTRING:
2428
case GeometryType::LINESTRING:
2529
return FeatureType::LineString;
2630
case GeometryType::POLYGON:
27-
return FeatureType::Polygon;
28-
case GeometryType::MULTIPOINT:
29-
case GeometryType::MULTILINESTRING:
3031
case GeometryType::MULTIPOLYGON:
32+
return FeatureType::Polygon;
3133
default:
3234
return FeatureType::Unknown;
3335
}
@@ -98,30 +100,48 @@ const GeometryCollection& VectorMLTTileFeature::getGeometries() const {
98100
const PointConverter convert{scale};
99101
switch (geometry.type) {
100102
case GeometryType::POINT: {
101-
const auto& point = static_cast<const mlt::Point&>(geometry);
102-
lines = GeometryCollection{{convert(point.getCoordinate())}};
103+
const auto& geom = static_cast<const mlt::Point&>(geometry);
104+
lines = GeometryCollection{{convert(geom.getCoordinate())}};
103105
break;
104106
}
107+
case GeometryType::MULTIPOINT:
105108
case GeometryType::LINESTRING: {
106-
const auto& lineString = static_cast<const mlt::LineString&>(geometry);
107-
lines = GeometryCollection{convert(lineString.getCoordinates())};
109+
const auto& geom = static_cast<const mlt::MultiPoint&>(geometry);
110+
lines = GeometryCollection{convert(geom.getCoordinates())};
108111
break;
109112
}
110113
case GeometryType::POLYGON: {
111-
const auto& poly = static_cast<const mlt::Polygon&>(geometry);
112-
lines.emplace(poly.getRings().size() + 1);
113-
lines->front() = convert(poly.getShell());
114-
std::ranges::transform(poly.getRings(), std::next(lines->begin()), convert);
114+
const auto& geom = static_cast<const mlt::Polygon&>(geometry);
115+
lines.emplace(geom.getRings().size() + 1);
116+
lines->front() = convert(geom.getShell());
117+
std::ranges::transform(geom.getRings(), std::next(lines->begin()), convert);
118+
break;
119+
}
120+
case GeometryType::MULTILINESTRING: {
121+
const auto& geom = static_cast<const mlt::MultiLineString&>(geometry);
122+
lines.emplace(geom.getLineStrings().size());
123+
std::ranges::transform(geom.getLineStrings(), lines->begin(), convert);
124+
break;
125+
}
126+
case GeometryType::MULTIPOLYGON: {
127+
const auto& geom = static_cast<const mlt::MultiPolygon&>(geometry);
128+
const auto& polys = geom.getPolygons();
129+
lines.emplace();
130+
lines->reserve(std::accumulate(polys.begin(), polys.end(), 0, [](const auto sum, const auto& pair) {
131+
return sum + 1 + pair.second.size();
132+
}));
133+
for (const auto& [shell, rings] : polys) {
134+
lines->push_back(convert(shell));
135+
std::ranges::transform(rings, std::back_inserter(*lines), convert);
136+
}
115137
break;
116138
}
117-
case GeometryType::MULTIPOINT:
118-
case GeometryType::MULTILINESTRING:
119-
case GeometryType::MULTIPOLYGON:
120139
default:
121-
lines = GeometryCollection{};
140+
lines.emplace();
122141
break;
123142
}
124-
// if (feature.getVersion() < 2 && feature.getType() == mapbox::vector_tile::GeomType::POLYGON) {
143+
// unnecessary for MLT?
144+
// if (version < 2 && geometry.type == GeometryType::POLYGON) {
125145
// lines = fixupPolygons(*lines);
126146
// }
127147
}
@@ -137,7 +157,8 @@ std::size_t VectorMLTTileLayer::featureCount() const {
137157
}
138158

139159
std::unique_ptr<GeometryTileFeature> VectorMLTTileLayer::getFeature(std::size_t i) const {
140-
return std::make_unique<VectorMLTTileFeature>(tile, layer.getFeatures().at(i), layer.getExtent());
160+
return std::make_unique<VectorMLTTileFeature>(
161+
tile, layer.getFeatures().at(i), layer.getExtent(), layer.getVersion());
141162
}
142163

143164
std::string VectorMLTTileLayer::getName() const {

src/mbgl/tile/vector_mlt_tile_data.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using MapLibreTile = mlt::MapLibreTile;
1818

1919
class VectorMLTTileFeature : public GeometryTileFeature {
2020
public:
21-
VectorMLTTileFeature(std::shared_ptr<const MapLibreTile>, const mlt::Feature&, std::uint32_t extent);
21+
VectorMLTTileFeature(std::shared_ptr<const MapLibreTile>, const mlt::Feature&, std::uint32_t extent, int version);
2222

2323
FeatureType getType() const override;
2424
std::optional<Value> getValue(const std::string& key) const override;
@@ -30,6 +30,7 @@ class VectorMLTTileFeature : public GeometryTileFeature {
3030
const std::shared_ptr<const MapLibreTile> tile;
3131
const mlt::Feature& feature;
3232
const std::uint32_t extent;
33+
const int version;
3334
mutable std::optional<GeometryCollection> lines;
3435
mutable std::optional<PropertyMap> properties;
3536
};

0 commit comments

Comments
 (0)