Skip to content

Expose label grid functions for custommap/YAML profiles#1477

Closed
phanecak-maptiler wants to merge 136 commits into
onthegomap:mainfrom
phanecak-maptiler:custommap-expose-label_grid_and_co
Closed

Expose label grid functions for custommap/YAML profiles#1477
phanecak-maptiler wants to merge 136 commits into
onthegomap:mainfrom
phanecak-maptiler:custommap-expose-label_grid_and_co

Conversation

@phanecak-maptiler

@phanecak-maptiler phanecak-maptiler commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

This PR exposes "label grid" related functions for custommap/YAML profiles:

  • pointLabelGridPixelSize()
  • pointLabelGridLimit()
  • sortKey()
  • sortKeyDescending()

Those are needed for layers with many points for "label grid" point density limiting.

Usage example:

sources:
  osm:
    type: osm
    url: geofabrik:rhode-island
    local_path: data/rhode-island.osm.pbf
layers:
- id: testLayer
  buffer: 64
  features:
  - source: osm
    geometry: point
    point_label_grid:
      pixel_size:
        maxzoom: 8
        value: 32
      limit:
        maxzoom: 8
        value: 64
    sort_key: ${ feature.id }

phanecak-maptiler and others added 30 commits December 13, 2022 21:29
@github-actions

github-actions Bot commented Feb 19, 2026

Copy link
Copy Markdown
This Branch edfe1bb Base 1bde917
0:01:09 DEB [archive] - Tile stats:
0:01:09 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (164k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:89k)
2. 9/154/190 (149k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:86k)
3. 10/308/381 (138k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
4. 10/308/380 (137k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
5. 14/4941/6092 (121k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (118k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (poi:62k)
7. 14/4946/6113 (112k) https://onthegomap.github.io/planetiler-demo/#14.5/41.48389/-71.31226 (building:59k)
8. 14/4946/6112 (111k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:67k)
9. 14/4940/6092 (102k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
10. 14/4942/6091 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:09 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  151   336   409   544   802   287   396   490   670  1.6k    2k  6.9k  6.2k  5.6k  4.4k  6.9k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   26k   15k   13k   17k   15k   12k   26k
              place    0     0   487   487   487   773   862  1.1k  1.8k  3.3k  6.2k  3.9k    2k   966    1k  6.2k
            landuse    0     0     0     0   549   695  1.6k  6.9k   18k   45k   58k   49k   38k   19k   12k   58k
     transportation    0     0     0     0   355    1k  1.5k  4.6k  6.4k   21k   15k   17k   68k   38k   38k   68k
           waterway    0     0     0     0   112   119     0     0     0  3.3k  2.4k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.1k    4k  9.7k   19k   13k  8.2k  3.7k  3.4k  4.4k   19k
transportation_name    0     0     0     0     0     0   293   360  1.1k  1.9k  5.8k  4.9k    4k  3.5k   18k   18k
          landcover    0     0     0     0     0     0     0  9.6k   29k   86k   72k   82k   53k   30k   26k   86k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.4k  2.8k  1.4k  1.4k   869  4.4k
         water_name    0     0     0     0     0     0     0     0     0   528   503   475   494  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   666   289   273   221   221   666
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k    2k    3k  3.3k  2.8k  3.3k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   589   586   89k   89k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.7k  6.3k   21k   41k   85k  203k  185k  135k  114k  120k  259k  259k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k    5k   14k   29k   61k  149k  138k   99k   84k   85k  164k  164k
0:01:09 DEB [archive] -    Max tile: 259k (gzipped: 164k)
0:01:09 DEB [archive] -    Avg tile: 5.4k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:09 DEB [archive] -     # tiles: 4,115,030
0:01:09 DEB [archive] -  # features: 5,785,020
0:01:09 INF [archive] - Finished in 19s cpu:1m10s avg:3.7
0:01:09 INF [archive] -   read    1x(3% 0.6s wait:17s done:1s)
0:01:09 INF [archive] -   encode  4x(55% 10s wait:2s done:1s)
0:01:09 INF [archive] -   write   1x(18% 3s wait:13s done:1s)
0:01:09 INF [archive] - Finished in 1m10s cpu:3m32s gc:1s avg:3
0:01:09 INF [archive] - FINISHED!
0:01:09 INF [archive] - 
0:01:09 INF [archive] - ----------------------------------------
0:01:09 INF [archive] - data errors:
0:01:09 INF [archive] - 	render_snap_fix_input	16,810
0:01:09 INF [archive] - 	osm_multipolygon_missing_way	377
0:01:09 INF [archive] - 	osm_boundary_missing_way	55
0:01:09 INF [archive] - 	merge_snap_fix_input	9
0:01:09 INF [archive] - 	osm_multipolygon_duplicate_member	4
0:01:09 INF [archive] - 	omt_fix_water_before_ne_intersect	2
0:01:09 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:09 INF [archive] - 	render_snap_fix_input2	1
0:01:09 INF [archive] - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:09 INF [archive] - ----------------------------------------
0:01:09 INF [archive] - 	overall          1m10s cpu:3m32s gc:1s avg:3
0:01:09 INF [archive] - 	lake_centerlines 3s cpu:6s avg:2.2
0:01:09 INF [archive] - 	  read     1x(18% 0.5s done:2s)
0:01:09 INF [archive] - 	  process  4x(0% 0s done:2s)
0:01:09 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:09 INF [archive] - 	water_polygons   16s cpu:38s avg:2.5
0:01:09 INF [archive] - 	  read     1x(44% 7s done:8s)
0:01:09 INF [archive] - 	  process  4x(21% 3s wait:4s done:6s)
0:01:09 INF [archive] - 	  write    1x(3% 0.4s wait:9s done:6s)
0:01:09 INF [archive] - 	natural_earth    11s cpu:19s avg:1.6
0:01:09 INF [archive] - 	  read     1x(54% 6s done:5s)
0:01:09 INF [archive] - 	  process  4x(7% 0.8s wait:6s done:5s)
0:01:09 INF [archive] - 	  write    1x(0% 0s wait:6s done:5s)
0:01:09 INF [archive] - 	osm_pass1        2s cpu:7s avg:3.3
0:01:09 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:09 INF [archive] - 	  parse    4x(34% 0.7s)
0:01:09 INF [archive] - 	  process  1x(69% 1s)
0:01:09 INF [archive] - 	osm_pass2        17s cpu:1m6s avg:4
0:01:09 INF [archive] - 	  read     1x(0% 0s wait:10s done:7s)
0:01:09 INF [archive] - 	  process  4x(66% 11s)
0:01:09 INF [archive] - 	  write    1x(3% 0.5s wait:16s)
0:01:09 INF [archive] - 	ne_lakes         0s cpu:0s avg:0
0:01:09 INF [archive] - 	boundaries       0s cpu:0s avg:0
0:01:09 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:09 INF [archive] - 	sort             1s cpu:3s avg:2.4
0:01:09 INF [archive] - 	  worker  1x(55% 0.8s)
0:01:09 INF [archive] - 	archive          19s cpu:1m10s avg:3.7
0:01:09 INF [archive] - 	  read    1x(3% 0.6s wait:17s done:1s)
0:01:09 INF [archive] - 	  encode  4x(55% 10s wait:2s done:1s)
0:01:09 INF [archive] - 	  write   1x(18% 3s wait:13s done:1s)
0:01:09 INF [archive] - ----------------------------------------
0:01:09 INF [archive] - 	archive	109MB
0:01:09 INF [archive] - 	features	298MB
-rw-r--r-- 1 runner runner 87M Jun 14 16:48 run.jar
0:01:03 DEB [archive] - Tile stats:
0:01:03 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (164k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:89k)
2. 9/154/190 (149k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:86k)
3. 10/308/381 (138k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
4. 10/308/380 (137k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
5. 14/4941/6092 (121k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (118k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (poi:62k)
7. 14/4946/6113 (112k) https://onthegomap.github.io/planetiler-demo/#14.5/41.48389/-71.31226 (building:59k)
8. 14/4946/6112 (111k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:67k)
9. 14/4940/6092 (102k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
10. 14/4942/6091 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:03 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  151   336   409   544   802   287   396   490   670  1.6k    2k  6.9k  6.2k  5.6k  4.4k  6.9k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   26k   15k   13k   17k   15k   12k   26k
              place    0     0   487   487   487   773   862  1.1k  1.8k  3.3k  6.2k  3.9k    2k   966    1k  6.2k
            landuse    0     0     0     0   549   695  1.6k  6.9k   18k   45k   58k   49k   38k   19k   12k   58k
     transportation    0     0     0     0   355    1k  1.5k  4.6k  6.4k   21k   15k   17k   68k   38k   38k   68k
           waterway    0     0     0     0   112   119     0     0     0  3.3k  2.4k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.1k    4k  9.7k   19k   13k  8.2k  3.7k  3.4k  4.4k   19k
transportation_name    0     0     0     0     0     0   293   360  1.1k  1.9k  5.8k  4.9k    4k  3.5k   18k   18k
          landcover    0     0     0     0     0     0     0  9.6k   29k   86k   72k   82k   53k   30k   26k   86k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.4k  2.8k  1.4k  1.4k   869  4.4k
         water_name    0     0     0     0     0     0     0     0     0   528   503   475   494  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   666   289   273   221   221   666
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k    2k    3k  3.3k  2.8k  3.3k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   589   586   89k   89k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.7k  6.3k   21k   41k   85k  203k  185k  135k  114k  120k  259k  259k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k    5k   14k   29k   61k  149k  138k   99k   84k   85k  164k  164k
0:01:03 DEB [archive] -    Max tile: 259k (gzipped: 164k)
0:01:03 DEB [archive] -    Avg tile: 5.4k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:03 DEB [archive] -     # tiles: 4,115,030
0:01:03 DEB [archive] -  # features: 5,785,020
0:01:03 INF [archive] - Finished in 19s cpu:1m10s avg:3.7
0:01:03 INF [archive] -   read    1x(3% 0.6s wait:17s done:1s)
0:01:03 INF [archive] -   encode  4x(54% 10s wait:2s done:1s)
0:01:03 INF [archive] -   write   1x(19% 4s wait:13s)
0:01:03 INF [archive] - Finished in 1m4s cpu:3m22s gc:1s avg:3.2
0:01:03 INF [archive] - FINISHED!
0:01:03 INF [archive] - 
0:01:03 INF [archive] - ----------------------------------------
0:01:03 INF [archive] - data errors:
0:01:03 INF [archive] - 	render_snap_fix_input	16,810
0:01:03 INF [archive] - 	osm_multipolygon_missing_way	377
0:01:03 INF [archive] - 	osm_boundary_missing_way	55
0:01:03 INF [archive] - 	merge_snap_fix_input	9
0:01:03 INF [archive] - 	osm_multipolygon_duplicate_member	4
0:01:03 INF [archive] - 	omt_fix_water_before_ne_intersect	2
0:01:03 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:03 INF [archive] - 	render_snap_fix_input2	1
0:01:03 INF [archive] - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:03 INF [archive] - ----------------------------------------
0:01:03 INF [archive] - 	overall          1m4s cpu:3m22s gc:1s avg:3.2
0:01:03 INF [archive] - 	lake_centerlines 2s cpu:5s avg:2.4
0:01:03 INF [archive] - 	  read     1x(22% 0.5s done:2s)
0:01:03 INF [archive] - 	  process  4x(0% 0s done:2s)
0:01:03 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:03 INF [archive] - 	water_polygons   15s cpu:37s avg:2.4
0:01:03 INF [archive] - 	  read     1x(43% 7s done:8s)
0:01:03 INF [archive] - 	  process  4x(20% 3s wait:5s done:6s)
0:01:03 INF [archive] - 	  write    1x(3% 0.4s wait:9s done:6s)
0:01:03 INF [archive] - 	natural_earth    6s cpu:13s avg:2
0:01:03 INF [archive] - 	  read     1x(95% 6s)
0:01:03 INF [archive] - 	  process  4x(13% 0.8s wait:6s)
0:01:03 INF [archive] - 	  write    1x(0% 0s wait:6s)
0:01:03 INF [archive] - 	osm_pass1        2s cpu:7s avg:3.2
0:01:03 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:03 INF [archive] - 	  parse    4x(36% 0.8s)
0:01:03 INF [archive] - 	  process  1x(66% 1s)
0:01:03 INF [archive] - 	osm_pass2        16s cpu:1m4s avg:3.9
0:01:03 INF [archive] - 	  read     1x(0% 0s wait:10s done:6s)
0:01:03 INF [archive] - 	  process  4x(68% 11s)
0:01:03 INF [archive] - 	  write    1x(3% 0.5s wait:16s)
0:01:03 INF [archive] - 	ne_lakes         0s cpu:0s avg:13.7
0:01:03 INF [archive] - 	boundaries       0s cpu:0s avg:0
0:01:03 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:03 INF [archive] - 	sort             1s cpu:4s avg:2.6
0:01:03 INF [archive] - 	  worker  1x(49% 0.7s)
0:01:03 INF [archive] - 	archive          19s cpu:1m10s avg:3.7
0:01:03 INF [archive] - 	  read    1x(3% 0.6s wait:17s done:1s)
0:01:03 INF [archive] - 	  encode  4x(54% 10s wait:2s done:1s)
0:01:03 INF [archive] - 	  write   1x(19% 4s wait:13s)
0:01:03 INF [archive] - ----------------------------------------
0:01:03 INF [archive] - 	archive	109MB
0:01:03 INF [archive] - 	features	298MB
-rw-r--r-- 1 runner runner 87M Jun 14 16:50 run.jar

Full logs: https://github.com/onthegomap/planetiler/actions/runs/27505499244

Comment on lines +17 to +18
@JsonProperty("point_label_grid_pixel_size") PointLabelGridPixelSize pointLabelGridPixelSize,
@JsonProperty("point_label_grid_limit") PointLabelGridLimit pointLabelGridLimit,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's make a single "point_label_grid" attribute that is a struct with "pixel_size" and "limit" attrbitutes. "pixel_size" and "limit" should eventually be able to just be a number, value+minzoom, or expression based on feature attributes and zoom, but if we just support value+minzoom for now then we can add support for other variants later.

point_label_grid:
  pixel_size:
    minzoom: 8
    value: 32
  limit:
    minzoom: 8
    value: 64

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted.

Side note: But kept maxzoom naming, since that matches naming of parameters in setPointLabelGridPixelSize() and setPointLabelGridLimit().

@msbarry

msbarry commented Feb 20, 2026

Copy link
Copy Markdown
Contributor

Also could you add the new config fields we land on here and the new "id" field from #1469 to custommap README and planetiler.schema.json file?

@CsvSource({
"sort_key: 100 }, 100",
"sort_key: ${ feature.id }, 1",
"sort_key_descending: 100 }, -101",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't quite follow why do these have a } ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I guess some typo. Removed.

Comment on lines +2011 to +2012
<TEST INPUT>
""".replace("<TEST INPUT>", input);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor:

Suggested change
<TEST INPUT>
""".replace("<TEST INPUT>", input);
%s
""".formatted(input);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, nicer/better. Thanks. Adjusted.

Comment on lines +112 to +116
processors.add(makeFeatureProcessor(feature.pointLabelGrid(), PointLabelGrid.class,
(f, a) -> {
f.setPointLabelGridPixelSize(ZoomFunction.maxZoom(a.pixelSize().maxZoom(), a.pixelSize().value()));
f.setPointLabelGridLimit(ZoomFunction.maxZoom(a.limit().maxZoom(), a.limit().value()));
}));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These could technically be set independently. Could we break this up into 2 feature processors, one for pixelsize and one for limit?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted.

@sonarqubecloud

Copy link
Copy Markdown

@sonarqubecloud

sonarqubecloud Bot commented May 6, 2026

Copy link
Copy Markdown

@sonarqubecloud

Copy link
Copy Markdown

@phanecak-maptiler

Copy link
Copy Markdown
Contributor Author

Sorry, merged my testing main in here by mistake. Closing this, will reopen.

@phanecak-maptiler phanecak-maptiler deleted the custommap-expose-label_grid_and_co branch June 14, 2026 17:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants