gpt4 book ai didi

java - GeoHash 函数没有返回正确的结果

转载 作者:行者123 更新时间:2023-11-29 09:27:40 27 4
gpt4 key购买 nike

我正在尝试编写一个 geohashing 函数,该函数采用纬度/经度对并返回其 base2(geohash 一旦转换为 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) 得到的结果中是相同的,这意味着它两次击中同一个象限。我在网上找到的实际转换后的 geohash 是两个不同的象限(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");
}
}

最佳答案

无论您从何处获得预期的字符串,该来源都在撒谎。首先,您预期的 String 只有 29 个字符长,这意味着缺少 1 个字符。此外,前两位需要是 01 , 因为经度为负而纬度为正。

但是您的代码中仍然存在一个错误:如果我正确理解了 geohash 的组成,您正在切换附加到 hash 的经度和纬度位。 (处理 ifgeoHash(float, float, float, float, float, float, String)lng 方法中的第二个和第三个 lat 子句)。

更新

经过进一步调查,您得到意外结果的另一个原因似乎是,显然,base32 和 base2 之间可能存在不止一种转换。我尝试了一些我能找到的在线解码器/编码器,它们都给了我你在问题中提到的结果。然而,在阅读维基百科页面后Geohash , 似乎用于将 geohashes 从 base2 编码为 base32 的算法不同。

例如,让我们检查一下您实际获得的 geohash(因此不会出现遗漏数字的歧义)。您的方法返回 101001000100000011011010100011 ,你声称翻译成 kh0dl3 .没错,当我输入它时 here ,我也得到了这个结果。但是让我们仔细看看。前 5 个字符是 10100 ,或者,转换为十进制表示法,12 (base2 字符串中的 5 个字符对应于 base32 字符串中的一个字符,因此我们需要一次取 5 个字符)。输入10100进入我刚刚链接到产量的页面K , kh0dl3 的第一个字符,正如预期的那样。但是,根据维基百科 Geohash 页面中的表格,12不会翻译成 k , 但到 d .很明显,geohashes 的 base32-base2-conversion 算法与您用来获得预期结果的算法不同。

关于java - GeoHash 函数没有返回正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com