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 names —
roadsinstead oftransportation,boundariesinstead ofboundary - 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:
- OpenStreetMap PBF — primary data source
- Natural Earth GeoPackage — low-zoom countries, boundaries, water
- Water Polygons Shapefile — ocean and lake coastlines
- Lake Centerlines Shapefile — label placement for large water bodies