A Ooru address is a path down a hierarchy of squares, computed entirely in a projected, metric coordinate system. There is no lookup table of places and no database — the same input always produces the same output, offline, in under a microsecond.
1. Datum and coordinate reference systems
Two CRSs are involved, and the discipline of never mixing them is what makes the cells honest.
- EPSG:4326 — WGS84 geographic is the interfaceCRS: degrees of latitude and longitude. It is what a GNSS receiver reports and what a URL carries. Degrees are not a metric unit — a degree of longitude is about 108.5 km at Chennai’s latitude and 0 km at the pole — so no grid arithmetic is ever done in it.
- EPSG:32644 — WGS84 / UTM zone 44N is the workingCRS: a Transverse Mercator projection with central meridian 81°E, scale factor 0.9996 and false easting 500,000 m. Its units are metres, so a “250 m cell” is genuinely 250 m on the ground rather than 250 m of longitude that quietly narrows as you move north.
Why zone 44N
UTM zone 44 spans 78°E–84°E. The Chennai Metropolitan Area sits between roughly 79.94°E and 80.40°E — entirely inside the zone, with no zone-edge straddle to special-case. The point scale factor follows
Over this extent that gives 0.999652 at the eastern edge and 0.999763 at the western edge. Both deviate from 1 by a few hundred parts per million, but that absolute deviation is not the number that matters.
Web Mercator (EPSG:3857) was rejected outright: it is not equal-area, and at 13°N its scale error of about 2.6 % would make cells visibly non-square on the ground. It appears in this project only where it is unavoidable — inside the basemap’s tile addressing.
2. The nested tessellation
The grid is anchored at a fixed round UTM coordinate — easting 3,85,000 m, northing 14,15,000 m — and extends 50 km east by 60 km north.
| Level | Cell | Lattice | Cells per parent | Word means |
|---|---|---|---|---|
| 1 · Region | 5 km | 10 × 12 | 120 | which 5 km part of the metropolitan area |
| 2 · Locality | 250 m | 20 × 20 | 400 | which 250 m block within that region |
| 3 · Spot | 12.5 m | 20 × 20 | 400 | which 12.5 m square within that block |
| 4 · Pinpoint | 3.13 m | 4 × 4 | 16 | which 3.125 m quarter within that square — optional, off by default |
Why 20 × 20 and not 10 × 10
A subdivision factor of 20 rather than 10 buys two things. The terminal cell becomes 12.5 m rather than 50 m — 50 m is coarser than a city block and fails the core case of “which of these four doorways”. And a 400-word block is large enough to carry real semantic structure when laid out as a 20 × 20 map, whereas a 100-word block is too small for embedding neighbourhoods to be legible. The cost is vocabulary size: 920 words rather than 320.
3. Encoding, step by step
Encoding is a descent: each level consumes its share of the offset from the origin and hands the remainder to its child. Here is the real arithmetic for 13.0499, 80.2824 — a point on Marina Beach.
- Project to EPSG:32644 → E 422196.2 m, N 1442764.0 m.
- Subtract the origin → ΔE 37196.2 m, ΔN 27764.0 m.
- Level 1 (5 km cells): col =
floor(37196.2 / 5000)= 7, row =floor(27764.0 / 5000)= 5. Flat index = 5 × 10 + 7 = 57, which the level-1 lexicon maps tocavern. - Level 2 (250 m cells): col =
floor(2196.2 / 250)= 8, row =floor(2764.0 / 250)= 11. Flat index = 11 × 20 + 8 = 228, which the level-2 lexicon maps toorganza. - Level 3 (12.5 m cells): col =
floor(196.2 / 12.5)= 15, row =floor(14.0 / 12.5)= 1. Flat index = 1 × 20 + 15 = 35, which the level-3 lexicon maps topanther.
The result is cavern.organza.panther, naming a 12.5 m square of 156 m². Decoding runs the same descent backwards; the address resolves to the cell’s centre, so the worst-case distance between the point you encoded and the point you get back is half a cell diagonal — 8.84 m.
4. What the structure buys
- Containment is prefix comparison. Cell
[4, 91]is the parent of[4, 91, 213], and you can read that off the address without computing anything. No geometry, no tolerance. - Every prefix is a valid address.
cavernalone names a real 5 km cell. This is progressive disclosure, and it is a privacy control: you can say where you are to 5 km without revealing your doorway. - Adjacency is computable. Converting the path to absolute lattice coordinates is a mixed-radix numeral conversion; stepping ±1 and converting back gives the neighbouring cell, crossing parent boundaries without a special case.
- A word announces its level. Each level draws from a disjoint semantic domain, so a transposed address is rejected rather than silently resolved to somewhere else.
| Get this word wrong | You stay within | Worst-case error |
|---|---|---|
| Word 1 (Region) | the whole extent | 84.9 km |
| Word 2 (Locality) | the level-1 cell | 7.1 km |
| Word 3 (Spot) | the level-2 cell | 354 m |