GIS Distance是什么
Distance(距离)是GIS空间分析中最基础的空间计算之一。
它用于计算两个Geometry之间的空间距离。
例如:
Point A
↓
Distance
↓
Point B
得到:
距离 = 500m
简单来说:
Distance回答的是两个空间对象之间“有多远”。
GIS中的Distance不仅可以计算点与点之间的距离,还可以计算:
- 点与点
- 点与线
- 点与面
- 线与线
- 线与面
- 面与面
之间的最短空间距离。
Distance能够做什么
Distance可以用于:
- 最近点查询
- 最近道路分析
- 门店距离分析
- 医院距离分析
- 路径辅助分析
- POI附近搜索
- 服务范围分析
- 空间聚类
- 地理围栏
- 空间关系判断
例如:
查询距离某个医院最近的5家药店。
可以理解为:
医院
↓
计算与所有药店的Distance
↓
排序
↓
取最小的5个
Distance的基本原理
最简单的距离计算:
Point A
●
\
\
\ Distance
\
●
Point B
计算:
A → B
得到一个数值:
Distance = D
因此:
Geometry A
↓
Distance
↓
Geometry B
最终得到:
距离值
Point与Point距离
Point与Point是最常见的距离计算。
例如:
POINT (0 0)
和:
POINT (3 4)
使用平面坐标计算:
distance = √((3-0)² + (4-0)²)
得到:
distance = 5
即:
A
●
\
\
\
●
B
距离 = 5
欧氏距离
在平面坐标系中,最常见的是欧氏距离。
公式:
d = √((x₂ - x₁)² + (y₂ - y₁)²)
例如:
A = (0, 0)
B = (3, 4)
则:
d = √(3² + 4²)
= √25
= 5
这种方式适合:
- 平面坐标
- 局部区域
- 投影坐标系
- 单位明确的数据
Distance与坐标系
Distance计算中非常重要的一点是:
距离单位取决于坐标系和计算方式。
例如使用:
EPSG:4326
坐标通常是:
经度
纬度
单位为:
度
而不是米。
因此不能简单地认为:
Distance = 0.01
就是:
0.01米
投影坐标系中的Distance
如果使用单位为米的投影坐标系:
X = 米
Y = 米
那么计算:
Distance(A, B)
通常得到:
米
例如:
Point A
(1000, 1000)
Point B
(1300, 1400)
则:
Distance
= √(300² + 400²)
= 500m
经纬度数据的Distance
如果Geometry使用经纬度:
POINT (116.397 39.908)
需要根据具体需求选择距离算法。
常见方式包括:
经纬度
↓
Geodesic Distance
↓
地球曲面距离
而不是简单地:
经度差
+
纬度差
因此全球范围或大范围数据通常需要考虑地球曲率。
Geodesic Distance
Geodesic Distance(测地距离)是沿地球曲面计算的距离。
例如:
Point A
●
╲
╲
╲
●
Point B
计算的是:
两个位置在地球表面上的最短距离。
适合:
- GPS
- 全球地图
- 经纬度数据
- 航空
- 航海
- 大范围地理分析
可以理解为:
EPSG:4326
↓
经纬度
↓
Geodesic Distance
↓
米 / 千米
Point与LineString距离
Distance不仅可以计算点点距离。
例如:
Point
●
|
| 最短距离
|
────────────
LineString
计算的是:
Point到LineString的最短距离。
例如:
车辆
●
↓
最近道路
────────────
可以用于:
- 车辆距离道路
- POI距离道路
- GPS轨迹距离道路
- 建筑距离道路
Point与Polygon距离
Point与Polygon之间的Distance通常表示:
Point到Polygon边界或Geometry的最短距离。
例如:
● Point
|
| Distance
|
┌──────────┐
│ Polygon │
│ │
└──────────┘
如果Point位于Polygon外部,可以计算它到Polygon的最短距离。
如果Point已经位于Polygon内部,根据具体GIS库和距离定义,距离可能为:
0
LineString与LineString距离
两条线之间也可以计算最短距离。
例如:
──────────────
↑
Distance
↓
──────────────
常用于:
- 两条道路距离
- 管线安全距离
- 铁路距离
- 河流距离
例如:
判断两条管线之间是否小于50米。
可以:
Pipe A
↓
Distance
↓
Pipe B
然后判断:
Distance < 50m
Polygon与Polygon距离
两个面之间也可以计算距离。
例如:
┌────────┐
Distance
┌────────┐
│ │
└────────┘
如果两个Polygon没有接触,可以计算:
Polygon A
↓
最短距离
↓
Polygon B
如果两个Polygon相交或接触,通常空间距离为:
0
Distance的核心思想
无论Geometry类型是什么,Distance通常可以理解为:
Geometry A
↓
寻找Geometry B上的最近位置
↓
计算最短距离
即:
Minimum Distance
因此Distance本质上通常是:
两个Geometry之间的最短空间距离。
Minimum Distance
例如两个复杂Polygon:
Polygon A
┌──────────────┐
│ │
│ │
└──────────────┘
↕
最短距离
┌──────────────┐
│ │
└──────────────┘
Polygon B
不是计算两个Geometry中心点之间的距离,而是寻找:
A上的点
↓
B上的点
之间的最小距离。
Distance与Centroid Distance
需要注意:
Geometry Distance
和:
Centroid Distance
不是一回事。
例如:
Polygon A
┌────────┐
│ ● │
└────────┘
↕
↕
┌────────┐
│ ● │
└────────┘
Polygon B
如果计算:
Centroid Distance
得到的是:
两个面中心点之间的距离。
而:
Distance
通常关注:
两个Geometry之间的最短距离。
因此两者结果可能完全不同。
Distance与Buffer
Distance和Buffer有非常密切的关系。
Distance:
Geometry A
↓
Distance
↓
500m
回答:
两个对象距离是多少?
Buffer:
Geometry A
↓
Buffer 500m
↓
区域
回答:
距离A 500米以内的区域在哪里?
因此:
Distance
↓
距离值
Buffer
↓
距离范围
Distance与Nearest
Distance经常用于Nearest分析。
例如:
找到距离医院最近的药店。
流程:
医院
↓
计算Distance
↓
所有药店
↓
排序
↓
最小Distance
↓
Nearest Pharmacy
可以表示为:
Hospital
↓
Distance
↓
Pharmacy A = 1200m
Pharmacy B = 500m
Pharmacy C = 800m
↓
Sort
↓
Pharmacy B
Distance与KNN
KNN(K-Nearest Neighbors)空间查询可以理解为:
找到距离目标Geometry最近的K个对象。
例如:
K = 3
流程:
Point
↓
Distance
↓
所有候选对象
↓
排序
↓
Top 3
结果:
Nearest 1
Nearest 2
Nearest 3
常用于:
- 最近医院
- 最近商店
- 最近充电桩
- 最近公交站
- 最近仓库
Distance与空间查询
例如:
查询某个商场5公里范围内的餐厅。
一种方式:
商场
↓
Buffer 5km
↓
餐厅
↓
Spatial Query
另一种方式:
商场
↓
Distance
↓
所有餐厅
↓
Distance <= 5km
两种方式都可以表达:
距离 <= 5km
Distance与Within
可以将:
Distance <= 1000m
理解为:
Point
↓
位于
↓
Buffer 1000m
因此:
Distance
+
Buffer
+
Within
经常组合使用。
Distance与Intersects
如果两个Geometry:
相交
那么它们之间的最短距离通常为:
0
例如:
Polygon A
┌─────────┐
│ ┌────┼────┐
│ │ │ │
└────┼────┘ │
└─────────┘
Polygon B
两个Geometry存在交集:
Intersects = true
同时:
Distance = 0
Distance与Touches
如果两个Geometry只接触边界:
┌────────┐┌────────┐
│ A ││ B │
└────────┘└────────┘
则:
Touches = true
通常:
Distance = 0
因此:
Distance = 0
并不一定意味着两个Geometry有面积重叠。
它可能意味着:
相交
或者:
接触
Distance与空间关系
可以简单理解:
Distance > 0
↓
两个Geometry存在空间间隔
Distance = 0
↓
Geometry可能相交或接触
但具体判断仍应结合:
Intersects
Touches
Within
Contains
Overlaps
等空间关系。
Distance单位
常见距离单位:
米
千米
英尺
英里
GIS中距离单位通常与:
CRS
以及:
Distance计算方法
有关。
例如投影坐标:
X = meter
Y = meter
那么:
Distance = 500
通常就是:
500m
Distance计算中的CRS
进行Distance计算之前,建议先确认:
Geometry
↓
CRS
↓
Coordinate Unit
例如:
EPSG:4326
通常是:
Degree
而某些投影坐标系:
Projected CRS
通常是:
Meter
因此:
不要只看Distance函数的参数,还要确认Geometry的坐标参考系统。
Distance数据处理流程
一个典型流程:
输入Geometry
↓
检查CRS
↓
确定距离算法
↓
执行Distance
↓
得到距离值
↓
根据阈值进行空间分析
例如:
学校
↓
Distance
↓
居民点
↓
500m
↓
是否 <= 500m
Distance阈值分析
Distance非常适合进行阈值判断。
例如:
Distance <= 1000m
表示:
两个对象之间的距离不超过1公里。
例如:
Distance < 500m
表示:
两个对象距离小于500米。
常用于:
- 服务范围
- 安全距离
- 环境影响
- 设施覆盖
- 空间筛选
Distance应用:最近医院
目标:
找到距离某个居民点最近的医院。
流程:
居民点
↓
计算Distance
↓
医院A
医院B
医院C
医院D
↓
排序
↓
最小距离
↓
最近医院
Distance应用:最近道路
例如:
计算建筑物距离最近道路的距离。
流程:
Building
↓
Distance
↓
Road Network
↓
Minimum Distance
可以得到:
Building A → 30m
Building B → 120m
Building C → 50m
进一步可以筛选:
Distance <= 50m
Distance应用:道路安全距离
例如:
判断建筑物是否距离高速公路小于100米。
流程:
Highway
↓
Distance
↓
Building
↓
Distance < 100m
结果:
风险建筑
Distance应用:充电桩分析
例如:
查询每个充电桩附近2公里范围内的车辆。
流程:
Charging Station
↓
Distance
↓
Vehicles
↓
Distance <= 2km
或者使用:
Charging Station
↓
Buffer 2km
↓
Spatial Query
Distance应用:物流仓库
例如:
找到距离订单位置最近的仓库。
流程:
Order
↓
Distance
↓
Warehouses
↓
Sort
↓
Nearest Warehouse
进一步可以加入:
库存
运输时间
道路距离
进行综合决策。
Distance与直线距离
GIS中的Distance通常需要区分:
Straight-line Distance
和:
Network Distance
直线距离:
A ●────────● B
计算两个Geometry之间的空间距离。
Network Distance:
A ●
╲
╲ 道路
╲
● B
沿道路网络计算。
两者可能差异很大。
Distance与Network Distance
例如:
A ───────── B
如果两点之间存在一条直线:
直线距离 = 2km
但是道路需要绕行:
道路距离 = 3.5km
因此:
Geometry Distance
↓
空间直线距离
而:
Network Distance
↓
沿道路网络的距离
如果用户问:
“离我最近的医院”
简单GIS分析可能使用:
Geometry Distance
而导航系统通常更关注:
Network Distance
Distance与路径分析
Distance本身不等于路径分析。
例如:
A → B
Distance回答:
两点之间有多远?
路径分析回答:
应该怎么走?
因此:
Distance
↓
距离
Routing
↓
路径
两者可以结合使用。
Distance与WKT
WKT可以作为Distance计算的输入。
例如:
POINT (0 0)
和:
POINT (3 4)
流程:
WKT
↓
Geometry
↓
Distance
↓
5
因此WKT非常适合用于:
- 距离计算测试
- GIS开发调试
- 空间数据验证
Distance与GeoJSON
GeoJSON也可以作为输入。
例如:
{
"type": "Point",
"coordinates": [0, 0]
}
与:
{
"type": "Point",
"coordinates": [3, 4]
}
执行:
Distance
得到:
5
实际Web GIS应用通常是:
GeoJSON
↓
Geometry
↓
Distance
↓
分析结果
Distance与Buffer的关系
这是GIS中非常重要的一组概念。
Distance
用于:
计算距离
而:
Buffer
用于:
构建距离范围
例如:
Point A
↓
Distance
↓
Point B = 500m
或者:
Point A
↓
Buffer 500m
↓
500米范围
可以记住:
Distance得到“多少”,Buffer得到“哪里”。
Distance知识结构
可以把Distance总结为:
Distance
│
├── Point → Point
│
├── Point → Line
│
├── Point → Polygon
│
├── Line → Line
│
├── Line → Polygon
│
└── Polygon → Polygon
计算方式:
平面距离
↓
Projected CRS
测地距离
↓
Geographic CRS
空间应用:
Distance
│
├── Nearest
├── KNN
├── Buffer
├── Within
├── Spatial Query
└── 空间分析
Distance常见问题
为什么计算出来的距离单位不对?
首先检查:
CRS
如果使用:
EPSG:4326
坐标通常是度,而不是米。
为什么两个经纬度点的距离不能直接用勾股定理?
因为经纬度坐标位于地球曲面上。
对于大范围数据,需要使用:
Geodesic Distance
或者合适的投影坐标系。
为什么Distance和地图上看起来的距离不一样?
可能使用了不同的:
CRS
或者:
Distance Algorithm
还可能是:
直线距离
与:
道路网络距离
不同。
Distance为0是不是两个对象重叠?
不一定。
Distance为0可能表示:
相交
也可能表示:
仅边界接触
因此需要结合:
Intersects
Touches
Overlaps
等空间关系判断。
总结
Distance(距离)是GIS最基础的空间分析操作之一,用于计算两个Geometry之间的最短空间距离。
核心流程:
Geometry A
↓
Distance
↓
Geometry B
↓
Distance Value
常见计算关系:
Point → Point
Point → Line
Point → Polygon
Line → Line
Line → Polygon
Polygon → Polygon
需要特别注意:
Distance的单位与坐标参考系统(CRS)和距离计算方法密切相关。
对于经纬度数据,需要区分:
平面距离
和:
测地距离
对于道路导航等场景,还需要区分:
直线距离
和:
网络距离
Distance与Buffer可以这样记:
Distance
↓
计算“有多远”
Buffer
↓
生成“多远以内的范围”
一个典型GIS空间分析流程是:
Geometry
↓
Distance
↓
距离值
↓
阈值判断
↓
Nearest / KNN / Spatial Query
↓
空间分析结果
相关工具
使用 IYATools 在线工具快速处理 GIS 数据