RBush 快速拓扑查询大规模空间数据

R树是空间数据索引结构中重要的一种层次结构,R树是基于B树索引改造的二叉树索引结构。目前已成为许多空间索引方法的基础,不少前沿的空间索引都使用到R树或者对R树改良。其构建思想是以最小边界矩形(MBR)递归地对空间数据集的空间按照“面积”规划进行划分。它的特点如下:
    1. R树中非叶子节点代表一个划分的空间区域,即一个矩形空间区域;
    2. R树中的叶子节点包含的矩形区域对应空间对象的MBR;
    R+树主要针对R树中兄弟节点的MBR重叠后,导致空间搜索性能较差的特点提出的。R+树中,兄弟节点之间的MBR不允许重叠,这使得空间搜索的性能较好,但由于在插入和删除时需保证兄弟节点之间的MBR不能重叠,因此R+树的插入和删除操作的效率较低。
    R+树中间节点的所有矩形都是不相交的。如果一个对象的MBR被两个或多个R+树高层节点中的矩形分割,与这些非叶节点中矩形相联系的每个项都有指向这个对象的一个后继叶节点。这样树的高度增加,但搜索操作的性能会大大提高。

RBush 快速拓扑查询大规模空间数据_第1张图片

接下来,本文主要讲述的是一款高性能的R树空间索引工具库 ——RBush

Github 链接 https://github.com/mourner/rbush RBush目前在github上开源,作者的开源库也有其他的空间索引开源工具,大家可以去观摩学习。

下面讲述一下,如果使用rBush去操作空间实体,已达到快速查询大规模的空间数据。

构造方法

rbush(maxEntries, format)

maxEntries:最大的空间实体的个数,也即(最大的那几个外包矩形的个数)

format: 输出的格式

增删改查方法

insert(item)

在空间索引插入一个空间实体

insert(extent, value) {
    const item = {
      minX: extent[0],
      minY: extent[1],
      maxX: extent[2],
      maxY: extent[3],
      value: value // 自定义属性
    };

    this.rbush_.insert(item);
    this.items_[getUid(value)] = item; // 使用关联数组存储备用
}

remove(item)

移除某个空间实体

remove(value) {
    const uid = getUid(value);

    const item = this.items_[uid];
    delete this.items_[uid];
    return this.rbush_.remove(item) !== null; // 可以判断是否存在
}

          update(extent, item)

          更新某个空间实体的值,需要自己封装一下remove和insert方法

  update(extent, value) {
    const item = this.items_[getUid(value)];

    const bbox = [item.minX, item.minY, item.maxX, item.maxY];

    if (!equals(bbox, extent)) {//equals 是比较两个外包矩形是否相等
      this.remove(value);
      this.insert(extent, value);
    }
  }

search(bbox)

在R树索引中查询bbox外包矩形包含的几何实体

getInExtent(extent) {
    const bbox = {
      minX: extent[0],
      minY: extent[1],
      maxX: extent[2],
      maxY: extent[3]
    };
    const items = this.rbush_.search(bbox);

    return items.map(function(item) {
      return item.value;
    });
}

总结

在实际的几何拓扑开发中,使用R树索引是大规模操作几何拓扑运算的必要步骤。比例,几何拓扑,三维中计算在可视范围内的几何图形等等。

你可能感兴趣的:(学习笔记)