Skip to content

Commit 0fbe887

Browse files
authored
Merge pull request #76 from unvt/main
Release 2026-01-17 11:57:37 UTC
2 parents 5808fa8 + 67d17f9 commit 0fbe887

File tree

11 files changed

+68
-4
lines changed

11 files changed

+68
-4
lines changed

CHANGELOG.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,28 @@ The format is based on Keep a Changelog and adheres to Semantic Versioning.
99
## [Unreleased]
1010

1111
### Added
12-
- Add `--unknown-filter` mode to control handling of unsupported style expressions during optimize.
12+
- TBD_UNVT_CHANGELOG_ADDED
1313

1414
### Changed
15-
- Remove unsupported `--style-mode none` option.
15+
- TBD_UNVT_CHANGELOG_CHANGED
1616

1717
### Fixed
1818
- TBD_UNVT_CHANGELOG_FIXED
1919

2020
### Security
2121
- TBD_UNVT_CHANGELOG_SECURITY
2222

23+
## [0.4.6] - 2026-01-17
24+
### Added
25+
- Count tiles over `--max-tile-bytes` in inspect outputs for MBTiles/PMTiles.
26+
27+
## [0.4.5] - 2026-01-17
28+
### Added
29+
- Add `--unknown-filter` mode to control handling of unsupported style expressions during optimize.
30+
31+
### Changed
32+
- Remove unsupported `--style-mode none` option.
33+
2334
## [0.4.4] - 2026-01-15
2435
### Added
2536
- Add tile size to tile summary output ("Size of tile").

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "vt-optimizer-rs"
3-
version = "0.4.5"
3+
version = "0.4.6"
44
edition = "2024"
55
license = "MIT"
66
description = "A fast CLI to inspect and optimize MBTiles/PMTiles vector tiles."

src/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,12 @@ fn run_inspect(args: vt_optimizer::cli::InspectArgs) -> Result<()> {
445445
"{}",
446446
format_summary_label("Max tile size", format_bytes(report.overall.max_bytes))
447447
);
448+
if args.max_tile_bytes > 0 {
449+
println!(
450+
"{}",
451+
format_summary_label("Tiles over limit", report.over_limit_tiles)
452+
);
453+
}
448454
println!(
449455
"{}",
450456
format_summary_label(

src/mbtiles.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub struct MbtilesReport {
4141
pub by_zoom: Vec<MbtilesZoomStats>,
4242
pub empty_tiles: u64,
4343
pub empty_ratio: f64,
44+
pub over_limit_tiles: u64,
4445
pub sampled: bool,
4546
pub sample_total_tiles: u64,
4647
pub sample_used_tiles: u64,
@@ -1601,6 +1602,7 @@ pub fn inspect_mbtiles_with_options(path: &Path, options: InspectOptions) -> Res
16011602
let mut by_zoom: BTreeMap<u8, MbtilesStats> = BTreeMap::new();
16021603
let mut zoom_minmax: BTreeMap<u8, (u64, u64)> = BTreeMap::new();
16031604
let mut empty_tiles: u64 = 0;
1605+
let mut over_limit_tiles: u64 = 0;
16041606
let mut processed: u64 = 0;
16051607
let mut used: u64 = 0;
16061608

@@ -1649,6 +1651,10 @@ pub fn inspect_mbtiles_with_options(path: &Path, options: InspectOptions) -> Res
16491651

16501652
processed += 1;
16511653

1654+
if options.max_tile_bytes > 0 && length > options.max_tile_bytes {
1655+
over_limit_tiles += 1;
1656+
}
1657+
16521658
if include_sample(processed, total_tiles, options.sample.as_ref()) {
16531659
used += 1;
16541660

@@ -1945,6 +1951,7 @@ pub fn inspect_mbtiles_with_options(path: &Path, options: InspectOptions) -> Res
19451951
by_zoom,
19461952
empty_tiles,
19471953
empty_ratio,
1954+
over_limit_tiles,
19481955
sampled: options.sample.is_some(),
19491956
sample_total_tiles: total_tiles,
19501957
sample_used_tiles: used,

src/output.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ pub fn apply_stats_filter(mut report: MbtilesReport, filter: &StatsFilter) -> Mb
136136
report.overall.avg_bytes = 0;
137137
report.empty_tiles = 0;
138138
report.empty_ratio = 0.0;
139+
report.over_limit_tiles = 0;
139140
report.sampled = false;
140141
report.sample_total_tiles = 0;
141142
report.sample_used_tiles = 0;
@@ -185,6 +186,7 @@ pub fn ndjson_lines(report: &MbtilesReport, mut options: NdjsonOptions) -> Resul
185186
"by_zoom": report.by_zoom,
186187
"empty_tiles": report.empty_tiles,
187188
"empty_ratio": report.empty_ratio,
189+
"over_limit_tiles": report.over_limit_tiles,
188190
"sampled": report.sampled,
189191
"sample_total_tiles": report.sample_total_tiles,
190192
"sample_used_tiles": report.sample_used_tiles,

src/pmtiles.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,9 +725,11 @@ fn accumulate_tile_counts(
725725
overall: &mut StatAccum,
726726
by_zoom: &mut BTreeMap<u8, StatAccum>,
727727
empty_tiles: &mut u64,
728+
over_limit_tiles: &mut u64,
728729
min_len: &mut Option<u64>,
729730
max_len: &mut Option<u64>,
730731
zoom_minmax: &mut BTreeMap<u8, (u64, u64)>,
732+
max_tile_bytes: u64,
731733
mut progress: Option<&mut ProgressTracker>,
732734
) -> Result<()> {
733735
for entry in entries {
@@ -746,9 +748,11 @@ fn accumulate_tile_counts(
746748
overall,
747749
by_zoom,
748750
empty_tiles,
751+
over_limit_tiles,
749752
min_len,
750753
max_len,
751754
zoom_minmax,
755+
max_tile_bytes,
752756
progress.as_deref_mut(),
753757
)?;
754758
continue;
@@ -772,6 +776,9 @@ fn accumulate_tile_counts(
772776
max_bytes: 0,
773777
})
774778
.add_tile(length);
779+
if max_tile_bytes > 0 && length > max_tile_bytes {
780+
*over_limit_tiles += 1;
781+
}
775782
if length <= EMPTY_TILE_MAX_BYTES {
776783
*empty_tiles += 1;
777784
}
@@ -1281,6 +1288,7 @@ pub fn inspect_pmtiles_with_options(
12811288
};
12821289
let mut by_zoom: BTreeMap<u8, StatAccum> = BTreeMap::new();
12831290
let mut empty_tiles = 0u64;
1291+
let mut over_limit_tiles = 0u64;
12841292
let mut min_len: Option<u64> = None;
12851293
let mut max_len: Option<u64> = None;
12861294
let mut zoom_minmax: BTreeMap<u8, (u64, u64)> = BTreeMap::new();
@@ -1298,9 +1306,11 @@ pub fn inspect_pmtiles_with_options(
12981306
&mut overall,
12991307
&mut by_zoom,
13001308
&mut empty_tiles,
1309+
&mut over_limit_tiles,
13011310
&mut min_len,
13021311
&mut max_len,
13031312
&mut zoom_minmax,
1313+
options.max_tile_bytes,
13041314
counting_progress.as_mut(),
13051315
)?;
13061316
if let Some(progress) = counting_progress {
@@ -1465,6 +1475,7 @@ pub fn inspect_pmtiles_with_options(
14651475
by_zoom,
14661476
empty_tiles,
14671477
empty_ratio,
1478+
over_limit_tiles,
14681479
sampled: false,
14691480
sample_total_tiles: 0,
14701481
sample_used_tiles: 0,

tests/mbtiles.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ fn inspect_mbtiles_reports_minimal_stats() {
107107
);
108108
assert_eq!(report.empty_tiles, 2);
109109
assert_eq!(report.empty_ratio, 1.0);
110+
assert_eq!(report.over_limit_tiles, 0);
110111
assert!(!report.sampled);
111112
assert_eq!(report.sample_total_tiles, 2);
112113
assert_eq!(report.sample_used_tiles, 2);
@@ -140,6 +141,24 @@ fn inspect_mbtiles_reports_metadata() {
140141
assert_eq!(report.metadata.get("minzoom"), Some(&"0".to_string()));
141142
}
142143

144+
#[test]
145+
fn inspect_mbtiles_counts_over_limit_tiles() {
146+
let dir = tempfile::tempdir().expect("tempdir");
147+
let path = dir.path().join("input.mbtiles");
148+
create_sample_mbtiles(&path);
149+
150+
let report = inspect_mbtiles_with_options(
151+
&path,
152+
InspectOptions {
153+
max_tile_bytes: 15,
154+
..InspectOptions::default()
155+
},
156+
)
157+
.expect("inspect");
158+
159+
assert_eq!(report.over_limit_tiles, 1);
160+
}
161+
143162
#[test]
144163
fn copy_mbtiles_copies_tiles_and_metadata() {
145164
let dir = tempfile::tempdir().expect("tempdir");

tests/output_ndjson.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ fn ndjson_splits_histograms_and_top_tile_summaries() {
3030
}],
3131
empty_tiles: 0,
3232
empty_ratio: 0.0,
33+
over_limit_tiles: 0,
3334
sampled: false,
3435
sample_total_tiles: 1,
3536
sample_used_tiles: 1,
@@ -155,6 +156,7 @@ fn ndjson_lite_omits_summary() {
155156
by_zoom: vec![],
156157
empty_tiles: 0,
157158
empty_ratio: 0.0,
159+
over_limit_tiles: 0,
158160
sampled: false,
159161
sample_total_tiles: 1,
160162
sample_used_tiles: 1,
@@ -198,6 +200,7 @@ fn ndjson_sorts_zoom_histograms_and_recommendations() {
198200
by_zoom: vec![],
199201
empty_tiles: 0,
200202
empty_ratio: 0.0,
203+
over_limit_tiles: 0,
201204
sampled: false,
202205
sample_total_tiles: 1,
203206
sample_used_tiles: 1,
@@ -271,6 +274,7 @@ fn ndjson_compact_minimizes_payloads() {
271274
by_zoom: vec![],
272275
empty_tiles: 0,
273276
empty_ratio: 0.0,
277+
over_limit_tiles: 0,
274278
sampled: false,
275279
sample_total_tiles: 1,
276280
sample_used_tiles: 1,
@@ -362,6 +366,7 @@ fn ndjson_compact_omits_summary_even_when_requested() {
362366
by_zoom: vec![],
363367
empty_tiles: 0,
364368
empty_ratio: 0.0,
369+
over_limit_tiles: 0,
365370
sampled: false,
366371
sample_total_tiles: 1,
367372
sample_used_tiles: 1,
@@ -405,6 +410,7 @@ fn ndjson_tile_info_format_compact_omits_property_keys() {
405410
by_zoom: vec![],
406411
empty_tiles: 0,
407412
empty_ratio: 0.0,
413+
over_limit_tiles: 0,
408414
sampled: false,
409415
sample_total_tiles: 1,
410416
sample_used_tiles: 1,

tests/output_stats.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fn apply_stats_filter_removes_unlisted_sections() {
2424
by_zoom: vec![],
2525
empty_tiles: 1,
2626
empty_ratio: 1.0,
27+
over_limit_tiles: 0,
2728
sampled: true,
2829
sample_total_tiles: 10,
2930
sample_used_tiles: 1,

0 commit comments

Comments
 (0)