GIS

GIS Spatial Relation是什么

了解GIS中Spatial Relation(空间关系)的基本概念、相交、包含、相邻、重叠、相离等空间关系,以及空间关系与Geometry、Intersection和空间查询之间的关系。

阅读约 105 分钟

GIS Spatial Relation是什么

Spatial Relation(空间关系)是GIS中用于描述两个Geometry之间空间位置关系的一组概念和判断方法。

简单来说:

Spatial Relation回答的是两个空间对象之间“是什么关系”。

例如:

Point
  ●
  ↓
Polygon
┌──────────┐
│    ●     │
│          │
└──────────┘

可以判断:

Point
  ↓
是否位于Polygon内部?

结果可能是:

true

GIS中常见的空间关系包括:

  • Intersects
  • Contains
  • Within
  • Touches
  • Overlaps
  • Crosses
  • Disjoint
  • Equals
  • Covers
  • CoveredBy

这些关系是GIS空间查询和空间分析的基础。

Spatial Relation能够做什么

空间关系可以用于:

  • 空间查询
  • 地图要素筛选
  • 点在面查询
  • 相邻对象查询
  • 区域包含分析
  • 道路穿越分析
  • 空间叠加
  • 地理围栏
  • GIS数据分析

例如:

查询某个行政区内的所有学校。

可以判断:

School
   ↓
Within
   ↓
Administrative Area

如果:

Within = true

说明学校位于该行政区内部。

Spatial Relation的基本结构

空间关系通常可以表示为:

Geometry A
    ↓
Spatial Relation
    ↓
Geometry B
    ↓
true / false

例如:

Point
    ↓
Within
    ↓
Polygon
    ↓
true

因此Spatial Relation与Intersection不同。

Spatial Relation通常回答:

两个Geometry之间是否存在某种空间关系?

而不是直接生成新的Geometry。

Spatial Relation与Geometry

Geometry是空间对象本身:

Point
LineString
Polygon

Spatial Relation描述这些Geometry之间的关系:

Point
   ↓
Within
   ↓
Polygon

可以理解为:

Geometry
    ↓
空间对象

Spatial Relation
    ↓
空间对象之间的关系

Intersects

Intersects表示两个Geometry是否存在共同空间部分。

例如:

┌────────────┐
│     A      │
│       ┌────────────┐
│       │     B      │
└───────┤            │
        └────────────┘

执行:

Intersects(A, B)

得到:

true

如果两个Geometry完全分离:

┌────────┐


              ┌────────┐
              │        │
              └────────┘

则:

Intersects(A, B)
    ↓
false

因此:

Intersects用于判断两个Geometry是否相交。

Intersects与Intersection

这两个概念非常容易混淆。

Intersects

Intersects(A, B)

返回:

true / false

表示:

A和B是否相交?

Intersection

Intersection(A, B)

返回:

Geometry

表示:

A和B相交的具体空间部分是什么?

因此:

Intersects
    ↓
判断关系
Intersection
    ↓
计算Geometry

可以记住:

Intersects负责判断,Intersection负责求结果。

Contains

Contains表示:

A是否包含B?

例如:

┌──────────────┐
│              │
│      ●       │
│              │
└──────────────┘

Polygon:

A

Point:

B

执行:

Contains(A, B)

结果:

true

表示:

Polygon A包含Point B。

Within

Within是Contains的反向关系。

它表示:

A是否位于B内部?

例如:

Point
  ●
  ↓
Polygon
┌──────────────┐
│      ●       │
└──────────────┘

执行:

Within(Point, Polygon)

结果:

true

因此:

Contains(Polygon, Point)

和:

Within(Point, Polygon)

表达的是相对应的空间关系。

可以记住:

Contains看外部对象是否包含内部对象,Within看内部对象是否位于外部对象中。

Contains与Within

例如:

Polygon A
┌──────────────┐
│      ●       │
└──────────────┘
    Point B

那么:

Contains(A, B)
    ↓
true

同时:

Within(B, A)
    ↓
true

所以:

Contains(A, B)
≈
Within(B, A)

但在具体GIS库中,边界上的情况可能存在定义差异,因此实际开发时需要参考所使用库的空间关系规范。

Touches

Touches表示两个Geometry的边界接触,但内部没有共同区域。

例如两个Polygon:

┌────────┐┌────────┐
│   A    ││   B    │
│        ││        │
└────────┘└────────┘

两个区域只在边界位置接触。

执行:

Touches(A, B)

结果:

true

典型应用:

  • 相邻行政区
  • 相邻地块
  • 相邻区域
  • 面与面的边界接触

Touches与Intersects

如果两个Geometry Touches:

Touches = true

通常也意味着:

Intersects = true

因为它们存在共同的边界位置。

但是:

Intersects = true

并不意味着:

Touches = true

因为两个Geometry可能存在面积重叠。

例如:

A ∩ B

有实际面积时:

Intersects = true
Touches = false

Overlaps

Overlaps表示两个同维度Geometry之间存在部分重叠,但互相都没有完全包含对方。

例如:

┌────────────┐
│     A      │
│       ┌────────────┐
└───────┤     B      │
        └────────────┘

A和B有共同区域:

A ∩ B

但:

A ≠ B

并且:

A 不完全包含 B
B 不完全包含 A

这时可以认为:

Overlaps(A, B)
    ↓
true

Overlaps与Intersects

Overlaps是一种更加具体的空间关系。

Overlaps
    ↓
部分重叠

而:

Intersects
    ↓
存在共同空间部分

因此:

Overlaps = true

通常意味着:

Intersects = true

但:

Intersects = true

不一定意味着:

Overlaps = true

Crosses

Crosses表示两个不同维度或适合定义该关系的Geometry发生穿越。

最典型的是:

LineString
     /
    /
───●────
  /
 /

例如一条道路穿过一个Polygon:

┌──────────────┐
│      /       │
│     /        │
│    /         │
└───/──────────┘

可以判断:

Crosses(Line, Polygon)

具体语义取决于Geometry类型和空间关系标准。

常见应用:

  • 道路穿越行政区
  • 河流穿过城市
  • 管线穿过规划区
  • 铁路穿过保护区

Crosses与Intersection

例如:

Road
──────────────
      ↓
   Polygon
┌──────────┐
│          │
└──────────┘

Crosses回答:

道路是否穿越这个区域?

而Intersection回答:

道路与这个区域共同存在的具体线段是什么?

因此:

Crosses
    ↓
空间关系判断
Intersection
    ↓
空间Geometry结果

Disjoint

Disjoint表示两个Geometry完全没有共同空间部分。

例如:

┌────────┐


                    ┌────────┐
                    │        │
                    └────────┘

执行:

Disjoint(A, B)

结果:

true

也就是说:

A ∩ B = Empty

因此:

Disjoint
    ↓
完全不相交

Disjoint与Intersects

Disjoint和Intersects可以理解为相反关系。

通常:

Disjoint(A, B)

如果为:

true

则:

Intersects(A, B)

为:

false

可以记住:

Intersects
    ↓
有共同空间部分
Disjoint
    ↓
没有共同空间部分

Equals

Equals表示两个Geometry在空间上相等。

例如:

Polygon A
┌────────┐
│        │
└────────┘

Polygon B
┌────────┐
│        │
└────────┘

如果两者空间位置和形状完全一致:

Equals(A, B)
    ↓
true

需要注意:

Equals关注的是Geometry的空间等价,而不一定要求数据文件、属性字段或者坐标文本完全相同。

Covers

Covers表示一个Geometry覆盖另一个Geometry。

例如:

┌──────────────┐
│              │
│      ●       │
│              │
└──────────────┘

Polygon覆盖Point:

Covers(Polygon, Point)
    ↓
true

Covers与Contains非常接近,但对于位于边界上的Geometry,语义可能有所不同。

因此在处理边界情况时,应根据具体GIS库的定义进行判断。

CoveredBy

CoveredBy是Covers的反向关系。

例如:

Point
  ●
  ↓
Polygon
┌──────────────┐
│      ●       │
└──────────────┘

可以判断:

CoveredBy(Point, Polygon)
    ↓
true

因此:

Covers(A, B)

与:

CoveredBy(B, A)

是相对应的关系。

Boundary

理解Spatial Relation之前,需要理解Geometry的Boundary。

例如LineString:

A ●────────────● B

它的Boundary通常是两个端点:

A ●              ● B

Polygon:

┌──────────────┐
│              │
│              │
└──────────────┘

它的Boundary通常是:

Polygon外部边界

Spatial Relation中的:

Contains
Within
Touches
Covers

等关系都可能涉及Geometry内部和边界的区别。

Interior

Interior可以理解为Geometry内部部分。

例如Polygon:

┌──────────────┐
│              │
│   Interior   │
│              │
└──────────────┘

Boundary:

┌──────────────┐
↑              ↑
Boundary

因此空间关系判断并不是简单的:

A和B有没有碰到

而是会进一步考虑:

Interior
Boundary
Exterior

之间的关系。

Exterior

Exterior可以理解为Geometry外部的空间。

例如:

        Exterior
────────────────────

      ┌────────┐
      │Interior│
      └────────┘

────────────────────
        Exterior

GIS空间关系的严格定义通常会基于:

Interior
Boundary
Exterior

进行判断。

DE-9IM

很多GIS空间关系的严格定义基于:

DE-9IM(Dimensionally Extended 9-Intersection Model)

它通过Geometry的:

Interior
Boundary
Exterior

两两之间的交集描述空间关系。

可以表示为:

        B Interior
        B Boundary
        B Exterior

A Interior
A Boundary
A Exterior

形成一个:

3 × 3

的关系矩阵。

即:

┌──────────┬──────────┬──────────┐
│ I ∩ I    │ I ∩ B    │ I ∩ E    │
├──────────┼──────────┼──────────┤
│ B ∩ I    │ B ∩ B    │ B ∩ E    │
├──────────┼──────────┼──────────┤
│ E ∩ I    │ E ∩ B    │ E ∩ E    │
└──────────┴──────────┴──────────┘

其中:

I = Interior
B = Boundary
E = Exterior

DE-9IM是理解GIS空间关系的理论基础。

Spatial Relation与Intersection

Intersection和Spatial Relation关系非常密切。

Intersection:

A ∩ B

直接计算共同空间部分。

Spatial Relation:

Intersects(A, B)

判断:

A ∩ B ≠ Empty

因此:

Intersection
    ↓
求交集Geometry

而:

Intersects
    ↓
判断交集是否存在

Spatial Relation与Distance

Distance回答:

两个Geometry距离多远?

Spatial Relation回答:

两个Geometry是什么空间关系?

例如:

Distance(A, B)
    ↓
500m

而:

Intersects(A, B)
    ↓
false

或者:

Touches(A, B)
    ↓
true

因此:

Distance
    ↓
空间距离
Spatial Relation
    ↓
空间关系

Spatial Relation与Buffer

Buffer可以和Spatial Relation组合。

例如:

判断某个车辆是否进入学校500米范围。

首先:

学校
 ↓
Buffer 500m
 ↓
Polygon

然后:

车辆
 ↓
Within
 ↓
Buffer Polygon

最终:

Within = true

表示车辆进入了范围。

Spatial Relation与空间查询

这是Spatial Relation最重要的应用之一。

例如:

查询北京市内所有医院。

可以:

Hospital
    ↓
Within
    ↓
Beijing Polygon

或者:

Beijing Polygon
    ↓
Contains
    ↓
Hospital

最终筛选出:

北京市内医院

Spatial Relation应用:点在面

这是GIS中最经典的空间查询。

例如:

城市
┌──────────────┐
│   ●   ●      │
│              │
│      ●       │
└──────────────┘

查询:

哪些POI位于这个城市?

可以使用:

Within(Point, Polygon)

结果:

Point A → true
Point B → true
Point C → true

Spatial Relation应用:行政区查询

例如:

查询某个省份内所有城市。

数据:

Province
+
City

关系:

Within(City, Province)

结果:

Province
└── City

这类关系可以用于:

  • 行政区统计
  • 区域数据聚合
  • 地图查询
  • 数据分类

Spatial Relation应用:相邻地块

例如:

┌────────┐┌────────┐
│ Plot A ││ Plot B │
└────────┘└────────┘

可以判断:

Touches(A, B)

如果:

true

说明两个地块存在边界接触。

这可以用于:

  • 邻接分析
  • 地块分析
  • 行政区邻接
  • 空间网络构建

Spatial Relation应用:道路穿越区域

例如:

        Road
─────────┼─────────
         │
    ┌────┼─────┐
    │    │     │
    │    │     │
    └────┼─────┘

可以使用:

Crosses(Road, Polygon)

或者:

Intersects(Road, Polygon)

判断道路与区域的空间关系。

Spatial Relation应用:地理围栏

例如:

Geofence
┌──────────────┐
│              │
│      🚗      │
│              │
└──────────────┘

判断车辆:

Within(Vehicle, Geofence)

如果:

true

表示:

车辆位于地理围栏内部。

这可以应用于:

  • 车辆管理
  • AGV
  • 物流
  • 外卖配送
  • 电子围栏
  • 资产管理

Spatial Relation应用:道路影响范围

例如:

道路
──────────────

创建:

Buffer 100m

得到:

道路影响范围

然后:

Building
    ↓
Intersects
    ↓
Road Buffer

就可以判断:

哪些建筑物位于道路100米影响范围内。

Spatial Relation应用:河流保护区

流程:

River
 ↓
Buffer 200m
 ↓
Protection Zone
 ↓
Intersects
 ↓
Buildings

空间关系:

Building
    ↓
Intersects
    ↓
Protection Zone

最终得到:

保护范围内建筑

Spatial Relation应用:最近对象

Spatial Relation本身通常不负责计算最近对象,但可以和Distance结合。

例如:

Point
 ↓
Distance
 ↓
Nearest

然后再使用:

Within
Intersects

进行进一步筛选。

因此:

Distance
+
Spatial Relation

可以完成更加复杂的空间查询。

Spatial Relation与CRS

空间关系判断同样需要正确的坐标参考系统。

例如:

Geometry A
CRS = EPSG:4326

Geometry B:

CRS = EPSG:3857

如果直接进行:

Intersects(A, B)

可能得到错误结果。

应该先:

A
 ↓
Coordinate Transform
 ↓
B的CRS

然后:

A
+
B
↓
Spatial Relation

因此:

执行空间关系判断之前,应确保Geometry使用正确且兼容的CRS。

Spatial Relation与Geometry有效性

无效Geometry也可能导致空间关系判断异常。

例如:

Polygon
 ↓
自相交

可能导致:

Intersects
Contains
Within

等结果异常。

因此实际GIS数据处理中经常采用:

Geometry
 ↓
Validate
 ↓
Repair
 ↓
Spatial Relation

Spatial Relation常见关系总结

空间关系含义
Intersects是否相交
ContainsA是否包含B
WithinA是否位于B内部
Touches是否接触边界
Overlaps是否部分重叠
Crosses是否穿越
Disjoint是否完全分离
Equals是否空间相等
Covers是否覆盖
CoveredBy是否被覆盖

Spatial Relation关系图

可以简单理解为:

Spatial Relation
│
├── 相交类
│   ├── Intersects
│   ├── Overlaps
│   └── Crosses
│
├── 包含类
│   ├── Contains
│   ├── Within
│   ├── Covers
│   └── CoveredBy
│
├── 接触类
│   └── Touches
│
├── 分离类
│   └── Disjoint
│
└── 相等类
    └── Equals

Spatial Relation与集合关系

可以将很多空间关系理解为Geometry集合之间的关系。

例如:

Intersection
    ↓
A ∩ B

如果:

A ∩ B = Empty

则:

Disjoint

如果:

A ∩ B ≠ Empty

则可能:

Intersects

如果:

A ∩ B = B

则可能存在:

Contains(A, B)

因此:

空间关系本质上是在描述Geometry之间的拓扑关系。

Spatial Relation与拓扑关系

Spatial Relation很多时候也被称为:

Topological Relation

因为这些关系关注的是:

空间对象之间的连接、包含、相交、分离等拓扑性质。

例如:

Intersects
Touches
Contains
Within
Overlaps
Disjoint

它们并不主要关心对象之间的具体距离。

例如:

A
┌──────┐
│      │
└──────┘

和:

B
┌──────┐
│      │
└──────┘

即使整体发生旋转、平移,只要拓扑关系没有改变:

Touches
Intersects
Within

等关系可能仍然保持。

Spatial Relation与Distance的区别

这是GIS空间分析中非常重要的区别。

Distance:

A
 ↓
500m
 ↓
B

回答:

A和B有多远?

Spatial Relation:

A
 ↓
Within
 ↓
B

回答:

A是否位于B内部?

所以:

Distance
    ↓
数量关系
Spatial Relation
    ↓
拓扑关系

Spatial Relation与Intersection的区别

可以记住:

Spatial Relation
    ↓
判断两个Geometry的关系
    ↓
true / false

而:

Intersection
    ↓
计算共同空间部分
    ↓
Geometry

例如:

Intersects(A, B)
    ↓
true

再执行:

Intersection(A, B)
    ↓
Polygon

就可以:

先判断是否相交,再获得实际相交区域。

Spatial Relation典型分析流程

一个完整空间查询流程可以是:

输入Geometry
    ↓
检查CRS
    ↓
检查Geometry有效性
    ↓
选择Spatial Relation
    ↓
执行空间关系判断
    ↓
true / false
    ↓
筛选空间对象

例如:

Hospital
    ↓
Within
    ↓
City
    ↓
true / false
    ↓
City内医院

总结

Spatial Relation(空间关系)用于描述两个Geometry之间的空间关系,是GIS空间查询和空间分析的重要基础。

核心结构:

Geometry A
    ↓
Spatial Relation
    ↓
Geometry B
    ↓
true / false

常见空间关系:

Intersects
Contains
Within
Touches
Overlaps
Crosses
Disjoint
Equals
Covers
CoveredBy

其中最重要的几个可以这样记:

Intersects
    ↓
是否相交

Contains
    ↓
A是否包含B

Within
    ↓
A是否位于B内部

Touches
    ↓
是否边界接触

Overlaps
    ↓
是否部分重叠

Crosses
    ↓
是否穿越

Disjoint
    ↓
是否完全分离

Equals
    ↓
是否空间相等

与其他GIS空间操作的关系:

Distance
    ↓
有多远

Buffer
    ↓
多远范围

Spatial Relation
    ↓
是什么空间关系

Intersection
    ↓
共同空间部分是什么

一个典型GIS空间分析过程可以是:

Geometry
    ↓
Buffer
    ↓
空间范围
    ↓
Spatial Relation
    ↓
Within / Intersects / Contains
    ↓
筛选空间对象
    ↓
空间分析结果

可以记住:

Distance解决“多远”,Buffer解决“范围”,Spatial Relation解决“什么关系”,Intersection解决“共同部分是什么”。

🧰

相关工具

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