File Format¶
A .yoromaps file is a single SQLite database containing everything needed for offline maps and routing.
Overview¶
The file contains five tables:
| Table | Purpose |
|---|---|
metadata |
Key-value store for database info |
tiles |
MBTiles-compatible tile storage |
nodes |
Road graph intersections (vertices) |
edges |
Road graph segments (edges) |
pois |
Points of interest |
Schema¶
metadata¶
Stores database-level information as key-value pairs.
Standard keys:
| Key | Example value | Description |
|---|---|---|
schema_version |
1 |
Schema version number |
country |
ML |
ISO country code |
country_name |
Mali |
Full country name |
bbox |
-12.5,10.0,4.5,25.0 |
Bounding box (lon_min,lat_min,lon_max,lat_max) |
graph_nodes |
142857 |
Number of nodes in the graph |
graph_edges |
187432 |
Number of edges in the graph |
tiles_count |
45230 |
Number of tiles stored |
format |
png |
Tile image format |
tiles¶
MBTiles-compatible tile storage using the TMS (flipped Y) coordinate scheme.
CREATE TABLE tiles (
zoom_level INTEGER NOT NULL,
tile_column INTEGER NOT NULL,
tile_row INTEGER NOT NULL,
tile_data BLOB NOT NULL,
PRIMARY KEY (zoom_level, tile_column, tile_row)
);
zoom_level— Zoom level (typically 6-14).tile_column— X coordinate (column).tile_row— Y coordinate in TMS scheme (flipped from standard XYZ).tile_data— PNG image data.
Note
The get_tile() function accepts standard XYZ coordinates and handles the TMS conversion internally.
nodes¶
Road graph intersections (vertices).
Node IDs correspond to OSM node IDs, so the same intersection has the same ID across different builds from the same OSM data.
edges¶
Road graph segments connecting two nodes.
CREATE TABLE edges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
from_node INTEGER NOT NULL REFERENCES nodes(id),
to_node INTEGER NOT NULL REFERENCES nodes(id),
distance_m REAL NOT NULL,
duration_s REAL NOT NULL,
road_type TEXT NOT NULL DEFAULT 'road',
oneway INTEGER NOT NULL DEFAULT 0,
name TEXT DEFAULT ''
);
distance_m— Segment length in meters (haversine distance).duration_s— Estimated travel time in seconds, based on road type speed.road_type— OSM highway type (e.g.,primary,residential,track).oneway—1if this edge is one-way,0if bidirectional.name— Street name from OSM (may be empty).
Indexes:
pois¶
Points of interest extracted from OSM or added manually.
CREATE TABLE pois (
id INTEGER PRIMARY KEY AUTOINCREMENT,
lat REAL NOT NULL,
lon REAL NOT NULL,
yoro_code TEXT NOT NULL DEFAULT '',
name TEXT NOT NULL,
category TEXT NOT NULL DEFAULT 'other',
source TEXT NOT NULL DEFAULT 'local',
osm_id INTEGER,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Indexes:
SQLite pragmas¶
When opening a .yoromaps file, the following pragmas are set for performance:
Direct access¶
You can query a .yoromaps file directly with any SQLite client:
sqlite3 mali.yoromaps "SELECT COUNT(*) FROM nodes;"
sqlite3 mali.yoromaps "SELECT key, value FROM metadata;"
sqlite3 mali.yoromaps "SELECT COUNT(*) FROM tiles;"
Or from Python:
import sqlite3
conn = sqlite3.connect("mali.yoromaps")
conn.row_factory = sqlite3.Row
for row in conn.execute("SELECT key, value FROM metadata"):
print(f"{row['key']}: {row['value']}")
Compatibility¶
The .yoromaps format is plain SQLite, so it works with:
- Any SQLite client or library
- Django (via the built-in SQLite backend)
- DB Browser for SQLite (for visual inspection)
- Any language with SQLite bindings