矢量文件组织方法

发布于 2022-10-14  527 次阅读


周末导师开会给了几个研究方向,我总觉着现在做深度学习的人太多了,调包也没啥意思,所以选了个比较考验算法和数据结构的方向,就是大规模矢量文件(面)的组织管理与展现,可能还要搞点三维GIS。

一切从基础开始,先查查相关文献和资料

shapefile的文件结构https://blog.csdn.net/flowerspring/article/details/120949847

必须的文件:

  • .shp — 图形格式,用于保存元素的几何实体。
  • .shx — 图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率。
  • .dbf — 属性数据格式,以dBase III+ 的数据表格式存储每个几何形状的属性数据。
  • 其他可选的文件:
  • .prj — 投帧式,用于保存地理坐标系统与投影信息,是一个存储well-known text投影描述符的文本文件。
  • .sbn and .sbx — 几何体的空间索引
  • .fbn and .fbx — 只读的Shapefiles的几何体的空间索引
  • .ain and .aih — 列表中活动字段的属性索引。
  • .ixs — 可读写Shapefile文件的地理编码索引
  • .mxs — 可读写Shapefile文件的地理编码索引(ODB格式)
  • .atx — .dbf文件的属性索引,其文件名格式为shapefile.columnname.atx (ArcGIS 8及之后的版本)
  • .shp.xml — 以XML格式保存元数据。
  • .cpg — 用于描述.dbf文件的代码页,指明其使用的字符编码。

一般数据库的数据索引都是哈希索引,B树或者b+树等等,空间数据由于其二维属性会用到四叉树,R树等

首先是B树的解析,其实和之前的平衡二叉搜索树差不多,因为大规模数据是存储在硬盘上,而硬盘IO开销很大,就要减少查找次数,通过增加在每个结点上的元素个数变成多叉树来降低树的高度,其他都和平衡二叉搜索树类似。

图解b树图解:什么是B树?(心中有 B 树,做人要虚心)一文读懂B-树 - 知乎 (zhihu.com)

B树的衍生平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了 - 知乎 (zhihu.com)

B树终归是对一维的数据进行管理,而空间数据是二维或者更高维,因此就引入了R树。

R树什么是R树? - 知乎 (zhihu.com)

R树细节(搜索,插入,删除)图解R树的原理及相关操作_土豆西瓜大芝麻的博客-CSDN博客_r树

在分布式存储下,空间索引又更加复杂,分布式存储分主从和p2p两种,主从模式的分布式索引主要包括局部索引、全局索引和两者的混合索引

当矢量数据规模很大时,需要先对其进行划分,使其存于不同的节点上。影响矢量数据划分的五个主导因素:空间对象、空间位置、空间分布、空间对象大小和数据块大小。其中前H个因素主要用来保留空间数据的聚集特性;后两个因素侧重于维持空间数据块之间的均衡分布。划分方法分为三类:空间范围划分法,空间数据划分法,空间填充曲线划分法

因为入手看的第一篇论文就是矢量大数据分布式存储,所以就系统的学习了一遍。目前看来导师那里的项目应该用不到分布式存储,做好空间索引应该就行了。

在建立空间索引时有两种方法,一种是OBO(One By One)方法:一种是批量加载(BulkLoading)方法。前者是一种动态的构建方法,在整棵民树构建过程当中,从空树开始,逐个遍历空间对象,通过计算其包络炬形插入到所对应的子节点中来完成整棵R树索引的树建。OBO构建方法的算法复杂度较高,需要动态维护空间索引结构,特别是针对海量的矢量数据,该方法构建R树索引耗时巨大。后者是按照一定的规则将所有空间要素进行排序,根据一定的划分标准,整个有序的空间对象分割为多个子集,每一个子集即为一个子节点,自上而下,一次一层,通过遍历完成最终R树索引的构建。与OBO构建方法相比,批量加载方法更适合处理海量空间数据。

在众多R树变体当中,由Kamel提出的Hilbert-R树被证明具有良好的索引性能。紧缩的希尔伯特R树(Packed Hilbert R-trees)在很少进行数据更新甚至从不需要进行数据更新的静态数据库中显得非常的适用。动态的希尔伯特R树则适用于插入、删除、更新这些操作发生非常频繁的动态数据库。此外,动态希尔伯特R树采用灵活的延迟的分裂机制来提高空间利用率。

希尔伯特R树_百度百科 (baidu.com)

底层先看这么多,先用PostGIS和QGIS上手看看

持续更新。。。


届ける言葉を今は育ててる
最后更新于 2023-03-26