如果 geohash 字符串的长度更长,则更准确。但是是否有任何直接关系,例如长度为 7 它提供 100 米的精度,
即如果两个geohash(以及它们的任何一个边界框)具有前7个字符匹配,那么两者都应该接近100米等?
我正在使用 geohash 来查找给定 geohash 的所有附近位置,以及它们的距离
还有任何直接计算两个地理哈希之间距离的方法吗?(一种方法是将它们解码为 lat/lng,然后计算距离)
谢谢
如果 geohash 字符串的长度更长,则更准确。但是是否有任何直接关系,例如长度为 7 它提供 100 米的精度,
即如果两个geohash(以及它们的任何一个边界框)具有前7个字符匹配,那么两者都应该接近100米等?
我正在使用 geohash 来查找给定 geohash 的所有附近位置,以及它们的距离
还有任何直接计算两个地理哈希之间距离的方法吗?(一种方法是将它们解码为 lat/lng,然后计算距离)
谢谢
看到很多关于 geohashing 的困惑,所以我发布了我到目前为止的理解。geohash 背后的原理很简单,你可以创建自己的版本。例如考虑以下地理点,
156.34234534,-23.343423345
在上面的例子中,156 代表度数,小数后的 2 位数字 (34) 代表十进制分钟和休息,(34.5334) 代表秒。
如果您还记得赤道的地球地理周长约为 40,000 公里,地球周围的度数(纬度或经度)为 360。因此,在最宽处,每个纬度和经度跨度大约等于 110 公里(40,000/360 )。
因此,如果您将上述坐标编码为“156-23”(包括负号),这将为您提供 (110kmx110km) 框。
你可以继续增加精度,分钟的第一个数字(156.3-23.3)会给你(10kmx10km)框(每分钟跨度等于1km)。
增加这个以包括你得到 (100mx100m) 框的第二个数字,每个额外的数字都会将精度提高到另一个程度。Geohashing 只是以编码形式表示上图的方式。您也可以愉快地使用上述格式!
我自己对此很好奇。如果它对任何人有好处,我在这里整理了一个电子表格 不是 100% 肯定它是正确的 - 如果您发现问题,请随时发表评论。
从下图判断,使用 6 到 10 位数字在纬度 60 度时的精度约为 1 公里到 1 米。
以下是长度为 n 个字符的 geohash 的高度和宽度的公式:
首先定义这个函数:
parity(n) = 0 如果 n 是偶数,否则为 1
然后
高度 = 180 / 2 (5n-parity(n))/2度
宽度 = 180 / 2 (5n+parity(n)-2)/2度
请注意,这只是以度为单位的高度和宽度。要将其转换为米,您需要知道哈希值在地球上的哪个位置。
Java 中的代码位于http://github.com/davidmoten/geo。
还有任何直接计算两个地理哈希之间距离的方法吗?(一种方法是将它们解码为 lat/lng,然后计算距离)
那是你应该做的。将 geohash 视为纬度和经度的另一种表示形式,因为一对打印的十进制数字也是如此。如果我给您一对 lat & lon 字符串,您会将它们解析为数字(使用您选择的编程语言),然后进行数学运算。与 geohashes 没有什么不同——解码为 lat & lon 然后做数学。
在尝试根据一对点之间的公共前缀的长度推断接近度时,请务必小心。如果有一个长的公共前缀,那么它们是接近的,但反过来不是真的!-- 即没有公共前缀的两点可能相距一毫米。
这是一个方程(在伪代码中),它可以近似具有一定精度的纬度/经度对的最佳 Geohash 长度:
geohash_length = FLOOR ( LOG_2(5000000/precision_in_meters) / 2,5 + 1 )
if geohash_length > 12 then geohash_length = 12
if geohash_length < 1 then geohash_length = 1
我已经使用它从守护程序接收到的数据创建最佳 Geohash ,它还通过和值gpsd
提供精度信息。epx
epy