Я пытаюсь написать функцию геохеширования, которая принимает пару широта/долгота и возвращает строку base2 (геохэш, преобразованный в base32). Однако это дает мне неправильные результаты. Что с этим не так?
public static void main(String[] args) {
float latitude = 45.512794f;
float longitude = -122.679565f;
System.out.println(geoHash(latitude, longitude));
}
private static String geoHash(float lat, float lng) {
float lowLat = -90.0f;
float highLat = 90.0f;
float lowLng = -180.0f;
float highLng = 180.0f;
return geoHash(lowLng, highLng, lowLat, highLat, lat, lng, "");
}
private static String geoHash(float lowLng, float highLng, float lowLat, float highLat, float lat, float lng, String hash) {
if (hash.length() == 30)
return hash;
float midLat = (lowLat + highLat) / 2;
float midLng = (lowLng + highLng) / 2;
if (lng <= midLng && lat <= midLat) {
return geoHash(lowLng, midLng, lowLat, midLat, lat, lng, hash + "00");
} else if (lng > midLng && lat <= midLat) {
return geoHash(midLng, highLng, lowLat, midLat, lat, lng, hash + "01");
} else if (lng <= midLng && lat > midLat) {
return geoHash(lowLng, midLng, midLat, highLat, lat, lng, hash + "10");
} else {
return geoHash(midLng, highLng, midLat, highLat, lat, lng, hash + "11");
}
}
Я получаю 101001000100000011011010100011, который преобразуется в kh0dl3 base32, и я ожидаю 11000001000000011110101110110, который преобразуется в c20fbm.
чего я не понимаю, так это того, что первые две пары битов совпадают в результате, который я получаю от своей функции (1010), что означает, что он дважды попадает в один и тот же квадрант. В фактическом конвертированном геохэше, который я нашел в Интернете, это два разных квадранта (1100).
Изменить: после дальнейшей отладки и с помощью выбранного ответа я обнаружил, что неправильно декодировал базу 32 (я использовал 4 бита вместо 5). Я также должен был использовать таблицу, найденную на https://en.wikipedia.org/wiki/Geohash а>. В моем коде также есть ошибка, исправленная ниже:
private static String geoHash(float lowLng, float highLng, float lowLat, float highLat, float lat, float lng, String hash) {
if (hash.length() == 30)
return hash;
float midLng = (lowLng + highLng) / 2.0f;
float midLat = (lowLat + highLat) / 2.0f;
if (lng <= midLng && lat <= midLat) {
return geoHash(lowLng, midLng, lowLat, midLat, lat, lng, hash + "00");
} else if (lng <= midLng && lat > midLat) {
return geoHash(lowLng, midLng, midLat, highLat, lat, lng, hash + "01");
} else if (lng > midLng && lat <= midLat) {
return geoHash(midLng, highLng, lowLat, midLat, lat, lng, hash + "10");
} else {
return geoHash(midLng, highLng, midLat, highLat, lat, lng, hash + "11");
}
}