GIS

GeoPackage是什么

了解GeoPackage的基本概念、文件结构、矢量数据、栅格数据、空间索引以及GeoPackage与Shapefile、GeoJSON的区别。

阅读约 49 分钟

GeoPackage是什么

GeoPackage是一种用于存储地理空间数据的开放标准格式。

它通常使用:

.gpkg

作为文件扩展名。

GeoPackage本质上是一个基于SQLite的空间数据容器,可以在一个文件中保存:

  • 矢量数据
  • 属性数据
  • 栅格数据
  • 空间索引
  • 图层信息
  • 坐标参考系统
  • 元数据

简单来说:

GeoPackage可以把多个GIS图层和相关空间数据集中保存到一个文件中。

GeoPackage有什么特点

GeoPackage具有以下特点:

  • 单文件
  • 基于SQLite
  • 支持矢量数据
  • 支持栅格数据
  • 支持空间索引
  • 支持多个图层
  • 支持事务
  • 开放标准
  • 适合离线GIS
  • 适合桌面GIS和数据交换

传统Shapefile通常需要多个文件:

roads.shp
roads.shx
roads.dbf
roads.prj

而GeoPackage通常可以:

roads.gpkg

一个文件保存完整的数据。

GeoPackage的文件结构

GeoPackage本质上是SQLite数据库。

因此可以理解为:

GeoPackage
    ↓
SQLite Database
    ↓
Tables
    ↓
GIS Data

一个GeoPackage内部可能包含:

roads
buildings
landuse
cities
spatial_ref_sys
gpkg_contents
gpkg_geometry_columns

因此:

一个.gpkg文件
    ↓
多个数据表
    ↓
多个GIS图层

GeoPackage与SQLite

GeoPackage建立在SQLite之上。

普通SQLite主要用于:

关系数据

而GeoPackage在SQLite的基础上增加了:

空间数据
空间参考
空间索引
GIS图层
空间几何

因此可以理解为:

SQLite
    +
GIS空间标准
    ↓
GeoPackage

GeoPackage可以保存多个图层

这是GeoPackage非常重要的特点。

例如一个:

city.gpkg

可以同时包含:

city.gpkg
├── roads
├── buildings
├── rivers
├── lakes
├── parks
└── administrative_area

而不是每个图层都必须使用一个独立文件。

因此GeoPackage特别适合:

一个项目包含多个GIS图层的场景。

GeoPackage中的矢量数据

GeoPackage可以保存常见的矢量Geometry。

包括:

Point
MultiPoint
LineString
MultiLineString
Polygon
MultiPolygon

例如:

roads
    ↓
LineString

cities
    ↓
Point

buildings
    ↓
Polygon

因此可以同时保存:

道路
建筑物
河流
城市
行政区
土地利用

GeoPackage中的属性数据

除了Geometry之外,GeoPackage还可以保存属性信息。

例如道路图层:

roads
├── id
├── name
├── type
├── speed
└── geometry

其中:

id
name
type
speed

属于属性数据。

而:

geometry

属于空间数据。

因此一个GIS要素可以理解为:

Feature
├── Geometry
└── Attributes

GeoPackage中的Geometry

GeoPackage中的Geometry用于保存空间形状。

例如:

Point
    ↓
一个位置

LineString
    ↓
一条道路

Polygon
    ↓
一个区域

可以理解为:

Coordinates
    ↓
Geometry
    ↓
Feature
    ↓
Layer

这与GeoJSON、Shapefile等矢量数据模型是一致的。

GeoPackage中的坐标参考系统

GeoPackage可以保存坐标参考系统信息。

例如:

EPSG:4326

或者:

EPSG:3857

GeoPackage会记录图层使用的空间参考系统。

因此一个图层不仅保存:

X
Y

还可以知道:

这些坐标属于哪个CRS

可以理解为:

Geometry
    ↓
Coordinates
    ↓
CRS
    ↓
真实空间位置

GeoPackage与空间索引

GeoPackage可以使用空间索引提高空间查询效率。

例如:

查询某个区域内的道路

如果数据量非常大:

100万条道路

直接逐条判断可能比较慢。

空间索引可以帮助数据库快速缩小查询范围:

空间查询
    ↓
空间索引
    ↓
候选Geometry
    ↓
精确判断

这对于:

  • 范围查询
  • 相交查询
  • 附近查询
  • 地图显示

都非常重要。

GeoPackage中的空间数据表

GeoPackage会使用专门的元数据表描述空间图层。

例如:

gpkg_contents

用于描述GeoPackage中的内容。

还可以看到:

gpkg_geometry_columns

用于描述Geometry列。

以及:

gpkg_spatial_ref_sys

用于记录空间参考系统。

可以理解为:

gpkg_contents
    ↓
有哪些图层

gpkg_geometry_columns
    ↓
Geometry是什么

gpkg_spatial_ref_sys
    ↓
使用什么坐标系

GeoPackage与Shapefile

GeoPackage和Shapefile都是常见的GIS数据格式。

对比GeoPackageShapefile
文件数量通常一个文件通常多个文件
数据库SQLite文件集合
多图层支持一个Shapefile一个图层
属性字段更灵活有较多传统限制
空间索引支持支持相关索引机制
栅格支持主要用于矢量
现代GIS推荐传统格式
数据交换很适合非常常见

例如Shapefile:

roads.shp
roads.shx
roads.dbf
roads.prj

GeoPackage:

roads.gpkg

如果一个项目包含大量图层,GeoPackage通常更加方便。

GeoPackage与GeoJSON

GeoPackage和GeoJSON都可以保存空间数据,但定位不同。

对比GeoPackageGeoJSON
基础技术SQLiteJSON
多图层支持FeatureCollection组织数据
数据库能力
空间索引支持本身不提供数据库索引
Web开发一般非常适合
大数据量更适合文件可能较大
离线GIS非常适合可以
数据交换很适合很适合

简单理解:

GeoJSON
    ↓
Web GIS

而:

GeoPackage
    ↓
GIS数据存储

GeoPackage与WKT

WKT主要用于表示Geometry。

例如:

POINT (116.397 39.908)

而GeoPackage是一个完整的空间数据容器。

因此:

WKT
    ↓
Geometry文本

GeoPackage
    ↓
完整空间数据文件

GeoPackage可以保存:

Geometry
+
Attributes
+
CRS
+
Indexes
+
Metadata

所以两者不是同一层次的数据格式。

GeoPackage与KML

KML主要用于:

  • 地图数据展示
  • Google Earth
  • 地理可视化
  • 空间对象描述

GeoPackage更加偏向:

  • GIS数据存储
  • 空间数据库
  • 多图层管理
  • 离线GIS
  • 空间分析

可以简单理解为:

KML
    ↓
地图展示与交换

GeoPackage
    ↓
GIS数据存储与管理

GeoPackage与PostGIS

GeoPackage和PostGIS都可以用于空间数据存储。

但是两者的运行方式不同。

GeoPackage:

单个文件
    ↓
本地GIS

PostGIS:

PostgreSQL
    ↓
PostGIS
    ↓
服务器空间数据库

因此:

GeoPackage
    ↓
文件型空间数据库

PostGIS
    ↓
服务器型空间数据库

GeoPackage特别适合:

  • 桌面GIS
  • 离线GIS
  • 数据交换
  • 小型项目
  • 移动GIS

PostGIS更加适合:

  • 多用户系统
  • Web GIS
  • 企业GIS
  • 大规模空间分析
  • 服务端空间数据库

GeoPackage常见应用

GeoPackage可以用于:

GIS项目数据

project.gpkg
├── roads
├── buildings
├── rivers
├── landuse
└── boundaries

离线地图

移动设备没有网络时,可以读取:

offline-map.gpkg

加载本地地图数据。

数据交换

不同GIS软件之间可以使用GeoPackage交换数据。

例如:

GIS软件
    ↓
GeoPackage
    ↓
另一个GIS软件

空间分析

GeoPackage可以保存空间数据,并结合空间索引进行查询和分析。

GeoPackage的优势

GeoPackage最大的优势之一是:

使用一个文件管理多个GIS图层。

例如一个城市GIS项目:

city.gpkg
│
├── roads
├── buildings
├── water
├── parks
├── landuse
├── poi
└── administrative

相比:

roads.shp
roads.shx
roads.dbf
roads.prj

buildings.shp
buildings.shx
buildings.dbf
buildings.prj

...

管理起来更加简单。

GeoPackage的局限

GeoPackage虽然功能丰富,但也不是所有场景都最合适。

例如:

多人同时在线编辑

这种场景通常更适合:

PostGIS

而如果只是:

Web API返回空间数据

通常GeoJSON更加方便。

因此可以根据场景选择:

Web接口
    ↓
GeoJSON

本地GIS项目
    ↓
GeoPackage

服务器空间数据库
    ↓
PostGIS

传统GIS交换
    ↓
Shapefile

GeoPackage文件处理流程

处理GeoPackage时通常可以采用:

.gpkg
 ↓
读取SQLite数据库
 ↓
读取图层
 ↓
读取Geometry
 ↓
读取Attributes
 ↓
读取CRS
 ↓
地图显示

如果需要转换:

GeoPackage
 ↓
读取图层
 ↓
导出
 ├── GeoJSON
 ├── Shapefile
 ├── CSV
 └── WKT

GeoPackage与GIS软件

GeoPackage可以被很多GIS软件使用。

常见GIS软件包括:

  • QGIS
  • ArcGIS
  • GDAL
  • GeoServer
  • SQLite工具
  • 各类GIS开发库

因此GeoPackage在GIS数据交换和管理中具有较好的兼容性。

GeoPackage常见问题

一个GeoPackage能有多个图层吗?

可以。

例如:

map.gpkg
├── roads
├── buildings
├── rivers
└── lakes

GeoPackage只能保存矢量吗?

不是。

GeoPackage除了矢量数据,也可以用于特定类型的栅格和瓦片数据存储。

GeoPackage是数据库吗?

可以将它理解为:

一个基于SQLite的文件型空间数据库容器。

GeoPackage一定只有一个文件吗?

GeoPackage最典型的特点就是将数据集中存储在一个.gpkg文件中。

这也是它相较于传统Shapefile非常明显的优势。

GeoPackage知识结构

可以把GeoPackage总结为:

GeoPackage
│
├── SQLite
│
├── Vector Data
│   ├── Point
│   ├── LineString
│   ├── Polygon
│   └── Multi*
│
├── Attributes
│
├── CRS
│
├── Spatial Index
│
├── Metadata
│
└── Multiple Layers

核心关系:

.gpkg
    ↓
SQLite Database
    ↓
Multiple Tables
    ↓
Multiple GIS Layers
    ↓
Features
    ↓
Geometry + Attributes

常见GIS格式选择

可以根据实际需求选择:

Web GIS
    ↓
GeoJSON

本地空间数据
    ↓
GeoPackage

传统GIS交换
    ↓
Shapefile

Geometry文本交换
    ↓
WKT

服务器空间数据库
    ↓
PostGIS

地图展示
    ↓
KML

总结

GeoPackage是一种基于SQLite的开放GIS空间数据格式。

它最大的特点是:

一个文件
    ↓
多个GIS图层
    ↓
Geometry
+
Attributes
+
CRS
+
Spatial Index
+
Metadata

与Shapefile相比,GeoPackage能够将多个图层集中保存到一个文件中;与GeoJSON相比,GeoPackage更偏向空间数据存储和管理;与PostGIS相比,GeoPackage更加适合本地文件型GIS应用。

可以记住:

GeoJSON适合Web地图数据交换,GeoPackage适合本地GIS数据存储,PostGIS适合服务器空间数据库。

因此GeoPackage是现代GIS数据管理、离线地图、空间数据交换以及桌面GIS项目中非常重要的一种数据格式。

🧰

相关工具

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