坐标路径数据的无损压缩

时间:2014-01-03 21:21:43

标签: algorithm compression coordinates

我正在为一个项目进行头脑风暴,该项目将在数据库中存储大量坐标数据(纬度,经度)。将计算和存储此数据的关键方面,然后压缩和存储大量数据。我正在寻找一种无损压缩算法来减少这些数据的存储空间。是否有一种(最好是通用的)算法,它能很好地压缩这种类型的数据?

数据的已知属性

  • 对坐标对进行排序,并保留该顺序。
  • 所有数字将限制在5位小数(大约1米精度)。
  • 坐标对表示路径,相邻的对可能在值上相对较近。

示例数据

[[0.12345, 34.56789], [0.01234, 34.56754], [-0.00012, 34.56784], …]

注意:我现在不太关心语言,但我可能会在Javascript和PHP中实现这一点。

提前致谢!

3 个答案:

答案 0 :(得分:3)

要扩展barak manos建议的delta编码,首先应将坐标编码为二进制数而不是字符串。使用四字节有符号整数,每个整数等于10 5 乘以你的值。

然后应用delta编码,其中每个纬​​度和经度分别从前一个减去。第一个纬度/经度原样保留。

现在将数据分成四个平面,一个用于32位整数中的每个四字节。较高的字节将大部分为零,所有较低字节的熵。您可以将数据分成块,这样您的平面就不必跨越整个数据集。

然后应用zlib或lzma压缩。

答案 1 :(得分:2)

我建议您首先利用相邻符号相似的事实,然后转换数据以减少熵。然后,在输出中应用您选择的压缩算法。

让IN_ARR为原始数组,OUT_ARR为转换后的数组(压缩输入):

OUT_ARR[0] = IN_ARR[0]
for i = 1 to N-1
    OUT_ARR[i] = IN_ARR[i] - IN_ARR[i-1]

为简单起见,上面的伪代码是为一维坐标编写的。

但是,当然,您可以轻松地将其实现为二维坐标...

当然,您必须在解压缩之后应用反向操作:

IN_ARR[0] = OUT_ARR[0]
for i = 1 to N-1
    IN_ARR[i] = OUT_ARR[i] + IN_ARR[i-1]

答案 2 :(得分:1)

以下是有效构建数据以充分利用数据的方法: -

  1. 首先将数据分为两组,分别为整数和小数: -

    例如:[1.23467,2.45678] => [1,2] and [23467,45678] => [1],[2],[23467],[45678]

  2. 由于您的数据似乎是随机的,因此您可以为压缩做的第一件事就是不将其直接存储为字符串,而是使用后续压缩。

  3. 纬度范围是-90到+90因此总共180个值因此需要log2(180)位,即第一个值为每个整数8位

  4. 分类的范围是-180到180,这是360值,因此log2(360)位是9位

  5. 小数是5位数,因此需要log2(10 ^ 5)= 17位。

  6. 使用上面的压缩,每个记录需要8+9+17*2 = 51位,而如果你使用字符串,则每个记录最多需要2 + 3 + 5 * 2 = 15个字节。

  7. 如果与字符串数据大小

  8. 进行比较,压缩率= 51/(15*8) = 42%
  9. 如果与浮动数据大小相比,压缩率= 51/(2*32) = 80%。

  10. 将路径的相似部分分组为4组,例如: -

  11.   

    [[0.12345,34.56789],[0.01234,34.56754],[ - 0.00012,34.56784] ...]

         

    => [0,0,-O],[34,34,34],[12345,1234,12],[56789,56754,56784]

    对单个组使用增量编码,然后应用霍夫曼编码以进一步压缩总数据。