Location Codes
From X,Y to Z
Encoding geographic coordinates into a string is a trivial thing. Yet, there are many grid based systemsM L S, Geohash, Mapcodes, Plus codes, O P C, N A C, XADDRESS, What3words, Zippr, MapTags, OkHi, Geokey, FB ...
Reinventing the wheel?
...
Geocode Attributes
-
→ Free
Same as Latitude,Longitude. (Eratosthenes circa 3rd century BC) -
Short
Optimal location encoding. -
Spatial Locality
2D <-> 1D -
Memorizable / Distinct
For Humans -
Deterministic
Must be generated offline. -
Unique
One to One
→ Free
And Open Source: https://github.com/eruci/geocode
Short
33.75850,-118.22020 → LA-ABXXD 40.78286,-73.974109 → NY-JSYXG City names are shortened to acronyms whenever possible.
Spatial Locality
33.75850,-118.22020 → LA-ABXXD 33.75860,-118.22020 → LA-ABXWY 33.75870,-118.22020 → LA-ABXWZ 33.75850,-118.22030 → LA-ABXWS 33.75850,-118.22040 → LA-ABXWT 33.75850,-118.22050 → LA-ABXWO
Memorizable / Distinct
LA-ABXXD → LONG-KUKOR-AYAZ Geonames have Levenshtein distance of at least 2.
Phonetic distance of at least 1 (Metaphone Algorithm).
Deterministic
Offline: use Geo::Code; my $g = Geo::Code->new(); my $geocode = $g->geocode(lat=>52.52699,lon=>13.40521); my $xy = $g->geocode(gc=>$geocode); my ($lat,$lon) = @$xy;
Unique
33.75850,-118.22020 → LA-ABXXD LA-ABXXD → 33.75850,-118.22020
Under the hood - The Algorithm
Divide Earth into 510100 'Hilbert' simple polygons → each polygon into squares → use skiplist data structures to name each square.
Each polygon is about 1000 km2, each square is about 100 m2 or 1 m2 (triple geoname version)
No Database is needed.
Hilbert Curve
Hilbert curve properties
- Quick Encoding/decoding
- Spatial locality preservation
3geonames.org
A triple geoname geocode for the world.
-
Resolution
1x1 metre grid of the world. -
Hilbert space of 720 trillion squares
latitude range of [90.00000,-90.00000]
and longitude range of [180.00000,-180.00000] -
3GeoName Geocode
A unique 3 geoname address for each 1x1 m2 cell.
Other Attributes
In addition to being precise, geocodes are also:
-
Fast
Just flipping bits. -
Worldwide
No discontinuities. Even at the 180th meridian.
-16.9074,+179.9999 : QOVU-BTDUH
-16.9074,+180.0000 : QOVU-BTLJA
-16.9074,-180.0000 : QOVU-BTLJA
-16.9074,-179.9999 : QOVU-BTLIZ -
Extendible/Customizable
Use custom wordlists without altering the code.
Customizations
-
Custom Geoname lists
Greater Levenshtein/Phonetic distance for better error correction. -
Adaptive Hilbert polygons
Variable size polygons for remote areas -
Other languages
Translated geonames based on geonames.org are available
API
Geocode.xyz