2012-11-19 272 views
9

如果geohash字符串的长度更长,则更准确。但有没有直接的关系,如果长度是7它提供100米精度,geohash字符串的长度和精度

即,如果两个geohash(和它们的边界框中的任何一个)具有前7个字符匹配,两者应该接近100米等?

我使用地理散列查找,所有近由给定的地理散列的位置,与他们的距离

而且任何directway 2个地理散列之间计算距离? (一种方式是对它们进行解码,以纬度/经度,然后计算距离)

由于

+0

没有一个单一的答案给**多少字符串长度需要1米precesion ** – Atul

回答

10

看到geohashing很多困惑,所以我张贴我的理解到目前为止。 geohash背后的原理非常简单,您可以创建自己的版本。 例如考虑以下的地理点,

156.34234534,-23.343423345

在上述例子中,156表示度,DECMAL后2位数字(34)表示 十进制分钟和休息,(34.5334 )代表秒。

如果你还记得在地球赤道的中学地理周长约40,000kms和, 号绕地球(纬度经度或)度是360。因此,在最广泛的 点的每度纬度和经度跨度等于约110公里(40,000/360)。

所以如果你把上面的坐标编码为“156-23”(包括负号),这会给你(110kmx110km)的方框。

你可以继续增加精度, 分钟的第一位数字(156.3-23.3)会给你(10公里x10公里)的盒子(每分钟等于1公里)。

增加这个包括第一个数字你得到(100mx100m)框, 每个额外的数字将增加精度到另一个程度。 Geohashing只是以编码形式表示上图的方式。你也可以愉快地使用上面的格式!

2

而且任何directway 2地理散列之间计算距离是多少? (一种方法是将它们解码为经纬度,然后计算距离)

这就是你应该做的。将geohash看作是经度和纬度的另一种表示形式,因为一对打印的十进制数字同样如此。如果我给了你一对lon字符串,你可以将它们解析为数字(用你选择的编程语言),然后做数学运算。这与geohashes没什么不同 - 解码为lat然后做数学运算。

对于您试图根据一对点之间的公共前缀长度来推断亲密度的任何推理都要非常小心。如果有一个长共同的前缀,那么他们是接近,但反过来不是真的! - 即没有共同前缀的两点可能相距一毫米。

+0

谢谢大卫,关于第一个查询以及任何想法? –

+1

使用维基百科的Geohash定义中的表格。我之前完成了Excel公式以查看精度,我认为我也用Java编码了。 –

+0

谢谢,非常有帮助 –

4

下面是在度的长度为n个字符的地理散列的高度和宽度的公式:如果n是偶数,否则

       奇偶(N)= 0:

首先定义该功能1

然后

       高度= 180/2 (5N奇偶校验(N))/ 2

       宽度= 180/2 (5N +奇偶校验(N)-2)/ 2

注意,这是仅以度数表示的高度和宽度。要将其转换为米,需要知道散列在地球上的什么位置。

这个在java中的代码是http://github.com/davidmoten/geo

+0

我知道这篇文章是旧的,但谷歌不断提出这个帖子与'geohash'和'precision'有关的任何事情,所以...我认为第二个forumla是错的,'-1'应该在/ 2,即我认为第二应该是:'width = 180 /(2 ^(((5n + parity(n))/ 2)-1))' – stripybadger

+0

我同意,谢谢!幸运的是,项目中的代码也同意。我刚刚记录在案。 –

10

对此我很好奇。 如果对任何人都有好处,我可以将电子表格放在一起here 不是100%确定其正确性 - 如果您发现问题,请随时发表评论。

用下面的图表来判断,使用6到10位数字可以在60度纬度处提供〜1km到〜1m的精度。 enter image description here

1

下面是一个方程(在伪代码),可以逼近最优地理散列长度具有一定精度的纬度/经度对:

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 

我用它来从创建最佳地理散列由gpsd守护程序接收的数据,它们还通过epxepy值提供精确信息。