我有与纬度/经度值相关的数据块。我想从纬度/经度值创建一个查找键/哈希值,以便它可以用作查找地图或类似的东西。
我正在使用西方和南方的负值...因此5W,10S在程序中表示为-5,-10。
如果可能的话,我希望能够从键值中获取纬度/经度值。
派生值必须是某种整数值。
我正在使用C / C ++:)
谢谢,我很乐意回答任何问题!
答案 0 :(得分:5)
你并不是在寻找哈希(哈希通常会分散基础密钥,而且它们也允许进行分类)。
相反,我认为像下面这样的简单公式可以解决这个问题,而且它是可逆的。
[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的解决方案(或其变体(要求“hash”键为整数)。
答案 1 :(得分:2)
正如mjv所指出的,散列通常会混淆原始输入数据。相反,听起来你只是想要结合价值观。
为了方便起见,您可以为“哈希”定义一个新类型:
typedef struct {
float lat;
float lon;
} latlon;
您可以将其视为64位数字。并使用它:
float lat = -5.432;
float lon = 10.3423;
latlon pair = {
.lat = lat,
.lon = lon,
};
答案 2 :(得分:2)
您是否100%确定散列是否合适?哈希查找仅在您知道要查找的键的确切值时才起作用,并且(AFAIK)纬度/经度值并不总是精确地知道。
例如,假设您在密钥(-5.432,10.3423)下存储了记录,而其他人想要知道1.0范围内(-5.0,+ 10.0)内存储的记录。或许他们想要查看记录,但由于计算中的浮点数舍入,他们的关键值为(-5.431999,10.3423001)。在这些情况下,哈希无法帮助你。要做那种空间/不精确的查找,你最好使用更专业的数据结构,比如八叉树(或它们的二维等价物)。
答案 3 :(得分:1)
您还可以使用一些位操作将其编码为64位整数
经度范围从-180到180,因此至少需要9位。 lattitude从-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;
};
答案 4 :(得分:0)
简单的解决方案:从lat / long对中创建一个哈希密钥,并对其进行哈希处理。然后,如果你有钥匙,根据定义,你有坐标。哈希键相当紧凑,例如如果每个坐标值是32位整数,则为8个字节。
非平凡的解决方案:使用spatial hashing。