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
两者最大的区别是:
| 对比 | WKT | WKB |
|---|---|---|
| 表示方式 | 文本 | 二进制 |
| 可读性 | 高 | 低 |
| 程序处理 | 可以 | 更适合 |
| 数据大小 | 通常较大 | 通常更紧凑 |
| 调试 | 容易 | 较困难 |
| 数据库 | 支持 | 广泛支持 |
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,但应用场景不同。
| 对比 | WKB | GeoJSON |
|---|---|---|
| 格式 | 二进制 | 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 数据