【问题标题】:Hash/key creation function for latitude longitude?纬度经度的哈希/密钥创建功能?
【发布时间】:2009-11-08 17:19:03
【问题描述】:

我有与纬度/经度值相关的数据块。我想从纬度/经度值创建一个查找键/哈希值,以便它可以用作对地图或类似内容的查找。

我对 West 和 South 使用负值...因此 5W, 10S 在程序中表示为 -5, -10。

如果可能,我希望能够从键值中获取纬度/经度值。

派生值必须是某种整数值。

我正在使用 C/C++ :)

谢谢,我很乐意回答任何问题!

【问题讨论】:

  • 您的哈希输出可以有多大(以字节为单位)?
  • 为什么不使用 std::map。只需要定义操作符
  • blah...Martin 这可能会奏效 :) 有时你需要别人告诉你你没有使用常识

标签: c++ c stl hash


【解决方案1】:

您并不是真的在寻找哈希(哈希通常会分散底层键,而且它们还允许发生冲突)。

我认为像下面这样的简单公式可以解决问题,而且它是可逆的。

[pseudo code]
Precision = 100       // lat and long precsion, boost to 1000 if need be
LatOffset = 1000      // Anithing above 180 would do

Key = ((int)(Lat * Precision) * LatOffset) + (int)(Long * Precision)

反转

Long = (Key Modulo (LatOffset * Precision)) Div Precision
Lat  = (Key Div (LatOffset * Precision)) Div Precision )

编辑:糟糕,我没有注意到这是在 C 中。确实,使用 jheddings 的解决方案(或其变体(要求“哈希”键是整数)。

【讨论】:

    【解决方案2】:

    正如 mjv 所指出的,散列通常会混淆原始输入数据。相反,听起来您只是想组合这些值。

    为简单起见,您只需为“哈希”定义一个新类型:

    typedef struct {
        float lat;
        float lon;
    } latlon;
    

    您可以将其视为 64 位数字。并像这样使用它:

    float lat = -5.432;
    float lon = 10.3423;
    latlon pair = {
        .lat = lat,
        .lon = lon,
    };
    

    【讨论】:

      【解决方案3】:

      您是否 100% 确定哈希在这里是合适的?仅当您知道要查找的键的确切值时,哈希查找才有效,并且 (AFAIK) 纬度/经度值并不总是准确知道。

      例如,假设您有一条记录存储在键 (-5.432, 10.3423) 下,而其他人想知道在 (-5.0, +10.0) 的 1.0 半径内存储了哪些记录。或者他们可能想查找记录,但由于计算中的浮点舍入,他们将 (-5.431999, 10.3423001) 作为其关键值。在这些情况下,散列无法帮助您。要进行这种空间/不精确查找,您最好使用更专业的数据结构,如八叉树(或它们的二维等价物)。

      【讨论】:

      • 我只会将记录存储为整数...所以我只需将 -5.432 转换为 int (-5) 并使用它来创建密钥。
      【解决方案4】:

      您还可以使用一些位操作将其很好地编码为 64 位整数

      经度范围从 -180 到 180,因此至少需要 9 位。 纬度范围从 -90 到 +90,因此至少需要 8 位。 分钟从 0 到 60,所以需要 6 位。 几秒钟内相同。

      9+12 = 21 位经度和 20 位纬度。

      对于亚秒级精度,您可以使用 11 位定点。这将使您的准确度降至 2048 秒。

      为了存储经度或纬度,您可以使用如下结构

      struct ALatLong
      {
          int angle:9;
          int minutes:6;
          int seconds:6;
          int subSeconds:11;
      };
      
      struct LatAndLong
      {
          ALatLong longitude;
          ALatLong lattitude;
      };
      

      【讨论】:

        【解决方案5】:

        简单的解决方案:从 lat/long 对中创建一个哈希键,然后对其进行哈希处理。然后,如果您有钥匙,根据定义,您就有坐标。哈希键相当紧凑,例如如果每个坐标值是 32 位整数,则为 8 个字节。

        非平凡的解决方案:使用spatial hashing

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-09
          • 2012-04-19
          • 2011-11-22
          • 1970-01-01
          • 1970-01-01
          • 2013-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多