多边形的压缩表示

Compressed representation of polygons

我有很多(数百万)个来自 openstreetmap-data 的多边形,其中大部分(超过 99%)恰好有四个坐标代表房屋。

示例

我目前将每个房子的四个坐标显式保存为浮点元组(纬度和经度),因此占用 32 个字节的内存。

有没有办法以压缩方式(少于 32 字节)存储此信息,因为四个坐标在最后一位小数点上的差别很小?

如果您的地图补丁不是太大,您可以存储相对于某个基点(例如,左下角)的相对坐标。得到这些差异,像这样按地图大小对它们进行规范化:

   uint16_diff  = (uint16) 65535 * (lat - latbottom) / (lattop - latbottom)

这种方法允许存储 16 位整数值。

对于矩形(您可以将它们存储在单独的列表中),有一种方法可以存储 5 个 16 位值而不是 8 个值 - 左上角坐标、宽度、高度和旋转角度(可能有另一组数据,例如,包括第二个角)

结合这两种方法,可能会使数据大小损失高达 3.2 倍

正如@MBo 所说,您可以存储每个房屋的一个角,并相对于第一个角压缩其他三个角。

此外,如果建筑物非常相似,您可以设置 "dictionary" 个建筑物。对于每个建筑物,您都将其索引存储在字典中,并存储一些特征,例如其第一个角坐标和旋转。

您没有提供有关要保留的分辨率的信息。

假设1米的精度就够了,24位可以覆盖16000公里。那么8位应该也足够表示大小信息了(最多256米)。

这将使每个房子 8 个字节。

例如使用霍夫曼编码的更积极的压缩可能不适用于这些位置(相对均匀的分布);尺寸稍微好一点,但好处微乎其微。