This is a followup question for Geohash.
Convert a Geohash string to latitude and longitude.
Try http://geohash.co/.
Check how to generate geohash on wiki: Geohash or just google it for more details.
Example
Example1
Input: "wx4g0s"`
Output: lat = 39.92706299 and lng = 116.39465332
Example2
Input: "w"
Output: lat = 22.50000000 and lng = 112.50000000
Code (Java):public class GeoHash {
/*
* @param geohash: geohash a base32 string
* @return: latitude and longitude a location coordinate pair
*/
public double[] decode(String geohash) {
// step1: get binary code
//
String binaryGeoHash = getBinaryGeoHash(geohash);
// step 2: get binary representation of the long and latitude
String[] binaryLongLati = getBinaryLongAndLati(binaryGeoHash);
double longtitude = getLocation(binaryLongLati[0], -180, 180);
double latitude = getLocation(binaryLongLati[1], -90, 90);
double[] ans = new double[2];
ans[0] = latitude;
ans[1] = longtitude;
return ans;
}
private double getLocation(String code, double start, double end) {
double mid = start + (end - start) / 2;
for (int i = 0; i < code.length(); i++) {
if (code.charAt(i) == '0') {
end = mid;
} else {
start = mid;
}
mid = start + (end - start) / 2;
}
return mid;
}
private String[] getBinaryLongAndLati(String binaryGeoHash) {
String[] ans = new String[2];
StringBuilder longtitude = new StringBuilder();
StringBuilder latitude = new StringBuilder();
for (int i = 0; i < binaryGeoHash.length(); i += 2) {
longtitude.append(binaryGeoHash.charAt(i));
if (i + 1 < binaryGeoHash.length()) {
latitude.append(binaryGeoHash.charAt(i + 1));
}
}
ans[0] = longtitude.toString();
ans[1] = latitude.toString();
return ans;
}
private String getBinaryGeoHash(String geohash) {
String dict = "0123456789bcdefghjkmnpqrstuvwxyz";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < geohash.length(); i++) {
int base32 = dict.indexOf(geohash.charAt(i));
sb.append(toBase2(base32));
}
return sb.toString();
}
private String toBase2(int num) {
StringBuilder sb = new StringBuilder();
while (num > 0) {
sb.insert(0, num % 2);
num /= 2;
}
// pad with zeros
while (sb.length() < 5) {
sb.insert(0, '0');
}
return sb.toString();
}
}
No comments:
Post a Comment