GIS

WKB是什么

了解GIS中WKB(Well-Known Binary)的基本概念、Geometry二进制结构、字节序、Geometry类型以及WKB与WKT、GeoJSON、Shapefile和GeoPackage之间的关系。

阅读约 77 分钟

WKB是什么

WKB(Well-Known Binary)是一种用于表示GIS Geometry的二进制格式。

它与WKT(Well-Known Text)属于同一类标准表达方式。

WKT使用文本表示Geometry:

POINT (116.397 39.908)

WKB则使用二进制表示同一个Geometry。

简单来说:

WKT是Geometry的文本表示,WKB是Geometry的二进制表示。

WKB主要用于:

  • GIS数据存储
  • 空间数据库
  • 数据交换
  • Geometry序列化
  • GIS程序开发
  • 大规模空间数据处理

WKB的基本结构

一个WKB Geometry通常包含:

WKB
├── Byte Order
├── Geometry Type
└── Coordinates

可以理解为:

字节序
   ↓
Geometry类型
   ↓
坐标数据

例如一个Point:

WKB
 ↓
Byte Order
 ↓
Point
 ↓
X
 ↓
Y

WKB为什么使用二进制

WKT是文本:

POINT (116.397 39.908)

它具有:

  • 可读性好
  • 方便调试
  • 容易查看

但文本需要保存大量字符。

WKB则直接使用二进制数据:

Binary
 ↓
Geometry
 ↓
Coordinates

因此更加适合程序直接读取和处理。

可以理解为:

WKT
 ↓
给人看

WKB
 ↓
给程序处理

WKB与WKT

WKT和WKB描述的是相同的Geometry概念。

例如:

POINT (116.397 39.908)

可以表示为WKT。

同一个Geometry也可以编码为WKB。

因此:

Geometry
   │
   ├──→ WKT
   │      ↓
   │    Text
   │
   └──→ WKB
          ↓
        Binary

两者最大的区别是:

对比WKTWKB
表示方式文本二进制
可读性
程序处理可以更适合
数据大小通常较大通常更紧凑
调试容易较困难
数据库支持广泛支持

WKB的字节序

WKB的第一个部分通常用于表示字节序。

常见的字节序包括:

Little Endian
Big Endian

也可以理解为:

Byte Order
    ↓
告诉程序
    ↓
后续多字节数据应该如何读取

常见标记为:

00

和:

01

其中具体含义取决于WKB规范约定。

简单理解:

Byte Order
    ↓
数据读取方式

Little Endian

Little Endian表示低位字节优先。

例如:

01

通常表示使用Little Endian。

现代PC计算机中,小端字节序非常常见。

因此很多GIS程序生成的WKB数据都可能以:

01

开头。

Big Endian

Big Endian表示高位字节优先。

WKB中通常可以使用:

00

表示Big Endian。

因此程序读取WKB时,首先需要判断:

Byte Order

然后再按照对应方式读取后续数据。

Geometry Type

WKB中还需要记录Geometry类型。

常见类型包括:

Point
LineString
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection

可以理解为:

WKB
 ↓
Geometry Type
 ↓
决定后面数据如何解析

例如:

Point

后面是:

X
Y

而:

LineString

后面则需要:

Point数量
+
多个Point坐标

Point的WKB结构

Point是最简单的WKB Geometry之一。

结构可以理解为:

Point WKB
├── Byte Order
├── Geometry Type
├── X
└── Y

例如:

POINT (116.397 39.908)

对应:

Geometry Type
    ↓
Point

Coordinates
    ↓
X = 116.397
Y = 39.908

因此程序读取Point WKB时,只需要依次读取:

Byte Order
Geometry Type
X
Y

LineString的WKB结构

LineString由多个Point组成。

结构可以理解为:

LineString WKB
├── Byte Order
├── Geometry Type
├── Point Count
└── Points
    ├── X Y
    ├── X Y
    └── X Y

例如:

LINESTRING (
  116.397 39.908,
  116.405 39.915,
  116.412 39.920
)

需要保存:

Point Count = 3

然后依次保存三个坐标。

Polygon的WKB结构

Polygon结构比LineString更加复杂。

可以理解为:

Polygon WKB
├── Byte Order
├── Geometry Type
├── Ring Count
└── Rings
    ├── Point Count
    └── Points

例如一个简单Polygon:

POLYGON ((
  0 0,
  10 0,
  10 10,
  0 10,
  0 0
))

可以理解为:

Polygon
    ↓
1个Ring
    ↓
5个Point
    ↓
坐标

其中最后一个Point通常与第一个Point相同,从而形成闭合环。

Polygon中的Ring

Polygon可以包含多个Ring。

结构:

Polygon
├── Exterior Ring
└── Interior Rings
    ├── Ring 1
    └── Ring 2

其中:

Exterior Ring

通常表示外部边界。

而:

Interior Ring

可以表示内部空洞。

例如:

Polygon
┌─────────────────┐
│                 │
│     ┌─────┐     │
│     │Hole │     │
│     └─────┘     │
│                 │
└─────────────────┘

WKB需要保存这些Ring及其坐标。

MultiPoint的WKB结构

MultiPoint用于表示多个Point。

结构:

MultiPoint
├── Byte Order
├── Geometry Type
├── Geometry Count
└── Point
    ├── WKB Point
    ├── WKB Point
    └── WKB Point

例如:

MULTIPOINT (
  (116.397 39.908),
  (116.405 39.915)
)

可以理解为:

MultiPoint
    ↓
Point
    +
Point

MultiLineString的WKB结构

MultiLineString用于表示多个LineString。

结构:

MultiLineString
├── Byte Order
├── Geometry Type
├── Geometry Count
└── LineStrings
    ├── LineString
    ├── LineString
    └── LineString

例如:

MULTILINESTRING (
  (
    0 0,
    10 10
  ),
  (
    20 20,
    30 30
  )
)

MultiPolygon的WKB结构

MultiPolygon用于表示多个Polygon。

结构:

MultiPolygon
├── Byte Order
├── Geometry Type
├── Geometry Count
└── Polygons
    ├── Polygon
    ├── Polygon
    └── Polygon

例如:

MULTIPOLYGON (
  ((...)),
  ((...))
)

每一个Polygon内部仍然可以包含:

Exterior Ring
+
Interior Rings

GeometryCollection

GeometryCollection可以包含不同类型的Geometry。

例如:

GeometryCollection
├── Point
├── LineString
└── Polygon

这种结构与:

MultiPoint
MultiLineString
MultiPolygon

不同。

Multi类型要求集合中的Geometry类型相同,而GeometryCollection可以包含不同类型。

WKB中的Z坐标

WKB不仅可以表示二维Geometry,也可以表示三维Geometry。

二维:

X Y

三维:

X Y Z

例如:

POINT Z (116.397 39.908 45)

其中:

X = 116.397
Y = 39.908
Z = 45

Z可以表示:

  • 高程
  • 高度
  • 三维空间位置

WKB中的M值

Geometry还可以带有M(Measure)值。

例如:

X Y M

或者:

X Y Z M

M可以表示:

  • 里程
  • 时间
  • 测量值
  • 轨迹距离

因此WKB可以表示更加丰富的Geometry。

WKB与EWKB

除了标准WKB之外,GIS数据库中还经常看到:

EWKB

即Extended Well-Known Binary。

EWKB是在WKB基础上的扩展形式。

它可以用于表达一些额外的信息,例如:

Z
M
SRID

其中SRID可以用于标识坐标参考系统。

例如:

Geometry
+
SRID

可以让Geometry携带更多空间参考信息。

WKB与SRID

标准WKB本身主要负责Geometry的二进制表示。

坐标参考系统通常由外部元数据管理。

例如:

WKB
    ↓
Geometry

另外:

CRS
    ↓
EPSG:4326

而某些扩展格式,例如EWKB,可以在Geometry数据中携带SRID。

因此需要区分:

Geometry
    ↓
WKB

和:

Geometry
+
CRS

WKB与GeoJSON

GeoJSON主要使用JSON表示Geometry。

例如:

{
  "type": "Point",
  "coordinates": [116.397, 39.908]
}

WKB则使用二进制表示。

因此:

GeoJSON
    ↓
JSON
    ↓
Human / Web

WKB
    ↓
Binary
    ↓
Program / Database

两者都可以表示Geometry,但应用场景不同。

对比WKBGeoJSON
格式二进制JSON
可读性
Web API一般非常适合
数据库非常适合支持
序列化非常适合适合
调试较困难容易

WKB与Shapefile

Shapefile中的Geometry也是二进制存储。

但Shapefile和WKB并不是同一种格式。

Shapefile:

.shp
├── File Header
├── Record
├── Shape Type
└── Geometry

WKB:

WKB
├── Byte Order
├── Geometry Type
└── Coordinates

因此:

Shapefile是一种完整的GIS文件格式,而WKB是一种Geometry二进制编码方式。

WKB与GeoPackage

GeoPackage基于SQLite。

GeoPackage中的Geometry可以使用标准化的二进制空间数据表示方式。

可以理解为:

GeoPackage
    ↓
SQLite
    ↓
Geometry BLOB
    ↓
空间二进制数据

因此在GIS数据库和文件数据库中经常会接触到WKB以及与WKB类似的Geometry二进制结构。

WKB与GeoParquet

GeoParquet也可以使用WKB编码Geometry。

可以理解为:

GeoParquet
    ↓
Geometry Column
    ↓
Binary
    ↓
WKB

这样可以将Geometry作为Parquet的二进制列进行高效存储。

因此:

GeoParquet
    ↓
Columnar Storage
    ↓
Binary Geometry

非常适合大规模GIS数据分析。

WKB在空间数据库中的应用

WKB在空间数据库中非常常见。

例如空间数据库中的Geometry:

Table
├── id
├── name
└── geometry

Geometry字段可能以二进制形式存储。

可以理解为:

geometry
    ↓
Binary
    ↓
WKB-like representation

数据库可以将其转换为:

WKT

供开发者查看。

因此开发GIS程序时经常会遇到:

Database
    ↓
WKB
    ↓
Geometry
    ↓
WKT

WKB的常见应用

空间数据库

Database
    ↓
Geometry
    ↓
WKB / Binary

数据交换

GIS Application
    ↓
WKB
    ↓
GIS Application

Geometry序列化

Geometry Object
    ↓
WKB
    ↓
Binary Data

GeoParquet

Geometry
    ↓
WKB
    ↓
Parquet Binary Column

GIS程序开发

程序可以:

WKB
 ↓
Decode
 ↓
Geometry Object

也可以反过来:

Geometry Object
 ↓
Encode
 ↓
WKB

WKB编码流程

一个Geometry转换为WKB的基本过程:

Geometry
    ↓
确定Byte Order
    ↓
确定Geometry Type
    ↓
写入Geometry数量
    ↓
写入Coordinates
    ↓
Binary

例如Point:

Point
 ↓
Byte Order
 ↓
Type = Point
 ↓
X
 ↓
Y
 ↓
WKB

LineString:

LineString
 ↓
Byte Order
 ↓
Type
 ↓
Point Count
 ↓
Point 1
 ↓
Point 2
 ↓
Point 3
 ↓
WKB

WKB解析流程

反过来,从WKB读取Geometry:

WKB
 ↓
读取Byte Order
 ↓
读取Geometry Type
 ↓
读取Geometry数据
 ↓
读取Coordinates
 ↓
Geometry Object

例如:

WKB
 ↓
Point
 ↓
X Y
 ↓
POINT

如果是Polygon:

WKB
 ↓
Polygon
 ↓
Ring Count
 ↓
Point Count
 ↓
Coordinates
 ↓
Polygon

WKB为什么不适合直接阅读

例如WKT:

POINT (116.397 39.908)

一眼就能理解。

WKB通常表现为十六进制:

0101000000...

或者更长的十六进制字符串。

因此:

WKT
 ↓
适合人工阅读

WKB
 ↓
适合程序处理

如果需要查看WKB内容,可以使用WKB解析工具将其转换为:

WKB
 ↓
WKT

或者:

WKB
 ↓
GeoJSON

WKB与Hex

WKB本质上是二进制数据。

但在数据库、API或者文本环境中,经常会把WKB转换成十六进制字符串。

例如:

Binary
    ↓
Hexadecimal
    ↓
0101000000...

因此看到:

0101000000...

并不意味着WKB本身是文本格式。

实际上:

WKB
 ↓
Binary
 ↓
Hex representation

只是为了方便传输和显示。

WKB的优势

WKB主要优势包括:

  • 二进制表示
  • 结构紧凑
  • 程序解析方便
  • 适合数据库
  • 适合Geometry序列化
  • 支持复杂Geometry
  • 支持二维和扩展维度
  • 适合数据交换

WKB的局限

WKB也有一些明显特点:

不可直接阅读
调试不如WKT方便
需要解析器
单独的WKB通常不包含完整属性信息
CRS通常需要额外元数据

因此WKB不是完整的GIS图层格式。

它主要解决:

如何把Geometry编码成二进制数据。

GIS数据格式之间的关系

可以建立这样的关系:

Geometry
    │
    ├──→ WKT
    │      ↓
    │    Text
    │
    └──→ WKB
           ↓
         Binary

完整GIS数据格式则是:

Geometry
+
Attributes
+
CRS
+
Metadata
    ↓
GIS Data Format

例如:

Shapefile
GeoJSON
GeoPackage
GeoParquet

GIS格式选择

可以简单理解:

Geometry文本表示
    ↓
WKT

Geometry二进制表示
    ↓
WKB

Web GIS数据交换
    ↓
GeoJSON

传统GIS文件
    ↓
Shapefile

本地空间数据库
    ↓
GeoPackage

大规模空间分析
    ↓
GeoParquet

WKB知识结构

可以把WKB总结为:

WKB
│
├── Byte Order
│
├── Geometry Type
│   ├── Point
│   ├── LineString
│   ├── Polygon
│   ├── MultiPoint
│   ├── MultiLineString
│   ├── MultiPolygon
│   └── GeometryCollection
│
├── Coordinates
│   ├── X
│   ├── Y
│   ├── Z
│   └── M
│
└── Extended Formats
    └── EWKB

核心关系:

Coordinates
    ↓
Geometry
    ↓
WKB
    ↓
Binary

WKB与GIS数据处理

在实际GIS数据处理中,可以看到:

Shapefile
    ↓
读取Geometry
    ↓
WKB
    ↓
数据库 / GeoParquet

也可以:

Database
    ↓
WKB
    ↓
Geometry
    ↓
GeoJSON

或者:

WKB
    ↓
WKT
    ↓
人工检查

因此WKB经常作为GIS系统内部的数据交换和序列化形式。

总结

WKB(Well-Known Binary)是一种用于表示GIS Geometry的二进制格式。

它的核心结构可以理解为:

Byte Order
    ↓
Geometry Type
    ↓
Coordinates
    ↓
Binary Geometry

最常见的Geometry包括:

Point
LineString
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection

可以记住:

WKT使用文本表示Geometry,WKB使用二进制表示Geometry;WKT方便人阅读,WKB更加适合程序、数据库和空间数据存储。

在GIS数据体系中:

Geometry
    │
    ├── WKT
    │    └── 文本表示
    │
    └── WKB
         └── 二进制表示

完整GIS数据
    │
    ├── GeoJSON
    ├── Shapefile
    ├── GeoPackage
    └── GeoParquet

理解WKB之后,可以继续学习WKB解析、WKB转WKT、WKB转GeoJSON以及GIS空间数据库中的Geometry存储方式。

🧰

相关工具

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