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数据格式。
| 对比 | GeoPackage | Shapefile |
|---|---|---|
| 文件数量 | 通常一个文件 | 通常多个文件 |
| 数据库 | SQLite | 文件集合 |
| 多图层 | 支持 | 一个Shapefile一个图层 |
| 属性字段 | 更灵活 | 有较多传统限制 |
| 空间索引 | 支持 | 支持相关索引机制 |
| 栅格 | 支持 | 主要用于矢量 |
| 现代GIS | 推荐 | 传统格式 |
| 数据交换 | 很适合 | 非常常见 |
例如Shapefile:
roads.shp
roads.shx
roads.dbf
roads.prj
GeoPackage:
roads.gpkg
如果一个项目包含大量图层,GeoPackage通常更加方便。
GeoPackage与GeoJSON
GeoPackage和GeoJSON都可以保存空间数据,但定位不同。
| 对比 | GeoPackage | GeoJSON |
|---|---|---|
| 基础技术 | SQLite | JSON |
| 多图层 | 支持 | 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 数据