GIS

N-Tree是什么

了解GIS和计算机图形学中N-Tree(N叉树)的基本概念、树形结构、空间划分方式,以及N-Tree与QuadTree、Octree和空间索引之间的关系。

阅读约 74 分钟

N-Tree是什么

N-Tree(N叉树)是一种树形数据结构。

与二叉树最多拥有两个子节点不同,N-Tree允许一个节点拥有多个子节点

简单来说:

N-Tree就是一个节点可以分成N个子节点的树结构。

例如:

Root
├── Child 1
├── Child 2
├── Child 3
└── Child 4

这里一个节点拥有4个子节点。

因此:

N = 4

就可以形成:

4-ary Tree

如果:

N = 8

则可以形成:

8-ary Tree

N-Tree的基本结构

一个N-Tree可以表示为:

Root
├── Child 1
├── Child 2
├── Child 3
├── ...
└── Child N

例如:

Root
├── A
├── B
├── C
├── D
└── E

这里:

N = 5

因此它是一个5叉树。

N-Tree与二叉树

二叉树规定:

一个节点
    ↓
最多2个子节点

结构:

       Root
       /  \
      A    B

N-Tree则可以拥有更多子节点:

             Root
       ┌──────┼──────┬──────┐
       A      B      C      D

因此:

Binary Tree
    ↓
最多2个Child

N-Tree
    ↓
最多N个Child

可以理解为:

二叉树实际上也是N-Tree的一种特殊情况。

当:

N = 2

时:

N-Tree = Binary Tree

N-Tree中的N是什么意思

N代表:

一个节点允许拥有的最大子节点数量

例如:

N = 2

表示:

最多2个子节点
N = 4

表示:

最多4个子节点
N = 8

表示:

最多8个子节点

因此:

N-Tree

不是一个固定的树,而是一类树结构。

N-Tree的层级结构

N-Tree同样具有层级结构:

Level 0
    ↓
Root

Level 1
    ↓
N个节点

Level 2
    ↓
N × N个节点

如果每个节点都拥有N个子节点,那么第 d 层理论上最多拥有:

N^d

个节点。

例如:

N = 4

那么:

Level 0 = 1
Level 1 = 4
Level 2 = 16
Level 3 = 64

这与QuadTree的层级结构类似。

N-Tree与空间划分

N-Tree本身只是树结构。

它并不规定:

必须划分空间

但是可以利用N-Tree组织空间数据。

例如:

空间
 ↓
划分
 ↓
多个子区域
 ↓
N-Tree

可以形成空间索引结构。

例如:

World
├── Region A
├── Region B
├── Region C
└── Region D

继续划分:

Region A
├── A1
├── A2
├── A3
└── A4

最终形成:

World
├── A
│   ├── A1
│   ├── A2
│   ├── A3
│   └── A4
│
├── B
│   ├── B1
│   ├── B2
│   ├── B3
│   └── B4
│
├── C
└── D

这就是将N-Tree用于空间组织的一种方式。

N-Tree与QuadTree

QuadTree是N-Tree在二维空间中的一种特殊应用。

QuadTree:

一个区域
    ↓
4个子区域

也就是:

N = 4

因此可以理解为:

N-Tree
   ↓
N = 4
   ↓
QuadTree

QuadTree通常按照二维空间进行:

NW
NE
SW
SE

四个方向划分。

结构:

             Root
       ┌──────┼──────┐
      NW     NE     SW     SE

因此:

QuadTree可以看作具有特定空间划分规则的4叉树。

N-Tree与Octree

Octree用于三维空间。

一个三维空间可以沿:

X
Y
Z

三个方向进行划分。

每次可以分成:

2 × 2 × 2

也就是:

8

个子空间。

因此:

Octree
    ↓
N = 8

结构:

Root
├── Child 1
├── Child 2
├── Child 3
├── Child 4
├── Child 5
├── Child 6
├── Child 7
└── Child 8

因此:

QuadTree
    ↓
二维空间
    ↓
4个子区域

Octree
    ↓
三维空间
    ↓
8个子区域

QuadTree、Octree与N-Tree

可以简单理解为:

N-Tree
   │
   ├── N = 2
   │     └── Binary Tree
   │
   ├── N = 4
   │     └── QuadTree
   │
   └── N = 8
         └── Octree

但需要注意:

N-Tree只是描述节点具有多个子节点的树结构,而QuadTree、Octree还包含特定的空间划分规则。

因此不能简单认为:

所有4叉树 = QuadTree

因为普通4叉树不一定用于空间划分。

N-Tree与GIS

GIS中的很多数据都具有天然的空间层级关系。

例如:

世界
 ↓
国家
 ↓
省
 ↓
城市
 ↓
区域
 ↓
街道

这种结构可以使用树进行组织:

World
├── Country A
│   ├── Province A1
│   ├── Province A2
│   └── Province A3
│
├── Country B
│   ├── Province B1
│   └── Province B2
│
└── Country C

由于每个节点拥有的子节点数量可能不同,因此可以使用N-Tree思想进行组织。

N-Tree与地图层级

地图本身具有明显的层级结构。

例如:

Map
├── Base Map
├── Roads
├── Buildings
├── POI
└── Labels

某一个Layer还可以继续划分:

Roads
├── Highway
├── National Road
├── Provincial Road
├── County Road
└── Local Road

这种层级关系可以使用N-Tree表示。

N-Tree与空间索引

空间索引的目标是:

快速找到与某个空间范围相关的数据。

N-Tree可以通过空间划分建立层级:

Spatial Data
     ↓
Root Region
     ↓
N个子区域
     ↓
继续划分
     ↓
Leaf

查询时:

Query
  ↓
Root
  ↓
相关Child
  ↓
相关Child
  ↓
Leaf
  ↓
Spatial Objects

这样可以减少不必要的数据扫描。

N-Tree与QuadTree查询

例如地图中有大量Point:

● ● ● ● ●
 ● ● ● ●
● ● ● ● ●

如果使用QuadTree:

World
    ↓
4个区域
    ↓
继续划分

查询:

BBox

时:

BBox
 ↓
相关区域
 ↓
相关子区域
 ↓
Point

N-Tree提供的是这种:

父节点
 ↓
多个子节点
 ↓
递归搜索

的通用思想。

N-Tree中的Leaf

树的最底层节点通常称为:

Leaf

即叶子节点。

例如:

Root
├── A
│   ├── A1
│   └── A2
│
├── B
│   ├── B1
│   └── B2
│
└── C

其中:

A1
A2
B1
B2
C

都是Leaf。

在空间索引中,Leaf通常保存:

空间对象

例如:

Leaf
├── Point
├── Point
└── Point

N-Tree中的内部节点

除了Leaf,还有:

Internal Node

即内部节点。

内部节点主要用于:

组织子节点

例如:

Root
├── Child A
├── Child B
├── Child C
└── Child D

Root就是Internal Node。

如果:

Child A
├── A1
├── A2
└── A3

那么Child A同样是Internal Node。

N-Tree的空间递归

如果将N-Tree用于空间划分:

Root
 ↓
N个区域
 ↓
每个区域继续划分
 ↓
N个子区域

可以形成:

Level 0
        World

Level 1
    A B C D

Level 2
  A1 A2 A3 A4
  B1 B2 B3 B4
  C1 C2 C3 C4
  D1 D2 D3 D4

这种递归划分是空间树的核心思想。

N-Tree与Bounding Box

GIS中的Geometry通常可以计算:

Bounding Box

例如:

Polygon
   ↓
BBox

然后可以根据BBox所属的空间区域:

BBox
 ↓
N-Tree
 ↓
对应节点

进行索引。

结构可以理解为:

Geometry
    ↓
Bounding Box
    ↓
Spatial Node
    ↓
N-Tree

N-Tree与Geometry

N-Tree本身不是Geometry。

需要区分:

Geometry
    ↓
描述空间对象

N-Tree
    ↓
组织空间对象

例如:

Geometry
├── Point
├── LineString
└── Polygon

而:

N-Tree
├── Node
│   ├── Geometry
│   └── Geometry
│
├── Node
│   └── Geometry
│
└── Node

因此:

Geometry负责描述对象是什么样子,N-Tree负责组织和快速定位这些对象。

N-Tree与Feature

GIS中的Feature通常包含:

Feature
├── Geometry
└── Properties

N-Tree可以保存:

Feature

或者保存Feature的空间索引信息:

Feature
    ↓
Geometry
    ↓
BBox
    ↓
N-Tree

例如:

N-Tree
├── Node A
│   ├── Feature 1
│   └── Feature 2
│
├── Node B
│   └── Feature 3
│
└── Node C
    ├── Feature 4
    └── Feature 5

N-Tree与地图渲染

在地图渲染中,可以使用树结构管理不同空间层级的数据:

World
 ↓
Region
 ↓
SubRegion
 ↓
Objects

用户移动地图时:

Viewport
    ↓
找到相关区域
    ↓
加载相关节点
    ↓
渲染数据

例如:

Map
├── Region A
├── Region B
├── Region C
└── Region D

当前视口只覆盖:

Region B
Region C

那么可以只处理:

B
C

而不是整个地图。

N-Tree与LOD

LOD表示:

Level of Detail

即不同距离或缩放级别使用不同的数据精度。

N-Tree天然具有:

Level 0
Level 1
Level 2
Level 3

因此可以配合LOD:

缩小
 ↓
较高层节点
 ↓
低精度数据
放大
 ↓
更深层节点
 ↓
高精度数据

例如:

World
 ↓
Country
 ↓
City
 ↓
District
 ↓
Building

地图缩小时:

Country

地图放大后:

City
District
Building

N-Tree与3D空间

N-Tree不仅可以用于二维GIS。

在三维GIS和3D引擎中,可以进一步使用:

Octree

例如:

3D World
    ↓
8个空间
    ↓
每个空间继续划分
    ↓
8个子空间

形成:

World
├── Octant 1
├── Octant 2
├── Octant 3
├── Octant 4
├── Octant 5
├── Octant 6
├── Octant 7
└── Octant 8

因此:

N-Tree
    ↓
空间树思想
    ↓
QuadTree
    ↓
二维

Octree
    ↓
三维

N-Tree与3D Tiles

大型三维地理数据通常需要进行:

分层
分块
按需加载
LOD
空间索引

这些需求都可以使用树形空间层级表达。

例如:

3D Tiles
    ↓
Root
    ↓
Child Tiles
    ↓
More Detailed Tiles

可以形成类似:

Root
├── Tile A
│   ├── Tile A1
│   ├── Tile A2
│   └── Tile A3
│
├── Tile B
├── Tile C
└── Tile D

这里的核心思想与N-Tree非常接近。

N-Tree的优势

1. 结构灵活

一个节点可以拥有:

2
4
8
16
...

个子节点。

2. 适合层级数据

例如:

国家
 ↓
省
 ↓
市
 ↓
区

3. 适合空间分层

可以将空间划分为:

大区域
 ↓
中区域
 ↓
小区域

4. 适合LOD

树的深度可以对应:

Detail Level

5. 适合按需加载

只访问当前需要的节点:

Viewport
 ↓
相关节点
 ↓
加载数据

N-Tree的缺点

1. N值需要合理选择

如果N太小:

N = 2

树可能比较深。

如果N太大:

N = 100

每个节点可能拥有大量子节点。

因此需要根据实际场景设计。

2. 不一定适合作为通用空间索引

N-Tree本身没有规定:

如何划分空间

因此真正的GIS空间索引通常需要额外定义:

空间划分规则
Bounding Box
节点容量
深度
查询规则

3. 数据分布可能不均

如果大量对象集中在某个区域:

●●●●●●●●●

某些节点可能非常密集,而其他节点几乎没有数据。

N-Tree与R-Tree

两者都是树形结构,但用途不同。

N-Tree:

一个节点
 ↓
N个子节点

重点是:

树的分支数量

R-Tree:

空间对象
 ↓
Bounding Box
 ↓
层级空间索引

重点是:

空间对象的包围盒组织

简单理解:

特性N-TreeR-Tree
核心N个子节点BBox层级
是否必须空间索引
子节点数量N通常有范围
空间划分不规定基于空间对象
GIS应用可用于组织空间数据非常常见
结构通用树空间索引树

N-Tree与QuadTree、Octree关系

可以建立这样的知识体系:

Tree
│
├── Binary Tree
│
└── N-Tree
     │
     ├── 4-way Tree
     │    └── QuadTree
     │
     └── 8-way Tree
          └── Octree

如果从空间维度理解:

二维空间
    ↓
4个子区域
    ↓
QuadTree
三维空间
    ↓
8个子区域
    ↓
Octree

N-Tree的核心应用

N-Tree思想可以应用于:

GIS
地图渲染
空间索引
3D GIS
3D引擎
LOD
地图瓦片
数据分块
场景管理
空间查询

例如一个大型GIS场景:

World
    ↓
Region
    ↓
SubRegion
    ↓
Tile
    ↓
Feature
    ↓
Geometry

可以通过树形结构进行管理。

一个简单的GIS空间树

例如一个地图区域:

World
├── Region A
│   ├── Tile A1
│   ├── Tile A2
│   └── Tile A3
│
├── Region B
│   ├── Tile B1
│   └── Tile B2
│
└── Region C
    ├── Tile C1
    ├── Tile C2
    └── Tile C3

查询:

Viewport
    ↓
World
    ↓
Region B
    ↓
Tile B1
    ↓
Feature
    ↓
Geometry

这样就可以避免遍历整个数据集。

N-Tree的核心关系

可以用下面的结构理解:

N-Tree
    ↓
树形结构
    ↓
一个节点拥有多个子节点
    ↓
递归形成层级

用于空间数据时:

空间
    ↓
空间划分
    ↓
N个子区域
    ↓
继续划分
    ↓
Leaf
    ↓
空间对象

最终形成:

Spatial Data
      ↓
N-Tree
      ↓
Spatial Hierarchy
      ↓
Spatial Query
      ↓
Relevant Objects

总结

N-Tree(N叉树)是一种允许一个节点拥有多个子节点的树形数据结构。

核心结构是:

              Root
        ┌──────┼──────┐
       A       B      C      D

其中一个节点最多可以拥有:

N

个子节点。

在GIS领域,N-Tree可以作为空间层级组织的基础思想,并可以进一步形成:

N-Tree
   ↓
4个子区域
   ↓
QuadTree

以及:

N-Tree
   ↓
8个子区域
   ↓
Octree

可以记住:

N-Tree描述的是“一个节点可以拥有N个子节点”的树结构,而QuadTree和Octree是在空间数据中采用特定划分规则的N叉树。

GIS中的典型应用流程可以理解为:

空间数据
    ↓
空间划分
    ↓
N-Tree
    ↓
层级空间索引
    ↓
Viewport / BBox查询
    ↓
相关节点
    ↓
Geometry / Feature
    ↓
地图渲染
🧰

相关工具

使用 IYATools 在线工具快速处理 GIS 数据