【问题标题】:Compressed representation of polygons多边形的压缩表示
【发布时间】:2017-07-05 11:37:41
【问题描述】:

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

示例

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

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

【问题讨论】:

  • 我想也许你想要一个 implicit 网格结构;存储数据,就好像它们被组织在一些任意缩放的网格中一样,具有足够小的单元格,您可以以合理的分辨率存储坐标,然后可能是全局缩放参数。
  • 这是一个单一的地图——元素以随机顺序出现,不以任何方式排序。最好的解决方案是只考虑存储在多边形上的数据。

标签: algorithm geometry compression computational-geometry


【解决方案1】:

如果您的地图块不是太大,您可以存储相对于某个基点的相对坐标(例如,左下角)。获取这些差异,按地图大小对其进行规范,如下所示:

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

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

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

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

【讨论】:

  • 我的地图补丁——不幸的是——非常大(欧洲)。这就是为什么我实际上正在寻找一种方法来压缩这些数据。
  • 这张地图是单一的,还是由矩形组成的?也许您可以根据不同列表中的接近程度对具有相应基点的对象进行分组。
  • 这是一个单一的地图——元素以随机顺序出现,不以任何方式排序。最好的解决方案是只考虑存储在多边形上的数据。
  • 但是要显示一张地图,您只需要获取视图区域中的对象。在一些空间分区结构中组织数据是值得的——这是快速工作所需要的。
  • 它不是用来绘制地图的。我需要将所有数据保存在内存中以对其进行一些统计和转换。一些多边形可能会通过网络进一步传输。所以信息应该是自包含的,没有任何网格的元信息。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    假设 1 m 精度就足够了,24 位可以覆盖 16000 km。那么 8 位也应该足以表示尺寸信息(最多 256 m)。

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

    更激进的压缩,例如使用霍夫曼编码可能无法在位置上工作(相对均匀分布);尺寸稍微好一点,但好处是微乎其微的。

    【讨论】:

    • 我需要保持完整的浮点分辨率,以便以后能够比较两个坐标并将它们检测为“相同”。
    • @user2033412:圆角坐标也将比较等于。双精度表示确保整个地球的分辨率接近 4 埃。你有这么准确的数据吗?
    • 我将纬度和经度存储在两个浮点数中。
    • @user2033412:您的描述中有一些误导。你说 4 个坐标 32 个字节?!
    • 每个坐标由两个浮点数(纬度,经度)组成,因此占用 8 个字节的内存。因为我为每个房子有四个坐标,所以总计为 4 x 8 字节 = 32 字节。
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2019-08-31
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多