@@ -11,23 +11,25 @@ namespace mbgl {
11
11
12
12
VectorMLTTileFeature::VectorMLTTileFeature (std::shared_ptr<const MapLibreTile> tile_,
13
13
const mlt::Feature& feature_,
14
- std::uint32_t extent_)
14
+ std::uint32_t extent_,
15
+ int version_)
15
16
: tile(std::move(tile_)),
16
17
feature (feature_),
17
- extent(extent_) {}
18
+ extent(extent_),
19
+ version(version_) {}
18
20
19
21
FeatureType VectorMLTTileFeature::getType () const {
20
22
using mlt::metadata::tileset::GeometryType;
21
23
switch (feature.getGeometry ().type ) {
22
24
case GeometryType::POINT:
23
25
return FeatureType::Point ;
26
+ case GeometryType::MULTIPOINT:
27
+ case GeometryType::MULTILINESTRING:
24
28
case GeometryType::LINESTRING:
25
29
return FeatureType::LineString;
26
30
case GeometryType::POLYGON:
27
- return FeatureType::Polygon;
28
- case GeometryType::MULTIPOINT:
29
- case GeometryType::MULTILINESTRING:
30
31
case GeometryType::MULTIPOLYGON:
32
+ return FeatureType::Polygon;
31
33
default :
32
34
return FeatureType::Unknown;
33
35
}
@@ -98,30 +100,48 @@ const GeometryCollection& VectorMLTTileFeature::getGeometries() const {
98
100
const PointConverter convert{scale};
99
101
switch (geometry.type ) {
100
102
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 ())}};
103
105
break ;
104
106
}
107
+ case GeometryType::MULTIPOINT:
105
108
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 ())};
108
111
break ;
109
112
}
110
113
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
+ }
115
137
break ;
116
138
}
117
- case GeometryType::MULTIPOINT:
118
- case GeometryType::MULTILINESTRING:
119
- case GeometryType::MULTIPOLYGON:
120
139
default :
121
- lines = GeometryCollection{} ;
140
+ lines. emplace () ;
122
141
break ;
123
142
}
124
- // if (feature.getVersion() < 2 && feature.getType() == mapbox::vector_tile::GeomType::POLYGON) {
143
+ // unnecessary for MLT?
144
+ // if (version < 2 && geometry.type == GeometryType::POLYGON) {
125
145
// lines = fixupPolygons(*lines);
126
146
// }
127
147
}
@@ -137,7 +157,8 @@ std::size_t VectorMLTTileLayer::featureCount() const {
137
157
}
138
158
139
159
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 ());
141
162
}
142
163
143
164
std::string VectorMLTTileLayer::getName () const {
0 commit comments