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 | 是否相交 |
| Contains | A是否包含B |
| Within | A是否位于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 数据