Skip to content

Conversation

@zstadler
Copy link
Contributor

@zstadler zstadler commented Oct 30, 2025

Also, add simplified WKT geometry pattern to schema.

Schema validation limitations:

Add simplified WKT geometry check to schema.

Schema validation limitations:
- The plugin does not support validation of schema violations. See dataliquid/json-yaml-validator-maven-plugin#51
- The plugin does not support YAML aliases. See dataliquid/json-yaml-validator-maven-plugin#52
@sonarqubecloud
Copy link

@github-actions
Copy link

This Branch ab771fd Base 32a10d3
0:01:13 DEB [archive] - Tile stats:
0:01:13 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (160k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:88k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (116k) 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. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
9. 14/4946/6112 (98k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:60k)
10. 14/4942/6091 (97k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:13 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   573   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   488   488   488   708   797    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   972  1.4k  4.6k  6.4k   21k   15k   17k   64k   48k   34k   64k
           waterway    0     0     0     0   112   119     0     0     0    3k  2.2k    2k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.3k  4.3k  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.8k   29k   85k   72k   81k   53k   30k   25k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         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   88k   88k
           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   42k   84k  201k  183k  135k  114k  129k  252k  252k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.2k    5k   14k   29k   60k  148k  136k   99k   84k   92k  160k  160k
0:01:13 DEB [archive] -    Max tile: 252k (gzipped: 160k)
0:01:13 DEB [archive] -    Avg tile: 5.5k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:13 DEB [archive] -     # tiles: 4,115,056
0:01:13 DEB [archive] -  # features: 5,680,919
0:01:13 INF [archive] - Finished in 21s cpu:1m16s avg:3.7
0:01:13 INF [archive] -   read    1x(3% 0.6s wait:19s done:1s)
0:01:13 INF [archive] -   encode  4x(56% 11s wait:2s done:1s)
0:01:13 INF [archive] -   write   1x(20% 4s wait:14s done:1s)
0:01:13 INF [archive] - Finished in 1m13s cpu:3m52s gc:1s avg:3.2
0:01:13 INF [archive] - FINISHED!
0:01:13 INF [archive] - 
0:01:13 INF [archive] - ----------------------------------------
0:01:13 INF [archive] - data errors:
0:01:13 INF [archive] - 	render_snap_fix_input	16,938
0:01:13 INF [archive] - 	osm_multipolygon_missing_way	360
0:01:13 INF [archive] - 	osm_boundary_missing_way	55
0:01:13 INF [archive] - 	merge_snap_fix_input	15
0:01:13 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	6
0:01:13 INF [archive] - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:13 INF [archive] - 	render_snap_fix_input2	1
0:01:13 INF [archive] - 	omt_fix_water_before_ne_intersect	1
0:01:13 INF [archive] - 	feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix	1
0:01:13 INF [archive] - ----------------------------------------
0:01:13 INF [archive] - 	overall          1m13s cpu:3m52s gc:1s avg:3.2
0:01:13 INF [archive] - 	lake_centerlines 3s cpu:6s avg:2.3
0:01:13 INF [archive] - 	  read     1x(18% 0.5s done:2s)
0:01:13 INF [archive] - 	  process  4x(0% 0s done:2s)
0:01:13 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:13 INF [archive] - 	water_polygons   15s cpu:42s avg:2.7
0:01:13 INF [archive] - 	  read     1x(41% 6s done:7s)
0:01:13 INF [archive] - 	  process  4x(26% 4s wait:4s done:6s)
0:01:13 INF [archive] - 	  write    1x(3% 0.5s wait:10s done:5s)
0:01:13 INF [archive] - 	natural_earth    11s cpu:17s avg:1.6
0:01:13 INF [archive] - 	  read     1x(57% 6s done:5s)
0:01:13 INF [archive] - 	  process  4x(7% 0.8s wait:6s done:5s)
0:01:13 INF [archive] - 	  write    1x(0% 0s wait:6s done:4s)
0:01:13 INF [archive] - 	osm_pass1        2s cpu:6s avg:3.4
0:01:13 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:13 INF [archive] - 	  parse    4x(37% 0.7s)
0:01:13 INF [archive] - 	  process  1x(65% 1s)
0:01:13 INF [archive] - 	osm_pass2        20s cpu:1m20s avg:3.9
0:01:13 INF [archive] - 	  read     1x(0% 0s wait:12s done:8s)
0:01:13 INF [archive] - 	  process  4x(75% 15s)
0:01:13 INF [archive] - 	  write    1x(2% 0.4s wait:20s)
0:01:13 INF [archive] - 	ne_lakes         0s cpu:0s avg:11.6
0:01:13 INF [archive] - 	boundaries       0s cpu:0s avg:1.4
0:01:13 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:13 INF [archive] - 	sort             1s cpu:4s avg:2.6
0:01:13 INF [archive] - 	  worker  1x(48% 0.7s)
0:01:13 INF [archive] - 	archive          21s cpu:1m16s avg:3.7
0:01:13 INF [archive] - 	  read    1x(3% 0.6s wait:19s done:1s)
0:01:13 INF [archive] - 	  encode  4x(56% 11s wait:2s done:1s)
0:01:13 INF [archive] - 	  write   1x(20% 4s wait:14s done:1s)
0:01:13 INF [archive] - ----------------------------------------
0:01:13 INF [archive] - 	archive	108MB
0:01:13 INF [archive] - 	features	292MB
-rw-r--r-- 1 runner runner 109M Oct 30 23:47 run.jar
0:01:08 DEB [archive] - Tile stats:
0:01:08 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (160k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:88k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (117k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:69k)
6. 14/4941/6093 (116k) 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. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
9. 14/4946/6112 (98k) https://onthegomap.github.io/planetiler-demo/#14.5/41.50035/-71.31226 (building:60k)
10. 14/4942/6091 (97k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:08 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   573   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   488   488   488   708   797    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   972  1.4k  4.6k  6.4k   21k   15k   17k   64k   48k   34k   64k
           waterway    0     0     0     0   112   119     0     0     0    3k  2.2k    2k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0  1.3k  4.3k  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.8k   29k   85k   72k   81k   53k   30k   25k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         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   88k   88k
           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   42k   84k  201k  183k  135k  114k  129k  252k  252k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.2k    5k   14k   29k   60k  148k  136k   99k   84k   92k  160k  160k
0:01:08 DEB [archive] -    Max tile: 252k (gzipped: 160k)
0:01:08 DEB [archive] -    Avg tile: 5.5k (gzipped: 4.1k) using weighted average based on OSM traffic
0:01:08 DEB [archive] -     # tiles: 4,115,056
0:01:08 DEB [archive] -  # features: 5,680,919
0:01:08 INF [archive] - Finished in 20s cpu:1m16s avg:3.7
0:01:08 INF [archive] -   read    1x(3% 0.6s wait:19s done:1s)
0:01:08 INF [archive] -   encode  4x(56% 12s wait:2s)
0:01:08 INF [archive] -   write   1x(20% 4s wait:14s)
0:01:08 INF [archive] - Finished in 1m8s cpu:3m48s gc:1s avg:3.3
0:01:08 INF [archive] - FINISHED!
0:01:08 INF [archive] - 
0:01:08 INF [archive] - ----------------------------------------
0:01:08 INF [archive] - data errors:
0:01:08 INF [archive] - 	render_snap_fix_input	16,938
0:01:08 INF [archive] - 	osm_multipolygon_missing_way	360
0:01:08 INF [archive] - 	osm_boundary_missing_way	55
0:01:08 INF [archive] - 	merge_snap_fix_input	15
0:01:08 INF [archive] - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	6
0:01:08 INF [archive] - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:08 INF [archive] - 	render_snap_fix_input2	1
0:01:08 INF [archive] - 	omt_fix_water_before_ne_intersect	1
0:01:08 INF [archive] - 	feature_point_on_surface_osm_invalid_multipolygon_empty_after_fix	1
0:01:08 INF [archive] - ----------------------------------------
0:01:08 INF [archive] - 	overall          1m8s cpu:3m48s gc:1s avg:3.3
0:01:08 INF [archive] - 	lake_centerlines 2s cpu:5s avg:2.3
0:01:08 INF [archive] - 	  read     1x(22% 0.5s done:2s)
0:01:08 INF [archive] - 	  process  4x(0% 0s done:2s)
0:01:08 INF [archive] - 	  write    1x(0% 0s done:2s)
0:01:08 INF [archive] - 	water_polygons   15s cpu:43s avg:2.8
0:01:08 INF [archive] - 	  read     1x(41% 6s done:7s)
0:01:08 INF [archive] - 	  process  4x(27% 4s wait:4s done:6s)
0:01:08 INF [archive] - 	  write    1x(3% 0.5s wait:10s done:5s)
0:01:08 INF [archive] - 	natural_earth    6s cpu:13s avg:2.1
0:01:08 INF [archive] - 	  read     1x(96% 6s)
0:01:08 INF [archive] - 	  process  4x(13% 0.8s wait:6s)
0:01:08 INF [archive] - 	  write    1x(0% 0s wait:6s)
0:01:08 INF [archive] - 	osm_pass1        2s cpu:7s avg:3.2
0:01:08 INF [archive] - 	  read     1x(2% 0s wait:2s)
0:01:08 INF [archive] - 	  parse    4x(31% 0.7s wait:1s)
0:01:08 INF [archive] - 	  process  1x(72% 2s)
0:01:08 INF [archive] - 	osm_pass2        20s cpu:1m17s avg:4
0:01:08 INF [archive] - 	  read     1x(0% 0s wait:12s done:7s)
0:01:08 INF [archive] - 	  process  4x(77% 15s)
0:01:08 INF [archive] - 	  write    1x(2% 0.4s wait:19s)
0:01:08 INF [archive] - 	ne_lakes         0s cpu:0s avg:0
0:01:08 INF [archive] - 	boundaries       0s cpu:0s avg:2.3
0:01:08 INF [archive] - 	agg_stop         0s cpu:0s avg:0
0:01:08 INF [archive] - 	sort             2s cpu:4s avg:2.7
0:01:08 INF [archive] - 	  worker  1x(48% 0.7s)
0:01:08 INF [archive] - 	archive          20s cpu:1m16s avg:3.7
0:01:08 INF [archive] - 	  read    1x(3% 0.6s wait:19s done:1s)
0:01:08 INF [archive] - 	  encode  4x(56% 12s wait:2s)
0:01:08 INF [archive] - 	  write   1x(20% 4s wait:14s)
0:01:08 INF [archive] - ----------------------------------------
0:01:08 INF [archive] - 	archive	108MB
0:01:08 INF [archive] - 	features	292MB
-rw-r--r-- 1 runner runner 109M Oct 30 23:49 run.jar

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

@msbarry
Copy link
Contributor

msbarry commented Oct 31, 2025

Instead of doing this through maven what if we add a json schema validator as a dependency. Then we could have the unit tests that validate these files also check they match the json schema. It would also let us add a planetiler.jar validate command that users could use to validate one of their files, or even just do it automatically before running a yaml file.

@zstadler
Copy link
Contributor Author

I have no strong feelings about this approach. Having a validate and a validate-spec commands would be useful, and the test could potentially use them also for testing with invalid inputs.
Could you take the lead on this?

@basmussen
Copy link

basmussen commented Nov 14, 2025

Hi @zstadler,

Great news! We've just released https://github.com/dataliquid/json-yaml-validator-maven-plugin/releases/tag/1.1.0 of the json-yaml-validator-maven-plugin which addresses both issues you reported:

  • Issue 51 (Check the schema identifies invalid inputs) - ✅ Implemented with expectedResult, expectedErrors and strictErrorMatching parameters
  • Issue 52 (YAML aliases treated as strings) - ✅ Fixed, YAML aliases now properly resolve to their referenced values

Thank you for reporting these issues - they've made the plugin much more robust!

About Our JSON Validation Approach

When we researched JSON validators a few months ago, we found that while many validators exist, only the networknt/json-schema-validator truly adheres correctly to the JSON Schema specification. Many other validators we tested had issues with spec compliance, particularly with complex features like conditionals, $ref resolution, and proper error reporting.

That's why we built this Maven plugin around networknt/json-schema-validator. Our experience has shown it handles even complex JSON validations excellently, including:

  • Conditional validations (if/then/else)
  • Complex schema composition (allOf, oneOf, anyOf)
  • Full YAML support with proper alias resolution
  • All JSON Schema versions (Draft 4 through 2020-12)

Example with v1.1.0's New Features

<plugin>
    <groupId>com.dataliquid.maven</groupId>
    <artifactId>json-yaml-validator-maven-plugin</artifactId>
    <version>1.1.0</version>
    <executions>
        <!-- Validate that invalid configs are properly rejected -->
        <execution>
            <id>validate-invalid-configs</id>
            <goals><goal>validate</goal></goals>
            <configuration>
                <schemaFile>src/main/resources/planetiler.schema.json</schemaFile>
                <sourceDirectory>src/test/resources/invalid-configs</sourceDirectory>
                <expectedResult>ERROR</expectedResult>
                <expectedErrors>
                    <expectedError>.*storage.*required.*</expectedError>
                    <expectedError>.*threads.*minimum.*</expectedError>
                </expectedErrors>
            </configuration>
        </execution>
    </executions>
</plugin>

I see @msbarry suggested an alternative approach with direct dependency integration. Both approaches could actually complement each other well - our plugin for build-time validation and the direct dependency for runtime validation and CLI commands.

Feel free to try v1.1.0 if you'd like to continue with the Maven plugin approach. We're happy to help if you encounter any issues!

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.

3 participants