Skip to content

Woosmap Tiles

Woosmap Tiles is a Planetiler profile that generates vector tiles with a clean-room schema — no OpenMapTiles dependency, no attribution burden.

Elzar (this project) is the single source of truth for the tile schema: the style defines which layers, attributes, and classes exist, and the tile generator follows.

Why a Custom Profile?

The upstream planetiler-openmaptiles fork carries OpenMapTiles copyright (BSD-3 + CC-BY 4.0) requiring visible attribution. It generates 16 layers with attributes the Woosmap style never uses. Instead of patching upstream, we built a clean-room generator:

  • Own layer namesroads instead of transportation, boundaries instead of boundary
  • Only the attributes we use — no dead weight in tiles
  • Hybrid Kotlin + YAML — simple layers defined in YAML (generated by Elzar), complex layers in Kotlin

Architecture

graph TD
    subgraph elzar["Elzar (elzar)"]
        source["source.py"]
        mapping["mapping.py"]
        poi["poi.py"]
    end

    elzar -- "generates (Phase 4)" --> schema

    subgraph tiles["woosmap-tiles/"]
        schema["schema.yml"]

        subgraph yaml["YAML layers"]
            water["water"]
            boundaries["boundaries"]
            landcover["landcover"]
            landuse["landuse"]
            parks["parks"]
            more["aeroway, airports,\nwaterways, peaks"]
        end

        subgraph kotlin["Kotlin layers"]
            roads["Roads.kt"]
            buildings["Buildings.kt"]
            places["Places.kt"]
            poiK["Poi.kt"]
            roadLabels["RoadLabels.kt"]
            waterLabels["WaterLabels.kt"]
        end

        subgraph util["Utilities"]
            langs["Languages.kt"]
            nets["Networks.kt"]
        end

        schema --> yaml
        yaml --> profile
        kotlin --> profile
        util -.-> kotlin
        profile["WoosmapProfile.kt"]
    end

    profile --> mbtiles[".mbtiles / .pmtiles"]

Layer Split

YAML Layers (generated by Elzar)

Simple tag-to-class mappings, no special logic:

Layer Geometry Key OSM Tags Attributes
water polygon natural=water, waterway=riverbank class, intermittent
waterways line waterway=river/canal/stream class, intermittent, name
landcover polygon natural=wood/grassland, landuse=forest class
landuse polygon landuse=industrial/residential class
parks polygon leisure=park, boundary=national_park class, name, rank
boundaries line boundary=administrative admin_level, disputed, maritime
aeroway polygon+line aeroway=runway/taxiway/apron class
airports point NE ne_10m_airports + OSM aeroway=aerodrome with iata name, iata, class
peaks point natural=peak/volcano name, rank

Kotlin Layers (complex logic)

Layer Why Kotlin?
roads, roads_tunnel, roads_bridge Highway classification, ramp detection, service sub-types. Pre-split by structure (tunnel/normal/bridge) — no brunnel attribute
road_labels ref + ref_length, network classification (us-interstate/us-highway), 85-language names
buildings Height arithmetic (render_height = height ∥ levels×3), hide_3d, z13 merge post-processing
places Natural Earth z0-6, OSM z7+, rank from population, 85-language names
poi Grid-based ranking, class allowlist (~50 classes), transit network normalization
water_labels Name translations, lake centerline shapefile for large bays

Layer Name Mapping

Names were changed from OpenMapTiles to be more intuitive:

OpenMapTiles Woosmap Source
transportation roads, roads_tunnel, roads_bridge Kotlin
transportation_name road_labels Kotlin
building buildings Kotlin
place places Kotlin
water_name water_labels Kotlin
waterway waterways YAML
park parks YAML
boundary boundaries YAML
mountain_peak peaks YAML
aerodrome_label airports YAML
water water YAML
landcover landcover YAML
landuse landuse YAML
aeroway aeroway YAML
poi poi Kotlin
housenumber (dropped)

Data Sources

All public domain / ODbL:

  1. OpenStreetMap PBF — primary data source
  2. Natural Earth GeoPackage — low-zoom countries, boundaries, water
  3. Water Polygons Shapefile — ocean and lake coastlines
  4. Lake Centerlines Shapefile — label placement for large water bodies