Skip to content

Instantly share code, notes, and snippets.

@1999
Created December 7, 2011 10:30
Show Gist options
  • Save 1999/1442317 to your computer and use it in GitHub Desktop.
Save 1999/1442317 to your computer and use it in GitHub Desktop.
Javascript geohash implementation
Array.prototype.average = function() {
var i, len, sum = 0;
for (i=0, len=this.length; i<len; i++) {
sum += this[i];
}
return sum / this.length;
};
GeoHash = {
'generate' : function(latitude, longitude, geohashLength) {
}, 'decode' : function(hash) {
var i, j, len, symbol, index, tmp, interval,
binaryValue = '',
latitudeBinary = '',
longitudeBinary = '',
lat = 0,
lng = 0,
base32 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "b", "c", "d", "e", "f", "g", "h", "j", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
for (i=0, len=hash.length; i<len; i++) {
symbol = hash.substr(i, 1);
index = base32.indexOf(symbol);
if (index === -1) {
return false;
}
tmp = index.toString(2);
if (tmp.length < 5 ) {
for (j=tmp.length; j<5; j++) {
tmp = '0' + tmp;
}
}
binaryValue += tmp;
}
for (i=0, len=binaryValue.length; i<len; i++) {
if (i%2 === 0) {
longitudeBinary += binaryValue.substr(i, 1);
} else {
latitudeBinary += binaryValue.substr(i, 1);
}
}
// calculate latitude
interval = [-90, 90];
for (i=0, len=latitudeBinary.length; i<len; i++) {
tmp = parseInt(latitudeBinary.substr(i, 1), 10);
if (tmp === 1) {
interval[0] = interval.average();
} else {
interval[1] = interval.average();
}
lat = interval.average();
}
// calculate longitude
interval = [-180, 180];
for (i=0, len=longitudeBinary.length; i<len; i++) {
tmp = parseInt(longitudeBinary.substr(i, 1), 10);
if (tmp === 1) {
interval[0] = interval.average();
} else {
interval[1] = interval.average();
}
lng = interval.average();
}
return [lat, lng];
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment