# Geohash

Geohash is a latitude/longitude geocode system invented by Gustavo Niemeyer when writing the web service at geohash.org, and put into the public domain. It is a hierarchical spatial data structure which subdivides space into buckets of grid shape.

Geohashes offer properties like arbitrary precision and the possibility of gradually removing characters from the end of the code to reduce its size (and gradually lose precision).

As a consequence of the gradual precision degradation, nearby places will often (but not always) present similar prefixes. Conversely, the longer a shared prefix is, the closer the two places are.

## Service

The purpose of the geohash.org service, launched in February 2008, is to offer short URLs which uniquely identify positions on the Earth, so that referencing them in emails, forums, and websites is more convenient.

To obtain the Geohash, the user provides an address to be geocoded, or latitude and longitude coordinates, in a single input box (most commonly used formats for latitude and longitude pairs are accepted), and performs the request.

Besides showing the latitude and longitude corresponding to the given Geohash, users who navigate to a Geohash at geohash.org are also presented with an embedded map, and may download a GPX file, or transfer the waypoint directly to certain GPS receivers. Links are also provided to external sites that may provide further details around the specified location.

For example, the coordinate pair 57.64911,10.40744 (near the tip of the peninsula of Jutland, in Denmark) produces a slightly shorter hash of u4pruydqqvj, which can be used in the URL http://geohash.org/u4pruydqqvj

## Uses

The main usages of Geohashes are

• as a unique identifier.
• represent point data e.g. in databases.

Geohashes have also been proposed to be used for geotagging.

When used in a database, the structure of geohashed data has two advantages. First, data indexed by geohash will have all points for a given rectangular area in contiguous slices (the number of slices depends on the precision required and the presence of geohash "fault lines"). This is especially useful in database systems where queries on a single index are much easier or faster than multiple-index queries. Second, this index structure can be used for a quick-and-dirty proximity search - the closest points are often among the closest geohashes.

## Example

Using the hash ezs42 as an example, here is how it is decoded into a decimal latitude and longitude

### Decode from base 32

The first step is decoding it from base 32 using the following character map:

 Decimal Base 32 Decimal Base 32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 b c d e f g 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 h j k m n p q r s t u v w x y z

This operation results in the bits 01101 11111 11000 00100 00010. Assuming that counting starts at 0 in the left side, the even bits are taken for the longitude code (0111110000000), while the odd bits are taken for the latitude code (101111001001).

### Decode binary to decimal

Each binary code is then used in a series of divisions, considering one bit at a time, again from the left to the right side. For the latitude value, the interval -90 to +90 is divided by 2, producing two intervals: -90 to 0, and 0 to +90. Since the first bit is 1, the higher interval is chosen, and becomes the current interval. The procedure is repeated for all bits in the code. Finally, the latitude value is the center of the resulting interval. Longitudes are processed in an equivalent way, keeping in mind that the initial interval is -180 to +180.

Finishing the procedure should yield approximately latitude 42.6 and longitude -5.6.

### Worked example

Here's a worked example decoding 101111001001 into 42.6. To start with, we know the latitude is somewhere in the range −90 to 90. With no bits, we'd have to guess the latitude was 0, giving us an error of ±90. With one bit, we can decide whether its in the range −90 to 0, or 0 to 90. The first bit is high, so we know our latitude is somewhere between 0 and 90. Without any more bits, we'd guess the latitude was 45, giving us an error of ±45.

Each subsequent bit halves this error. This table shows the effect of each bit. At each stage, the relevant half of the range is highlighted in green; a low bit selects the lower range, a high bit the upper range.

The last column shows the latitude, simply the mean value of the range. Each subsequent bit makes this value more precise.

bit min mid max val err
1 -90.000 0.000 90.000 45.000 45.000
0 0.000 45.000 90.000 22.500 22.500
1 0.000 22.500 45.000 33.750 11.250
1 22.500 33.750 45.000 39.375 5.625
1 33.750 39.375 45.000 42.188 2.813
1 39.375 42.188 45.000 43.594 1.406
0 42.188 43.594 45.000 42.891 0.703
0 42.188 42.891 43.594 42.539 0.352
1 42.188 42.539 42.891 42.715 0.176
0 42.539 42.715 42.891 42.627 0.088
0 42.539 42.627 42.715 42.583 0.044
1 42.539 42.583 42.627 42.605 0.022

(The numbers in the above table have been rounded to 3 decimal places for clarity)

Final rounding should be done carefully in a way that

$\min \le \mathrm{round}(value) \le \max$

So if rounding 42.605 to 42.61 or 42.6 is correct, rounding to 43 it is not.

geohash length lat bits lng bits lat error lng error km error
1 2 3 ±23 ±23 ±2500
2 5 5 ± 2.8 ± 5.6 ±630
3 7 8 ± 0.70 ± 0.7 ±78
4 10 10 ± 0.087 ± 0.18 ±20
5 12 13 ± 0.022 ± 0.022 ±2.4
6 15 15 ± 0.0027 ± 0.0055 ±0.61
7 17 18 ±0.00068 ±0.00068 ±0.076
8 20 20 ±0.000085 ±0.00017 ±0.019

## Limitations

One limitation of the Geohash algorithm is in attempting to utilize it to find points in proximity to each other based on a common prefix. Edge case locations close to each other but on opposite sides of the Equator or a meridian can result in Geohash codes with no common prefix.[1]

Secondly, a geohash essentially defines a bounding box within which a location lies, therefore two locations may be spatially very close but have different geohashes. In order to be useful to proximity searches, the surrounding eight geohashes of a geohash must be calculated and the locations matching these pulled out, therefore complicating potential usage in proximity searches.

Thirdly, since a geohash (in this implementation) is based on coordinates of longitude and latitude distance calculations degrade in accuracy with increasing latitude, due to the decreasing distance between meridians. At the Equator the length of a degree of longitude is 111.320km, while a degree of latitude measures 110.574km, an error of 0.67%. At 30 degrees of latitude the error is 110.852/96.486 = 14.89%, at 60 degrees it is 111.412/55.800 = 99.67%, reaching ∞ (infinity) at the poles. While it is possible to apply geohashing to an area with a cartesian coordinate system, it would then only apply to the area where the coordinate system applies.

Despite those issues, there are possible workarounds, and the algorithm has been successfully used in MongoDB and HBase to implement proximity searches.[2]

An alternative to storing Geohashes as strings in a database are Locational codes, which are also called spatial keys and similar to QuadTiles.[3][4]

## License and patents

The Geohash geocode has been put in the public domain by its inventor in the public announcement date, on February 26, 2008.[5]

While comparable algorithms have been successfully patented[6] and had copyright claimed upon,[7][8] GeoHash is based on an entirely different algorithm and approach.