Skip to content

Commit 29428dc

Browse files
Add support for parsing MLT-format vector tile sources (#3246)
Co-authored-by: Bart Louwers <[email protected]> Co-authored-by: Bart Louwers <[email protected]>
1 parent 4c31a52 commit 29428dc

File tree

92 files changed

+1134
-286
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+1134
-286
lines changed

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@
100100
[submodule "vendor/filesystem"]
101101
path = vendor/filesystem
102102
url = https://github.com/gulrak/filesystem.git
103+
[submodule "vendor/maplibre-tile-spec"]
104+
path = vendor/maplibre-tile-spec
105+
url = https://github.com/maplibre/maplibre-tile-spec.git
106+
branch = cpp
103107
[submodule "vendor/kdbush.hpp"]
104108
path = vendor/kdbush.hpp
105109
url = https://github.com/mourner/kdbush.hpp.git

BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ cc_library(
144144
"//vendor:eternal",
145145
"//vendor:expected-lite",
146146
"//vendor:maplibre-native-base",
147+
"//vendor/maplibre-tile-spec/cpp:mlt_cpp",
147148
"//vendor:parsedate",
148149
"//vendor:pmtiles",
149150
"//vendor:polylabel",

CMakeLists.txt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,9 @@ list(APPEND INCLUDE_FILES
302302
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/light.hpp
303303
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/position.hpp
304304
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/property_value.hpp
305-
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/raster_dem_options.hpp
306305
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/rotation.hpp
307306
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/source.hpp
307+
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/source_options.hpp
308308
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/tileset.hpp
309309
${PROJECT_SOURCE_DIR}/include/mbgl/style/conversion/transition_options.hpp
310310
${PROJECT_SOURCE_DIR}/include/mbgl/style/expression/assertion.hpp
@@ -676,9 +676,9 @@ list(APPEND SRC_FILES
676676
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/light.cpp
677677
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/position.cpp
678678
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/property_value.cpp
679-
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/raster_dem_options.cpp
680679
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/rotation.cpp
681680
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/source.cpp
681+
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/source_options.cpp
682682
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/stringify.hpp
683683
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/tileset.cpp
684684
${PROJECT_SOURCE_DIR}/src/mbgl/style/conversion/transition_options.cpp
@@ -879,10 +879,15 @@ list(APPEND SRC_FILES
879879
${PROJECT_SOURCE_DIR}/src/mbgl/tile/tile_operation.cpp
880880
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile.cpp
881881
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile.hpp
882-
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile_data.cpp
883-
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_tile_data.hpp
882+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mlt_tile.cpp
883+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mlt_tile.hpp
884+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mlt_tile_data.cpp
885+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mlt_tile_data.hpp
886+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mvt_tile.cpp
887+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mvt_tile.hpp
888+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mvt_tile_data.cpp
889+
${PROJECT_SOURCE_DIR}/src/mbgl/tile/vector_mvt_tile_data.hpp
884890
${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal.cpp
885-
${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal_impl.hpp
886891
${PROJECT_SOURCE_DIR}/src/mbgl/util/action_journal_impl.cpp
887892
${PROJECT_SOURCE_DIR}/src/mbgl/util/camera.cpp
888893
${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.hpp
@@ -1553,6 +1558,7 @@ include(${PROJECT_SOURCE_DIR}/vendor/unordered_dense.cmake)
15531558
include(${PROJECT_SOURCE_DIR}/vendor/vector-tile.cmake)
15541559
include(${PROJECT_SOURCE_DIR}/vendor/wagyu.cmake)
15551560
include(${PROJECT_SOURCE_DIR}/vendor/metal-cpp.cmake)
1561+
include(${PROJECT_SOURCE_DIR}/vendor/maplibre-tile-spec.cmake)
15561562
include(${PROJECT_SOURCE_DIR}/vendor/supercluster.cmake)
15571563
include(${PROJECT_SOURCE_DIR}/vendor/expected-lite.cmake)
15581564
include(${PROJECT_SOURCE_DIR}/vendor/kdbush.cmake)
@@ -1581,6 +1587,7 @@ target_link_libraries(
15811587
mbgl-vendor-unique_resource
15821588
mbgl-vendor-vector-tile
15831589
mbgl-vendor-wagyu
1590+
mlt-cpp
15841591
$<$<BOOL:${MLN_WITH_METAL}>:mbgl-vendor-metal-cpp>
15851592
$<IF:$<BOOL:${MLN_USE_RUST}>,mbgl-rustutils,mbgl-vendor-csscolorparser>
15861593
$<$<BOOL:${MLN_TEXT_SHAPING_HARFBUZZ}>:mbgl-freetype>
@@ -1614,6 +1621,8 @@ set(EXPORT_TARGETS
16141621
mbgl-vendor-boost
16151622
mbgl-vendor-earcut.hpp
16161623
mbgl-vendor-eternal
1624+
mbgl-vendor-filesystem
1625+
mbgl-vendor-metal-cpp
16171626
mbgl-vendor-rapidjson
16181627
mbgl-vendor-parsedate
16191628
mbgl-vendor-pmtiles
@@ -1622,8 +1631,7 @@ set(EXPORT_TARGETS
16221631
mbgl-vendor-unique_resource
16231632
mbgl-vendor-vector-tile
16241633
mbgl-vendor-wagyu
1625-
mbgl-vendor-metal-cpp
1626-
mbgl-vendor-filesystem
1634+
mlt-cpp
16271635
unordered_dense
16281636
)
16291637

bazel/core.bzl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,9 @@ MLN_CORE_SOURCE = [
336336
"src/mbgl/style/conversion/light.cpp",
337337
"src/mbgl/style/conversion/position.cpp",
338338
"src/mbgl/style/conversion/property_value.cpp",
339-
"src/mbgl/style/conversion/raster_dem_options.cpp",
340339
"src/mbgl/style/conversion/rotation.cpp",
341340
"src/mbgl/style/conversion/source.cpp",
341+
"src/mbgl/style/conversion/source_options.cpp",
342342
"src/mbgl/style/conversion/stringify.hpp",
343343
"src/mbgl/style/conversion/tileset.cpp",
344344
"src/mbgl/style/conversion/transition_options.cpp",
@@ -514,8 +514,14 @@ MLN_CORE_SOURCE = [
514514
"src/mbgl/tile/tile_operation.cpp",
515515
"src/mbgl/tile/vector_tile.cpp",
516516
"src/mbgl/tile/vector_tile.hpp",
517-
"src/mbgl/tile/vector_tile_data.cpp",
518-
"src/mbgl/tile/vector_tile_data.hpp",
517+
"src/mbgl/tile/vector_mlt_tile.cpp",
518+
"src/mbgl/tile/vector_mlt_tile.hpp",
519+
"src/mbgl/tile/vector_mlt_tile_data.cpp",
520+
"src/mbgl/tile/vector_mlt_tile_data.hpp",
521+
"src/mbgl/tile/vector_mvt_tile.cpp",
522+
"src/mbgl/tile/vector_mvt_tile.hpp",
523+
"src/mbgl/tile/vector_mvt_tile_data.cpp",
524+
"src/mbgl/tile/vector_mvt_tile_data.hpp",
519525
"src/mbgl/util/action_journal.cpp",
520526
"src/mbgl/util/action_journal_impl.hpp",
521527
"src/mbgl/util/action_journal_impl.cpp",
@@ -696,9 +702,9 @@ MLN_CORE_HEADERS = [
696702
"include/mbgl/style/conversion/light.hpp",
697703
"include/mbgl/style/conversion/position.hpp",
698704
"include/mbgl/style/conversion/property_value.hpp",
699-
"include/mbgl/style/conversion/raster_dem_options.hpp",
700705
"include/mbgl/style/conversion/rotation.hpp",
701706
"include/mbgl/style/conversion/source.hpp",
707+
"include/mbgl/style/conversion/source_options.hpp",
702708
"include/mbgl/style/conversion/tileset.hpp",
703709
"include/mbgl/style/conversion/transition_options.hpp",
704710
"include/mbgl/style/conversion_impl.hpp",

benchmark/parse/vector_tile.benchmark.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <benchmark/benchmark.h>
22

3-
#include <mbgl/tile/vector_tile_data.hpp>
3+
#include <mbgl/tile/vector_mvt_tile_data.hpp>
44
#include <mbgl/util/io.hpp>
55

66
using namespace mbgl;
@@ -11,7 +11,7 @@ static void Parse_VectorTile(benchmark::State& state) {
1111

1212
while (state.KeepRunning()) {
1313
std::size_t length = 0;
14-
VectorTileData tile(data);
14+
VectorMVTTileData tile(data);
1515
for (const auto& name : tile.layerNames()) {
1616
if (auto layer = tile.getLayer(name)) {
1717
const std::size_t count = layer->featureCount();

bin/cache.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
#include <args.hxx>
88
#include <mapbox/io/io.hpp>
99

10-
#include <fstream>
1110
#include <iostream>
1211
#include <memory>
1312
#include <string>
1413
#include <unordered_map>
1514

1615
int main(int argc, char* argv[]) {
17-
args::ArgumentParser p("Mapbox GL cache tool", "");
16+
args::ArgumentParser p("MapLibre cache tool", "");
1817
args::HelpFlag helpFlag(p, "help", "Display this help menu", {'h'});
1918

2019
args::ValueFlag<std::string> urlValue(p, "URL", "Resource URL (required)", {'u'}, args::Options::Required);
@@ -35,7 +34,7 @@ int main(int argc, char* argv[]) {
3534
{"tile", mbgl::Resource::Tile}};
3635

3736
std::string typeHelp("One of the following (required):");
38-
for (auto key : typeMap) {
37+
for (const auto& key : typeMap) {
3938
typeHelp += " " + key.first;
4039
}
4140

@@ -53,18 +52,18 @@ int main(int argc, char* argv[]) {
5352
std::cout << p;
5453
exit(0);
5554
} catch (const args::ParseError& e) {
56-
std::cerr << e.what() << std::endl;
55+
std::cerr << e.what() << '\n';
5756
std::cerr << p;
5857
exit(1);
5958
} catch (const args::ValidationError& e) {
60-
std::cerr << e.what() << std::endl;
59+
std::cerr << e.what() << '\n';
6160
std::cerr << p;
6261
exit(2);
6362
}
6463

6564
auto file = mapbox::base::io::readFile(args::get(dataValue));
6665
if (!file) {
67-
std::cerr << file.error() << std::endl;
66+
std::cerr << file.error() << '\n';
6867
exit(3);
6968
}
7069

@@ -78,15 +77,15 @@ int main(int argc, char* argv[]) {
7877

7978
if (args::get(typeFlag) == mbgl::Resource::Tile) {
8079
if (!xValueFlag || !yValueFlag || !zValueFlag) {
81-
std::cerr << "Error: -x, -y and -z must be provided for tiles" << std::endl;
80+
std::cerr << "Error: -x, -y and -z must be provided for tiles" << '\n';
8281
exit(1);
8382
}
8483

85-
resource.tileData = {{args::get(urlValue),
86-
1,
87-
args::get(xValueFlag),
88-
args::get(yValueFlag),
89-
static_cast<int8_t>(args::get(zValueFlag))}};
84+
resource.tileData = {{.urlTemplate = args::get(urlValue),
85+
.pixelRatio = 1,
86+
.x = args::get(xValueFlag),
87+
.y = args::get(yValueFlag),
88+
.z = static_cast<int8_t>(args::get(zValueFlag))}};
9089
}
9190

9291
mbgl::util::RunLoop loop;

include/mbgl/style/conversion/raster_dem_options.hpp renamed to include/mbgl/style/conversion/source_options.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ namespace style {
88
namespace conversion {
99

1010
template <>
11-
struct Converter<RasterDEMOptions> {
12-
std::optional<RasterDEMOptions> operator()(const Convertible& value, Error& error) const;
11+
struct Converter<SourceOptions> {
12+
std::optional<SourceOptions> operator()(const Convertible& value, Error& error) const;
1313
};
1414

1515
} // namespace conversion

include/mbgl/style/sources/raster_dem_source.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
namespace mbgl {
88
namespace style {
99

10-
struct RasterDEMOptions {
11-
std::optional<Tileset::DEMEncoding> encoding = std::nullopt;
10+
struct SourceOptions {
11+
std::optional<Tileset::RasterEncoding> rasterEncoding = std::nullopt;
12+
std::optional<Tileset::VectorEncoding> vectorEncoding = std::nullopt;
1213
};
1314

1415
// NOTE: Any derived class must invalidate `weakFactory` in the destructor
@@ -17,15 +18,15 @@ class RasterDEMSource final : public RasterSource {
1718
RasterDEMSource(std::string id,
1819
variant<std::string, Tileset> urlOrTileset,
1920
uint16_t tileSize,
20-
std::optional<RasterDEMOptions> options = std::nullopt);
21+
std::optional<SourceOptions> options = std::nullopt);
2122
~RasterDEMSource() override;
2223
bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
2324

2425
protected:
2526
void setTilesetOverrides(Tileset& tileset) override;
2627

2728
private:
28-
std::optional<RasterDEMOptions> options;
29+
std::optional<SourceOptions> options;
2930
};
3031

3132
template <>

include/mbgl/style/sources/vector_source.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class VectorSource final : public TileSource {
1616
VectorSource(std::string id,
1717
variant<std::string, Tileset> urlOrTileset,
1818
std::optional<float> maxZoom = std::nullopt,
19-
std::optional<float> minZoom = std::nullopt);
19+
std::optional<float> minZoom = std::nullopt,
20+
Tileset::VectorEncoding encoding = Tileset::VectorEncoding::Mapbox);
2021

2122
void setTilesetOverrides(Tileset& tileset) override;
2223

@@ -30,11 +31,14 @@ class VectorSource final : public TileSource {
3031

3132
bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
3233

34+
Tileset::VectorEncoding getEncoding() const noexcept { return encoding; }
35+
3336
mapbox::base::WeakPtr<Source> makeWeakPtr() override { return weakFactory.makeWeakPtr(); }
3437

3538
private:
3639
std::optional<float> maxZoom;
3740
std::optional<float> minZoom;
41+
Tileset::VectorEncoding encoding;
3842
mapbox::base::WeakPtrFactory<Source> weakFactory{this}; // Must remain last
3943
};
4044

include/mbgl/util/tileset.hpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,40 @@ class Tileset {
1818
XYZ,
1919
TMS
2020
};
21-
enum class DEMEncoding : bool {
22-
Mapbox,
23-
Terrarium
21+
enum class RasterEncoding : std::uint8_t {
22+
Mapbox, // Mapbox DEM
23+
Terrarium, // Terrarium DEM
24+
};
25+
enum class VectorEncoding : std::uint8_t {
26+
Mapbox, // Mapbox Vector Tiles (MVT)
27+
MLT, // MapLibre Tiles
2428
};
2529

2630
std::vector<std::string> tiles;
2731
Range<uint8_t> zoomRange;
2832
std::string attribution;
2933
Scheme scheme;
30-
// DEMEncoding is not supported by the TileJSON spec
31-
DEMEncoding encoding;
34+
std::optional<RasterEncoding> rasterEncoding;
35+
std::optional<VectorEncoding> vectorEncoding;
3236
std::optional<LatLngBounds> bounds;
3337

3438
Tileset(std::vector<std::string> tiles_ = std::vector<std::string>(),
3539
Range<uint8_t> zoomRange_ = {0, util::DEFAULT_MAX_ZOOM},
3640
std::string attribution_ = {},
3741
Scheme scheme_ = Scheme::XYZ,
38-
DEMEncoding encoding_ = DEMEncoding::Mapbox)
42+
std::optional<RasterEncoding> rasterEncoding_ = std::nullopt,
43+
std::optional<VectorEncoding> encoding_ = std::nullopt)
3944
: tiles(std::move(tiles_)),
4045
zoomRange(zoomRange_),
4146
attribution(std::move(attribution_)),
4247
scheme(scheme_),
43-
encoding(encoding_) {};
48+
rasterEncoding(rasterEncoding_),
49+
vectorEncoding(encoding_) {}
4450

4551
// TileJSON also includes center and zoom but they are not used by mbgl.
4652

47-
friend bool operator==(const Tileset& lhs, const Tileset& rhs) noexcept {
48-
return std::tie(lhs.tiles, lhs.zoomRange, lhs.attribution, lhs.scheme, lhs.bounds) ==
49-
std::tie(rhs.tiles, rhs.zoomRange, rhs.attribution, rhs.scheme, rhs.bounds);
50-
}
51-
52-
friend bool operator!=(const Tileset& lhs, const Tileset& rhs) noexcept { return !(lhs == rhs); }
53+
bool operator==(const Tileset&) const = default;
54+
bool operator!=(const Tileset&) const = default;
5355
};
5456

5557
} // namespace mbgl

0 commit comments

Comments
 (0)