【问题标题】:geohash string length and accuracygeohash 字符串长度和准确性
【发布时间】:2012-11-07 01:37:22
【问题描述】:

geohash 字符串的长度越多越准确。但是是否有任何直接关系,例如长度为 7 它提供 100 米的精度,

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

我正在使用 geohash 来查找给定 geohash 的所有附近位置,以及它们的距离

还有任何直接计算两个地理哈希之间距离的方法吗? (一种方法是将它们解码为 lat/lng,然后计算距离)

谢谢

【问题讨论】:

  • 没有一个答案给出1米进动需要多少字符串长度

标签: geohashing


【解决方案1】:

看到很多关于地理哈希的困惑,所以我发布了我到目前为止的理解。 geohash 背后的原理很简单,你可以创建自己的版本。 例如考虑以下地理点,

156.34234534,-23.343423345

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

如果您还记得赤道处地球的学校地理周长约为 40,000 公里,并且, 地球周围的度数(纬度或经度)是 360。所以在最宽 一点经纬度跨度大约等于110kms(40,000/360)。

因此,如果您将上述坐标编码为“156-23”(包括负号),这将为您提供 (110kmx110km) 框。

您可以继续提高精度, 分钟的第一个数字(156.3-23.3)会给你(10kmx10km)盒子(每分钟跨度等于1km)。

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

【讨论】:

    【解决方案2】:

    我自己对此很好奇。 如果它对任何人有好处,我会整理一个电子表格here 不是 100% 确定它是正确的 - 如果您发现问题,请随时发表评论。

    从下图判断,使用 6 到 10 位数字在纬度 60 度时的精度约为 1 公里到 1 米。

    【讨论】:

      【解决方案3】:

      以下是长度为 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

      【讨论】:

      • 我知道这篇文章已经过时了,但谷歌一直在为任何与“geohash”和“精确度”相关的内容提出这篇文章,所以......我认为第二个论坛是错误的,'-1 ' 应该在 /2 之外,即我认为第二个应该是:width = 180 / (2^(((5n+parity(n))/2)-1))
      • 我同意,谢谢!幸运的是,项目中的代码也同意。我只是把它记录得很糟糕。
      • @DaveMoten 作为 geohash 专家,对我的 GIS SE 问题有什么想法 - gis.stackexchange.com/questions/333150/… ?
      【解决方案4】:

      还有任何直接计算两个地理哈希之间距离的方法吗? (一种方法是将它们解码为 lat/lng,然后计算距离)

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

      在尝试根据一对点之间的公共前缀的长度推断接近度时,请务必小心。如果有一个长的公共前缀,那么它们是接近的,但反之则不正确! -- 即没有公共前缀的两点可能相隔一毫米。

      【讨论】:

      • 谢谢大卫,关于第一次查询还有什么想法吗?
      • 使用维基百科的 Geohash 定义中的表格。我以前做过 Excel 公式来查看精度,我想我也用 Java 编码过。
      • 你可以做二进制距离。小距离也是如此。
      • @DavidSmiley 作为 geohash 专家对我的问题有什么想法 - gis.stackexchange.com/questions/333150/… ?
      【解决方案5】:

      这是一个方程(伪代码),它可以近似具有一定精度的纬度/经度对的最佳 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
      

      我已经使用它从gpsddaemon 接收的数据中创建最佳 Geohash,它还通过 epxepy 值提供精度信息。

      【讨论】:

        猜你喜欢
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多