GeoPackage - 一个简便轻量的本地地理数据库
GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。
当前标准是1.2.1,该版本的html版说明书:https://www.geopackage.org/spec121/index.html。
本文简单介绍一些最需要关注的特点,因为笔者也是菜鸡(刚开始学)
1. 简介
1.1 扩展名与数据库识别方法
它在非编辑、非连接状态时,扩展名是*.gpkg;在数据连接或编辑状态时,会多出来两个同名不同拓展名的文件:*.gpkg-wal、*.gpkg-shm。
如果不确定获得的gpkg文件是否是SQLite数据库,可以用二进制查看器看最开始的字节信息,前16个字节应为以null结尾的ASCII字符串“SQLite format 3”。有关更多二进制信息,请到OGC官网上查看说明书。
1.2 数据存储上限与支持的数据
gpkg最大数据量为140TB(应该没多少项目用得到吧...)
它能存储的数据有:
- 矢量数据
- 栅格数据
- 属性数据(非空间数据)
- 其他
“其他”意味着可以扩展gpkg数据库,但是目前笔者没有这个能力。
1.3 与其他类似的本地数据库比较
因为单文件的特点,与ArcGIS家族中的Geodatabase模型的实现——mdb和gdb很像。它们同为本地数据库。
gpkg没有类似ArcGIS中要素数据集的概念,也没有PostGIS中模式的概念(可能我没发现,暂时做狗头处理)
1.4 创建gpkg和打开gpkg的方法
- 如果想直接用SQL访问gpkg,请使用DB Browser for SQLite
- 如果要在网络端访问gpkg,推荐用NGA’s application
- 如果想在桌面端访问,那么可以用的工具有很多,比如GDAL、QGIS、ArcGIS等。
gpkg可以直接被ArcGIS识别并增删改查数据(即ArcGIS内置了支持)
gpkg也可以被QGIS识别并增删改查数据。
1.5 什么时候用gpkg
因为SQLite“单文件”、“轻量化”的特点,所以gpkg特别适用于小规模的场景和移动场景。比如学生练习、手机等。
如果想多种途径创建gpkg,请阅读此文:点我
但是,通常使用GIS桌面客户端就可以了。
1.6 支持gpkg的GIS客户端、服务器、开发工具
- 客户端:QGIS、ArcGIS(10.2.2及更高版本支持读写,总之用新版本就好了)、GeoTools、FME、Skyline、MapInfo等
- 服务器:GeoServer
- 开发工具:GDAL
此外,SpatialLite 4.2.0以上也支持gpkg。
1.7 OGC中GeoPackage官网的常见问题
- gpkg会代替shp吗?
看你怎么想。可以替代,但是没必要。像简单的交换数据和显示简单的数据,GeoJson就可以完成。(详细的看第二节)
- gpkg安全吗?
gpkg只是SQLite的一种编码、规定,没有像其他DBMS一样的安全管理。不过,已经有人实践了SQLite的安全扩展模块,可以考虑一下或者换更安全的数据库管理系统,例如PostgreSQL。
- 为什么gpkg用的WKB编码与PostGIS、SpatialLite的WKB不同?
因为原始的WKB标准不能满足gpkg,所以要扩展。PostGIS和SpatialLite都这么做了。
2. gpkg vs shp文件(部分翻译)
QGIS 3.X默认从shp文件切换到gpkg,因此,渲染变得非常快。使用gpkg比使用shp文件在加载,平移和缩放时更快。
2.1 gpkg的优缺点
优点:
- 开源
- OGC标准之一
- 软件支持广泛,有GDAL、QGIS、R、Python、Esri家族...
- 比传统意义上的地理数据库轻量化,但是和地理数据库速度相差无几
- 单文件,比shp文件好管理
- 在工作流上比shp快速
- 几乎没有限制(指的是体积)
缺点:
- 还不成熟(现在版本才1.2.1,原文写的时候才是1.0)不过,这个只是时间问题
- 个人体验中栅格数据的支持比较受限制
2.2 shp文件的优缺点
优点:
- 通用标准!(2020年就是shp文件的30岁)
- 它就是个矢量数据的标志(GIS矢量数据几乎会问有没有shp文件?)
缺点:
- Esri维护
- 数据访问上有些迟钝
- 是一个多文件格式(有很多GIS菜鸟不知道要发送多个同名文件,只发送了几何数据的shp文件)
- 不能拓扑
- 属性名限制为10字符
- 它使用的是Esri定制的WKT,切换平台时可能会导致不一致
- 每个shp文件只支持最大2GB
- 每个shp文件只能是一种几何类型
- 没有真正的3D支持(gpkg已经根据社区的贡献拓展出了3d支持)
2.3 建议
原作者希望更多人使用gpkg而不要再继续使用shp了(笔者注:旧事物还有利用的余地时,新事物的推动就会非常困难;除非使用政治或者垄断手段强行更改(比如当年Esri的Coverage格式被Esri自己干掉了)——不太可能,这些都非常符合马克思主义;而且,是否使用gpkg或者shp或者其他数据库,都要具体问题具体分析)
如果你有庞大的数据需要存储、管理,原作者建议使用PostGIS。如果您喜欢GeoPackage,请与您的同事和合作者分享这些信息!
3. shp文件必须死!(偏激预警,不喜勿喷,部分翻译)
似乎有一小撮人,正在鼓吹shp必死论(可能是受够了shp的缺点了吧!),我就简单翻译一下。
shp文件具体是什么我就不过多介绍了,它诞生于1990年,马上就是它的30大寿了。
尽管shp文件是Esri维护的,但是它的规范是开放的,也就是说,如果你懂了shp文件的几大数据结构构成,会编程,你也可以手搓一个shp文件读写程序,不需要依赖任何第三方库。
3.1 shp文件的缺陷
但是,下面原文开始重点驳斥shp文件的坏处:
为什么Shapefile这么糟糕?以下是Shapefile格式错误的几个原因,您应该避免使用它:
- 要额外使用prj文件定义坐标系统(shp文件规范不包括prj文件来定义坐标系统,这是额外的)
- 多文件格式(至少要3个文件,其他软件还会自己扩充更多同名扩展文件,这就使得数据共享非常麻烦,这也是一个非常致命的弱点)
- 属性名最多为10字符
- dbf属性表最多255个字段
- 数据类型有限,只支持浮点数、整数、日期、文本,一个值最多254字符
- 文字编码有大问题,在ArcGIS中打开shp文件中文乱码的问题大家肯定遇到过
- shp文件和dbf文件最大2GB(虽然GDAL改进了但是毫无卵用)
- 不能拓扑
- 每个shp只能是一种几何类型
- 更复杂的数据结构无法实现,例如不规则三角网等
- 不能用纹理或材质存储3d数据
- ...
不展开了,有兴趣的朋友到他们官网看即可
3.1 备选方案
讲道理,现在没有任何一种矢量格式能完全替代shp,但是不得不说其他的格式正在慢慢崛起,有他们的用户。
例如,kml、gml、geojson等
一些Shapefile替代品:
- OGC GeoPackage
- GeoJSON
- OGC GML
- SpatiaLite
- CSV
- OGC KML
其中,第一位列的就是gpkg,而且经过近几年的迭代升级、修订,再加上它可以扩展的特性,使得gpkg更强大。
GeoPackage的一个缺点是,它底层SQLite数据库是一种复杂的二进制格式,不适合流式传输。它必须写入本地文件系统或通过中间服务访问。所以,在本地应用中,gpkg是shp文件的一个不错替代品(如果你有需要)
GeoJson并不是shp文件的代替品,只是地理数据的一种json实现。它的一个特点就是支持流传输;存在的问题是,不是所有的几何都可以表示,高级的坐标系统支持也不算好。
所以,基于XML的GML格式(仅支持矢量数据)就有了用武之地。但是GML也有其缺点,就是数据结构定义标准复杂,较少软件愿意支持它,ArcGIS把它的支持丢进了数据互操作模块。如果GeoJson不能解决问题,可以试试GML。
SpatialLite和gpkg类似,也是一个开源数据库,也是基于SQLite,也是单文件,也支持SQL,但是不如gpkg广泛。究其原因,是因为sl缺乏扩展能力(好比世界之窗vsChrome),也不支持栅格数据。同样的,它也不支持流传输。
csv文件,估计有的同学用过,最大的特点就是简单了。它就是个文本格式的二维数据表格。在非GIS行业中,csv非常受欢迎。作为属性表可能合适,但是它并不具备几何等复杂空间信息的存储能力,而且它没有一个标准。
kml是谷歌在谷歌地球中推荐的格式,基于XML,单文件。它有个特点就是,数据和样式同存在于一个kml文件中。缺点也有,仅支持wgs84坐标。由于它基于XML,所以数据量一大就不好用了。数据和样式存在耦合,这也是个缺点。
当然,除了以上开源格式外,还可以使用更复杂的DBMS或者ArcGIS家使用的面向对象的地理数据库。
笔者的建议是,还是具体问题具体分析。如果你要做真正的GIS项目,通用、标准化、性能高才是不二之选;所以,像kml等非主流但是又有其价值的数据,除了在它本身的平台用外,最好转换到更通用的格式上,例如,就GeoPackage——不然还是老实点用shp文件吧~
项目大的,有高并发、安全要求的,不妨试试PostgreSQL的PostGIS拓展。或者用MySQL、其他商业数据库,那些就不在本文的讨论范围了。
参考资料
[1]. OGC的GeoPackage官网:https://www.geopackage.org/
[2]. OGC的GeoPackage起步文档:http://www.geopackage.org/guidance/getting-started.html
[3]. OGC的GeoPackage标准(类似于白皮书)http://www.geopackage.org/spec120
[4]. 实现了GeoPackage的有关软件:https://www.geopackage.org/implementations.html
[5]. GeoPackage vs Shapefiles:https://www.gis-blog.com/geopackage-vs-shapefile/
[6]. Shp文件必须死!(这个网站有点偏激):http://switchfromshapefile.org/
GeoPackage - 一个简便轻量的本地地理数据库的更多相关文章
- 自己使用的一个.NET轻量开发结构
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABFCAIAAAAerjlvAAAE2UlEQVR4nO2a3U/bVhiH+bdyPaqpmx
- 开源一个简易轻量的reactor网络框架
github https://github.com/sea-boat/net-reactor net-reactor it's a simple and easy net framework with ...
- 一种简单,轻量,灵活的C#对象转Json对象的方案
简单,是因为只有一个类 轻量,是因为整个类代码只有300行 灵活,是因为扩展方式只需要继承重写某个方法即可 补充:修正无法处理可空值类型的bug 首先我将这个类称之为JsonBuilder,我希望它以 ...
- 轻量对象存储服务——minio
minio Minio是一个非常轻量的对象存储服务. Github: minio 它本身不支持文件的版本管理.如果有这个需求,可以用 s3git 搭配使用. Github: s3git 安装 mini ...
- 比Wireshark更轻量、更方便的抓包软件:Charles
转:http://blog.csdn.net/lixing333/article/details/42776187 之前写过一篇通过Wireshark进行抓包,分析网络连接的文章<通过WireS ...
- faked 一个用于 mock 后端 API 的轻量工具
一.简介 faked 是一个在前端开发中用于 mock 服务端接口的模块,轻量简单,无需要在本地启动 Server 也无需其它更多的资源,仅在浏览器中完成「请求拉截」,配合完整的「路由系统」轻而易举的 ...
- ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- Cardinal:一个用于移动项目开发的轻量 CSS 框架
Cardinal 是一个适用于移动项目的 CSS 框架,包含很多有用的默认样式.矢量字体.可重用的模块以及一个简单的响应式模块系统.Cardinal 提供了一种在多种移动设备上实现可伸缩的字体和布局的 ...
随机推荐
- 一个Demo让你掌握Android所有控件
原文:一个Demo让你掌握Android所有控件 本文是转载收藏,侵删,出处:"安卓巴士" 下面给出实现各个组件的源代码: 1.下拉框实现--Spinner packag ...
- Windows RabbitMQ 安装
操作系统 Win10 企业版 目标: 在win10上安装RabbitMQ 安装步骤 1.安装RabbitMQ需要先安装Erlang语言开发包,下载地址:http://www.erlang.org/d ...
- Delphi的Anymouse方法探秘
匿名函数是用Interface来实现的,具体细节可以看http://www.raysoftware.cn/?p=38匿名函数还是非常方便的.比如自己封装的异步调用.Async(procedure(AP ...
- MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)
当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...
- 各种 MacBook 和 5K iMac 屏幕分辨率对比
苹果全新 12寸超薄 MacBook 比曾经最薄的 MacBook Air 更薄,不过却配备了Retina 显示屏.12寸 Retina MacBook 上的显示屏分辨率为2304*1440,虽然不如 ...
- window8 飘带与页面切换效果
演示效果如下 用鼠标点击滑动试试就能看到效果了 ^_^ iscroll 不仅可以做到自然滚动条的效果,看官方文档还可以用来做页面切换的效果,很好很强大. 所以我结合流行的飘带元素做了个简单的例子.. ...
- C++开源库,欢迎补充
C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又突然发力,搞出C#语 ...
- 深入浅出RPC——深入篇(转载)
本文转载自这里是原文 <深入篇>我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它? RPC 功能目标 RPC的主要功 ...
- php一个不错的分页
1.分页源码 <?php class PageView{ /**页码**/ public $pageNo = 1; /**页大小**/ public $pageSize = 20; /**共多少 ...
- java关键字-interface
1:是用关键字interface定义的. 2:接口中包含的成员,最常见的有全局常量.抽象方法. 注意:接口中的成员都有固定的修饰符. 成员变量:public static final 成员方法:pub ...