Skip to content

Conversation

@migurski
Copy link
Contributor

@migurski migurski commented Jan 3, 2026

Add basemap support for Overture Maps input data as alternative to OSM extracts. Port kind=/kind_detail=/min_zoom= mappings with no changes to MapLibre styles.

🚧 This PR will stay in draft for a few days until some pre-requisites are complete 🚧

TODO

Layers

All Protomaps layers except for Boundaries and Transit have some coverage in this PR.

POIs

  • Overture theme=places basic_category mapped to Protomaps kind, with limited exceptions
  • No OSM-style polygon area grading is available for POI importance
  • Future work:
    • Can we use QRank to find high-priority POIs?
    • Try filtering by Overture confidence scores to eliminate bad POIs

Roads

  • Rendering includes theme=transportation type=segment subtype=road, subtype=rail, and subtype=water
  • Overture class and subclass mapped to Protomaps kind, kind_detail, and internal highway
  • Uses linear referencing from Overture array properties like road_flags to split linestrings on bridge, tunnel, and level flags to match rendering of OSM basemap
  • No features for airport runways are available

Places

  • Rendering includes high-zoom places like cities and neighborhoods from theme=places
  • Future work:
    • Include low-zoom places like states and countries

Buildings

  • Rendering includes both theme=buildings type=building and type=building_part to match Protomaps visual style

Landuse

  • Rendering includes theme=base type=land_use to match Protomaps visual style

Earth, Water, and Land Cover

  • Rendering uses theme=base type=land, type=water, type=land_cover to match Protomaps visual style
  • Future work:
    • Reduce excessive labels displayed for water bodies
    • Fix visual appearance of grainy land cover at low zooms

Testing

Extract Overture data with e.g. DuckDB:

COPY (
    SELECT *
    FROM read_parquet(
        's3://overturemaps-us-west-2/release/2025-12-17.0/**/*.parquet',
        hive_partitioning=1, filename=1, union_by_name=1
    )
    WHERE theme IN ('transportation', 'places', 'base', 'buildings', 'divisions')
      AND bbox.xmin <= -121
      AND bbox.xmax >= -123
      AND bbox.ymin <= 38
      AND bbox.ymax >= 37
) TO 'data/sources/bay-area.parquet' (FORMAT PARQUET);

Generate PMTiles from Overture data:

java -jar target/protomaps-basemap-HEAD-with-deps.jar \
    --overture=data/sources/bay-area.parquet --download --force

Run the app/ map frontend or one of the HTML examples to preview.

Screenshots

Taken from interactive preview at mike.teczno.com; compare with OSM data at maps.protomaps.com.

Screenshot 2026-01-03 at 3 24 25 PM

Screenshot 2026-01-03 at 3 24 48 PM

Screenshot 2026-01-03 at 3 25 06 PM

Screenshot 2026-01-03 at 3 25 25 PM

Screenshot 2026-01-03 at 3 25 56 PM

Screenshot 2026-01-03 at 3 26 18 PM

Flavor Compatibility

The changes in this PR map Overture properties to existing Protomaps conventions with no changes to styles, so all five of the included flavors are compatible: black, grayscale, white, light, and dark.

Screenshot 2026-01-03 at 3 38 32 PM Screenshot 2026-01-03 at 3 38 46 PM Screenshot 2026-01-03 at 3 38 03 PM Screenshot 2026-01-03 at 3 39 58 PM Screenshot 2026-01-03 at 3 39 01 PM

migurski and others added 26 commits January 5, 2026 11:09
…and line splitting

- Updated 6 existing tests to include access_restrictions and road_flags data
- Added 6 new splitting tests for partial bridge/tunnel/oneway/level application
- Tests use simple geometries (0,0)-(1,0) for easy verification
- All 12 tests failing as expected (property extraction and splitting not yet implemented)
- References real Overture feature IDs and OSM way IDs in comments
…way/level properties

Major Changes:
- Created com.protomaps.basemap.geometry.Linear utility class for line splitting operations
- Rewrote Roads.processOverture() to handle fractional 'between' ranges from Overture data
- Implemented collectSplitPoints() to gather all split positions from road_flags, access_restrictions, and level_rules
- Implemented extractSegmentProperties() to determine which properties apply to each split segment
- Added emitRoadFeature() to create features with custom split geometries

Results:
- 15/21 tests now passing (6 original property extraction tests now pass)
- 6 splitting tests create correct features with correct attributes and geometries
- Only remaining issue: cosmetic Norm{} wrapper in test assertions (geometries are actually correct)

Implementation handles:
- Partial bridges via road_flags with 'is_bridge' flag
- Partial tunnels via road_flags with 'is_tunnel' flag
- Partial oneway restrictions via access_restrictions with heading='backward'
- Partial level changes via level_rules
- Overlapping property ranges (e.g., bridge + oneway on same segment)
- Multiple split points creating 2-5 output features per input feature
…urved roads

- Add comprehensive unit tests for line splitting with curves
- Rewrite Linear.splitAtFractions() to preserve all vertices between split points
- Add coordinate transformation from lat/lon to world coordinates before emitting
- All 9 new Linear tests pass, roads render correctly with curves preserved

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@migurski migurski force-pushed the migurski/add-overture-basemap-source branch from a905299 to 03a5d92 Compare January 5, 2026 19:09
@sonarqubecloud
Copy link

sonarqubecloud bot commented Jan 6, 2026

Quality Gate Failed Quality Gate failed

Failed conditions
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

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.

1 participant