Skip to content

handle GEOMETRYCOLLECTION - #1447

Merged
msbarry merged 11 commits into
onthegomap:mainfrom
phanecak-maptiler:geometrycollection-enhancement
Jan 30, 2026
Merged

handle GEOMETRYCOLLECTION#1447
msbarry merged 11 commits into
onthegomap:mainfrom
phanecak-maptiler:geometrycollection-enhancement

Conversation

@phanecak-maptiler

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

Copy link
Copy Markdown
Contributor

Handle simple(-r) cases of GEOMETRYCOLLECTION with either only points, only lines or only polygons in the collection.

The GPKG spec (see for example chapter "Features consisting of multiple components" https://www.geopackage.org/guidance/modeling.html) seems to allow also more complicated cases (points, lines and polygons mixed in one collection). This for now results in "empty geometry" even with code from this PR.

simple(-r) cases with either only points, only lines or ony polygons are
in the collection
@phanecak-maptiler

phanecak-maptiler commented Jan 19, 2026

Copy link
Copy Markdown
Contributor Author

For now there is one quirk:

  • several polygons are generated for collection of polygons
  • several points are generated for collection of points
  • but multi-line is generated for collection of lines

See TODO note in FeatureRenderedTest.java. I've tried to avoid changing the "core" code too much hence the change works but unit test is omitted.

@github-actions

github-actions Bot commented Jan 19, 2026

Copy link
Copy Markdown
This Branch 3a4afeb Base 01f5480
0:01:15 DEB [archive] - Tile stats:
0:01:15 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (161k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:89k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/381 (137k) 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 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 14/4940/6092 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
8. 14/4946/6112 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:60k)
9. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
10. 11/616/764 (97k) https://onthegomap.github.io/planetiler-demo/#11.5/41.44269/-71.63086 (landcover:74k)
0:01:15 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   872   350   464   571   808  1.6k    2k  6.8k  6.2k  5.6k  4.4k  6.8k
              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   707   796    1k  1.6k  3.1k    6k  3.6k  1.8k   845   978    6k
            landuse    0     0     0     0   549   695  1.6k  6.8k   17k   44k   58k   49k   38k   19k   12k   58k
     transportation    0     0     0     0   418   971  1.4k  4.5k  6.3k   21k   15k   17k   64k   43k   34k   64k
           waterway    0     0     0     0   112   119     0     0     0  3.3k  2.4k    2k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.1k    4k  9.7k   18k   13k  8.2k  3.7k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   287   364  1.1k  1.9k  5.6k  4.8k  3.9k  3.5k   18k   18k
          landcover    0     0     0     0     0     0     0  9.7k   29k   85k   72k   81k   53k   30k   25k   85k
      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   486   461   433   452  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.8k  6.3k   21k   41k   84k  201k  183k  135k  114k  125k  253k  253k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.2k    5k   14k   29k   60k  148k  137k   99k   84k   89k  161k  161k
0:01:15 DEB [archive] -    Max tile: 253k (gzipped: 161k)
0:01:15 DEB [archive] -    Avg tile: 5.5k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:15 DEB [archive] -     # tiles: 4,115,033
0:01:15 DEB [archive] -  # features: 5,719,088
0:01:15 INF [archive] - Finished in 21s cpu:1m16s gc:1s avg:3.7
0:01:15 INF [archive] -   read    1x(3% 0.7s wait:19s done:1s)
0:01:15 INF [archive] -   encode  4x(58% 12s wait:2s)
0:01:15 INF [archive] -   write   1x(21% 4s wait:14s)
0:01:15 INF [archive] - Finished in 1m16s cpu:3m56s gc:2s avg:3.1
0:01:15 INF [archive] - FINISHED!
0:01:15 INF [archive] - 
0:01:15 INF [archive] - ----------------------------------------
0:01:15 INF [archive] - data errors:
0:01:15 INF [archive] - 	render_snap_fix_input	16,937
0:01:15 INF [archive] - 	osm_multipolygon_missing_way	397
0:01:15 INF [archive] - 	osm_boundary_missing_way	55
0:01:15 INF [archive] - 	merge_snap_fix_input	15
0:01:15 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	7
0:01:15 INF [archive] - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:15 INF [archive] - 	render_snap_fix_input2	1
0:01:15 INF [archive] - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:15 INF [archive] - 	omt_fix_water_before_ne_intersect	1
0:01:15 INF [archive] - 	feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix	1
0:01:15 INF [archive] - ----------------------------------------
0:01:15 INF [archive] - 	overall          1m16s cpu:3m56s gc:2s avg:3.1
0:01:15 INF [archive] - 	lake_centerlines 3s cpu:6s avg:1.9
0:01:15 INF [archive] - 	  read     1x(16% 0.5s done:3s)
0:01:15 INF [archive] - 	  process  4x(0% 0s done:3s)
0:01:15 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:15 INF [archive] - 	water_polygons   16s cpu:43s avg:2.6
0:01:15 INF [archive] - 	  read     1x(43% 7s done:8s)
0:01:15 INF [archive] - 	  process  4x(25% 4s wait:4s done:6s)
0:01:15 INF [archive] - 	  write    1x(3% 0.5s wait:10s done:6s)
0:01:15 INF [archive] - 	natural_earth    11s cpu:17s avg:1.6
0:01:15 INF [archive] - 	  read     1x(57% 6s done:4s)
0:01:15 INF [archive] - 	  process  4x(7% 0.7s wait:6s done:4s)
0:01:15 INF [archive] - 	  write    1x(0% 0s wait:6s done:4s)
0:01:15 INF [archive] - 	osm_pass1        2s cpu:7s avg:3.1
0:01:15 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:15 INF [archive] - 	  parse    4x(33% 0.8s wait:1s)
0:01:15 INF [archive] - 	  process  1x(75% 2s)
0:01:15 INF [archive] - 	osm_pass2        21s cpu:1m22s avg:4
0:01:15 INF [archive] - 	  read     1x(0% 0s wait:13s done:8s)
0:01:15 INF [archive] - 	  process  4x(76% 16s)
0:01:15 INF [archive] - 	  write    1x(2% 0.4s wait:20s)
0:01:15 INF [archive] - 	ne_lakes         0s cpu:0s avg:0
0:01:15 INF [archive] - 	boundaries       0s cpu:0s avg:2.8
0:01:15 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:15 INF [archive] - 	sort             1s cpu:4s avg:2.9
0:01:15 INF [archive] - 	  worker  1x(45% 0.6s)
0:01:15 INF [archive] - 	archive          21s cpu:1m16s gc:1s avg:3.7
0:01:15 INF [archive] - 	  read    1x(3% 0.7s wait:19s done:1s)
0:01:15 INF [archive] - 	  encode  4x(58% 12s wait:2s)
0:01:15 INF [archive] - 	  write   1x(21% 4s wait:14s)
0:01:15 INF [archive] - ----------------------------------------
0:01:15 INF [archive] - 	archive	108MB
0:01:15 INF [archive] - 	features	294MB
-rw-r--r-- 1 runner runner 89M Jan 25 10:54 run.jar
0:01:11 DEB [archive] - Tile stats:
0:01:11 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (161k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:89k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/381 (137k) 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 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 14/4940/6092 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
8. 14/4946/6112 (101k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:60k)
9. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
10. 11/616/764 (97k) https://onthegomap.github.io/planetiler-demo/#11.5/41.44269/-71.63086 (landcover:74k)
0:01:11 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   872   350   464   571   808  1.6k    2k  6.8k  6.2k  5.6k  4.4k  6.8k
              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   707   796    1k  1.6k  3.1k    6k  3.6k  1.8k   845   978    6k
            landuse    0     0     0     0   549   695  1.6k  6.8k   17k   44k   58k   49k   38k   19k   12k   58k
     transportation    0     0     0     0   418   968  1.4k  4.5k  6.3k   21k   15k   17k   64k   43k   34k   64k
           waterway    0     0     0     0   112   119     0     0     0  3.3k  2.4k    2k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.1k    4k  9.7k   18k   13k  8.2k  3.7k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   287   364  1.1k  1.9k  5.6k  4.8k  3.9k  3.5k   18k   18k
          landcover    0     0     0     0     0     0     0  9.7k   29k   85k   72k   81k   53k   30k   25k   85k
      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   486   461   433   452  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.8k  6.3k   21k   41k   84k  201k  183k  135k  114k  125k  253k  253k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.2k    5k   14k   29k   60k  148k  137k   99k   84k   89k  161k  161k
0:01:11 DEB [archive] -    Max tile: 253k (gzipped: 161k)
0:01:11 DEB [archive] -    Avg tile: 5.5k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:11 DEB [archive] -     # tiles: 4,115,033
0:01:11 DEB [archive] -  # features: 5,718,991
0:01:11 INF [archive] - Finished in 21s cpu:1m17s gc:1s avg:3.7
0:01:11 INF [archive] -   read    1x(3% 0.7s wait:19s)
0:01:11 INF [archive] -   encode  4x(57% 12s wait:2s)
0:01:11 INF [archive] -   write   1x(20% 4s wait:15s)
0:01:11 INF [archive] - Finished in 1m11s cpu:3m51s gc:1s avg:3.3
0:01:11 INF [archive] - FINISHED!
0:01:11 INF [archive] - 
0:01:11 INF [archive] - ----------------------------------------
0:01:11 INF [archive] - data errors:
0:01:11 INF [archive] - 	render_snap_fix_input	16,937
0:01:11 INF [archive] - 	osm_multipolygon_missing_way	397
0:01:11 INF [archive] - 	osm_boundary_missing_way	55
0:01:11 INF [archive] - 	merge_snap_fix_input	15
0:01:11 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	7
0:01:11 INF [archive] - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:11 INF [archive] - 	render_snap_fix_input2	1
0:01:11 INF [archive] - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:11 INF [archive] - 	omt_fix_water_before_ne_intersect	1
0:01:11 INF [archive] - 	feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix	1
0:01:11 INF [archive] - ----------------------------------------
0:01:11 INF [archive] - 	overall          1m11s cpu:3m51s gc:1s avg:3.3
0:01:11 INF [archive] - 	lake_centerlines 2s cpu:6s avg:2.3
0:01:11 INF [archive] - 	  read     1x(21% 0.5s done:2s)
0:01:11 INF [archive] - 	  process  4x(0% 0s done:2s)
0:01:11 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:11 INF [archive] - 	water_polygons   16s cpu:43s avg:2.6
0:01:11 INF [archive] - 	  read     1x(42% 7s done:8s)
0:01:11 INF [archive] - 	  process  4x(25% 4s wait:4s done:6s)
0:01:11 INF [archive] - 	  write    1x(3% 0.5s wait:10s done:6s)
0:01:11 INF [archive] - 	natural_earth    7s cpu:12s avg:1.9
0:01:11 INF [archive] - 	  read     1x(95% 6s)
0:01:11 INF [archive] - 	  process  4x(11% 0.7s wait:6s)
0:01:11 INF [archive] - 	  write    1x(0% 0s wait:6s)
0:01:11 INF [archive] - 	osm_pass1        2s cpu:7s avg:3
0:01:11 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:11 INF [archive] - 	  parse    4x(32% 0.7s wait:1s)
0:01:11 INF [archive] - 	  process  1x(77% 2s)
0:01:11 INF [archive] - 	osm_pass2        21s cpu:1m21s avg:4
0:01:11 INF [archive] - 	  read     1x(0% 0s wait:12s done:8s)
0:01:11 INF [archive] - 	  process  4x(77% 16s)
0:01:11 INF [archive] - 	  write    1x(2% 0.4s wait:20s)
0:01:11 INF [archive] - 	ne_lakes         0s cpu:0s avg:0
0:01:11 INF [archive] - 	boundaries       0s cpu:0s avg:2
0:01:11 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:11 INF [archive] - 	sort             1s cpu:3s avg:2.7
0:01:11 INF [archive] - 	  worker  1x(48% 0.6s)
0:01:11 INF [archive] - 	archive          21s cpu:1m17s gc:1s avg:3.7
0:01:11 INF [archive] - 	  read    1x(3% 0.7s wait:19s)
0:01:11 INF [archive] - 	  encode  4x(57% 12s wait:2s)
0:01:11 INF [archive] - 	  write   1x(20% 4s wait:15s)
0:01:11 INF [archive] - ----------------------------------------
0:01:11 INF [archive] - 	archive	108MB
0:01:11 INF [archive] - 	features	294MB
-rw-r--r-- 1 runner runner 89M Jan 25 10:56 run.jar

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

Comment thread planetiler-core/src/main/java/com/onthegomap/planetiler/geo/GeometryType.java Outdated
Comment thread planetiler-core/src/main/java/com/onthegomap/planetiler/reader/SimpleFeature.java Outdated
@sonarqubecloud

Copy link
Copy Markdown

@msbarry
msbarry merged commit 60c7b49 into onthegomap:main Jan 30, 2026
16 checks passed
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