GIS

GIS Distance是什么

了解GIS中Distance(距离)的基本概念、点点距离、点线距离、点面距离、距离单位、坐标系以及Distance与Buffer、Nearest和空间分析之间的关系。

阅读约 92 分钟

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 数据