Skip to content
Open Location Code is a library to generate short codes, called "plus codes", that can be used as digital addresses where street addresses don't exist.
Java JavaScript Go C++ Python C Other
Branch: master
Clone or download

Latest commit

StephenBrown2 and zongweil Add Python 3.7, 3.8 and openjdk>8 to build matrix (#372)
* Add Python 3.7 and 3.8 to build matrix

* Set 'dist' to latest LTS: 'bionic'

* Set dist globally

* Add more javas (oracle/openjdk 9-13)

* Java 8 actually requires dist: trusty

* Bump down dist for Oracle Javas

* Remove Non-LTS oraclejdks

* Comment out failing java versions for now.
Latest commit a6eb95b Dec 30, 2019

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
android_demo Minor fix (proposal) Nov 15, 2017
c Update C to match C++ algorithm (#337) May 21, 2019
common-lisp Add link to common-lisp implementation Mar 11, 2019
cpp Fix floating point precision for C++ implementation (#332) May 14, 2019
csharp Add link to C# .NET Standard implementation Feb 22, 2018
dart Enable PR comments for Dart (#341) May 15, 2019
docs specification: fix typo in Digits section (#361) Sep 3, 2019
garmin/PlusCodeDatafield icons Dec 4, 2018
go Update to match c++ (#333) May 14, 2019
java minor style edits Jun 3, 2019
js Use Math.pow instead of ** (#342) May 15, 2019
objective-c Add README for Objective-C (#284) Apr 21, 2019
python Publish Python library to PyPi. (#356) Jul 23, 2019
ruby Fix frozen string checks (#348) May 27, 2019
rust Make argument names more idiomatic Jul 14, 2019
swift Update Swift README to include reference to the Open Location Code fo… Apr 23, 2019
test_data Update to match c++ implementation (#334) May 10, 2019
tile_server Update go implementation for floating point errors (#322) May 3, 2019
travis-utils Enable PR comments for Dart (#341) May 15, 2019
typescript Add typescript implementation link Jun 7, 2018
visualbasic Fix isValid() to invalidate short codes with padding (issues/273) (#274) Apr 22, 2019
.bazelrc Bazel 0.24.1 and cache closure builds in travis.yml Apr 25, 2019
.gitignore Use Math.pow instead of ** (#342) May 15, 2019
.travis.yml Add Python 3.7, 3.8 and openjdk>8 to build matrix (#372) Dec 30, 2019
API.txt Update API.txt Apr 1, 2016
CHANGELOG.md Change format of OLC codes from +xxxx.xxxxxx to xxxxxx+xx. Jan 30, 2015
CONTRIBUTING.md Update CONTRIBUTING.md Jul 1, 2019
FAQ.txt first commit Oct 27, 2014
LICENSE first commit Oct 27, 2014
README.md Added link to wiki on line 72 to make it intuitive Apr 4, 2019
TESTING.md Fix typos in build documentation Jan 18, 2018
WORKSPACE Bazel 0.24.1 and cache closure builds in travis.yml Apr 25, 2019
package.json Create package.json Jun 17, 2016

README.md

Open Location Code

Build Status CDNJS

Open Location Code is a technology that gives a way of encoding location into a form that is easier to use than latitude and longitude. The codes generated are called plus codes, as their distinguishing attribute is that they include a "+" character.

The technology is designed to produce codes that can be used as a replacement for street addresses, especially in places where buildings aren't numbered or streets aren't named.

Plus codes represent an area, not a point. As digits are added to a code, the area shrinks, so a long code is more precise than a short code.

Codes that are similar are located closer together than codes that are different.

A location can be converted into a code, and a code can be converted back to a location completely offline.

There are no data tables to lookup or online services required. The algorithm is publicly available and can be used without restriction.

Links

Description

Codes are made up of a sequence of digits chosen from a set of 20. The digits in the code alternate between latitude and longitude. The first four digits describe a one degree latitude by one degree longitude area, aligned on degrees. Adding two further digits to the code, reduces the area to 1/20th of a degree by 1/20th of a degree within the previous area. And so on - each pair of digits reduces the area to 1/400th of the previous area.

As an example, the Parliament Buildings in Nairobi, Kenya are located at 6GCRPR6C+24. 6GCR is the area from 2S 36E to 1S 37E. PR6C+24 is a 14 meter wide by 14 meter high area within 6GCR.

A "+" character is used after eight digits, to break the code up into two parts and to distinguish codes from postal codes.

There will be locations where a 10 digit code is not sufficiently precise, but refining it by a factor of 20 is i) unnecessarily precise and ii) requires extending the code by two digits. Instead, after 10 digits, the area is divided into a 4x5 grid and a single digit used to identify the grid square. A single grid refinement step reduces the area to approximately 3.5x2.8 meters.

Codes can be shortened relative to a location. This reduces the number of digits that must be remembered, by using a location to identify an approximate area, and then generating the nearest matching code. Shortening a code, if possible, will drop four or more digits from the start of the code. The degree to which a code can be shortened depends on the proximity of the reference location.

If the reference location is derived from a town or city name, it is dependent on the accuracy of the geocoding service. Although one service may place "Zurich" close to the Google office, another may move it by a hundred meters or more, and this could be enough to prevent the original code being recovered. Rather than a large city size feature to generate the reference location, it is better to use smaller, neighbourhood features, that will not have as much variation in their geocode results.

Guidelines for shortening codes are in the wiki.

Recovering shortened codes works by providing the short code and a reference location. This does not need to be the same as the location used to shorten the code, but it does need to be nearby. Shortened codes always include the "+" character so it is simple to compute the missing component.

  • 8F+GG is missing six leading characters
  • 6C8F+GG is missing four leading characters

Example Code

The subdirectories contain sample implementations and tests for different languages. Each implementation provides the following functions:

  • Test a code to see if it is a valid sequence
  • Test a code to see if it is a valid full code Not all valid sequences are valid full codes
  • Encode a latitude and longitude to a standard accuracy (14 meter by 14 meter) code
  • Encode a latitude and longitude to a code of any length
  • Decode a code to its coordinates: low, high and center
  • Shorten a full code relative to a location
  • Extend a short code relative to a location
You can’t perform that action at this time.