>>> from env_helper import info; info()
页面更新时间: 2023-04-15 20:01:24
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-7-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

8.1. 开源数据库简介

OSDBs在许多时候都受到了广泛的关注, 其中MySQL,PostgreSQL,Ingres,Firebird以及MaxDB最为流行; 如果你想在空间数据开发中使用开源数据库的话, 目前有三种选择:MySQL、PostGIS与SpatiaLite。 每一种都有其优点及缺点,没有哪种选择是适合所有情况的, 而且每种数据库,可能会有其特有的扩展方法。 MySQL,由于其双重许可(dual licensed),应用最为广泛。 MySQL在20多种平台下都可以使用,包括Linux,Mac OS X,UNIX 以及Microsoft Windows。 它的架构以Windows中的线程(threads)或者UNIX下的进程(process)为基础, 使其快速和易于自定义。 它具有商用企业级数据库的所有主要特征, 包括充分的数据安全集成、原子性、连贯性、可分离性、 与ACID-compliance的持久性、全兼容性(full commit)、 重新运行、故障修复以及行锁定能力。 V4.1以后的版本实现了一个基于几何类型环境下的基于特征的查询语言子集, 由OGC(Open Geospatial Consortium)提出。 几何属性查询的实现支持了简单的特征数据(simple feature data, SFD)模型。

PostgreSQL是一个升级性高、SQL-compliant、开源关系数据库系统。 它可以在所有的主要操作系统上运行,包括Linux、UNIX以及Windows。 它的架构以其稳定性、数据整合以及准确性而著称。 同MySQL一样,它同样是全ACID-compliant,并且支持各种外键(foreign keys),连接(joins),视图(views),触发程序(triggers),存储过程(stored procedures),存储二进制大对象,编程界面如C/C++,Java,.Net,Perl,Python,Ruby,Tcl以及ODBC。 PostgreSQL 还有着许多成熟先进的特征, 包括多版本并行控制(multi-version concurrence control, MVCC), 时间点恢复(point in time recovery),表空间(tablespaces), 异步复制(asynchronous replication), 嵌套事务(nested transactions), 在线/热备份(online/hot backups), 成熟的查询优化程序(query planner/optimizer), 以及容错的预写式日志(write ahead logging for fault tolerance)。 它允许几何数据类型(例如,点,线,lseg,box,路径,多边形以及圆)来代表内部的二维空间对象。 然而,由于其非标准的特征,内在的空间对象一直以来都没有较多的应用。 PostGIS,作为PostgreSQL的空间扩展,与OGC以及ISO SQL/MM标准相一致,使得使用PostgreSQL进行现代的空间应用开发成为可能。

8.1.1. 空间数据库的标准

空间数据库有三种类型的标准, 分别为ISO SQL/MM,ISO/TC 211定义的标准以及OGC SFSQL规范。 这些标准根据不同理解和目的而设定, 其命名和术语方面均有所不同。

ISO/TC211地理信息/地理信息标准规定各组分应该被汇编为一个应用架构以定义一个数据产品。 另外两个标准则定义SQL环境下使用的通用类型。 OGC对于Common Object Request Broker Architecture(CORBA)和Common Object Model(COM)环境具有互补的性能。 ISO/TC211标准有着更为广泛的范围,包括3D支持和复合,而OGC SFSQL和ISO SQL/MM定位编码(address)简单的2D元素。 OGC SFSQL和ISO SQL/MM具有管理点集、曲线集、面集以及混合元素集的类型。 这一功能在ISO/TC211标准下不能实现,虽然它能够构建复杂参考体(compose complexes by reference)。

8.1.2. OGC地理信息实验规范介绍

本章以SpatiaLite来进行介绍空间数据库的应用介绍。 SpatiaLite很多方面都是依照PostGIS, 比如其支持OGC的数据处理的一些SQL函数。

OGC的地理信息实施规范

OGC下的SFSQL的目的在于定义一个SQL模式以通过一个SQL调用级接口来支持数据集的存储、检索、查询和更新。 地理特征是与地球上某地点相关的真实世界现象的一个抽象(OGC,2006a),具有空间和非空间属性。 空间属性为几何值,而非空间属性为SQL数据类型值。

OGC几何类型层次

OGC SQL几何类型的组织结构为一个层次类型,如图6.1所示。 根类型,命名为几何,其类型包括点,线,面以及几何集。 几何集为一个多种几何对象的集合。 多点(MultiPoint)、多线(MultiCurve)以及多面(MultiSurface)是几何集管理多种点集、线集和面集的一个专用的亚类型。

在OGC SFSQL版本1.2.0中, SQL功能被定义为已知类型文本描述或者二进制描述的条件下构建上述类型的实例, SQL/MM几何方法被用作定义意思类型的SQL功能的参考。

几何方法

大多数的几何方法都可以被分组到以下四个分类当中(Stolze 2003):

1 几何构型和外在数据格式的转化

三种外在数据格式可以用于表示几何构型,包括WKT、WKB以及 Geography Markup Language(GML)。 例如,对于一个给定的WKT表征, ST_WKTToSQL 返回一个 ST_Geometry 值,而 ST_AsText 用于 ST_Geometry 值向 WKT 的转化。

2从几何构型中检索特征或度量(measures)。 例如:

  • ST_Dimension :翻译一个ST_Geometry值的维数。

  • ST_GeometryType :返回一个ST_Geometry值的类型。

  • ST_SRID :评述或更换空间参考系统运算符。

  • ST_IsMeasured :检测ST_Geometry值是否被测量。

3比较两个几何构型的空间关系。 例如:

  • ST_Equals :测试两个几何构型的空间相等性(spatial equality)。

  • ST_Disjoint :测试两个几何构型是否相交。

  • ST_IntersectsST_CrossesST_Overlaps :测试几何构型的内部是否相交。

  • ST_Touches :测试两个几何构型在边界处相接,但内部却不相交。方法返回一个整形值,如果空间关系存在则返回1,不存在则返回0.

4 从其他中产生新的几何构型。 例如:

  • ST_Buffer :产生给定几何构型周围一定距离的缓冲区。

  • ST_ConvexHull :计算几何构型的凸边界。

  • ST_DifferenceST Intersection 以及 ST Union :重构两个几何构型所定义的点集之间的差别、交叉和合并。

除非另有声明,以上提到的方法和函数都在同一个2D坐标维数空间下操作。

8.1.3. 什么是SpatiaLite

SQLite是遵循ACID的轻量型数据库管理系统,其核心是由相对较小的C代码实现的,具有简单、稳定、易于使用和真正的轻量等特点。 每个SQLite数据库都是一个简单文件,用户可以方便地复制、压缩,并通过网络进行传输和交换。 SQLite程序本身是跨平台的,其数据库文件也是跨平台的,所以在Windpws、Linux、Mac OS等整台中得到了广泛的应用。 由于SQLite的强大功能与嵌入式设计,被集成到许多系统与平台中, 在Python 2.5及以上版本中,就默认为SQLite模块。

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

SpatiaLite是SQLite数据的空间数据引擎。 为了使用SQLite能够处理空间数据,需要在SQLite中加载空间扩展。

SpatiaLite 发音为 spatial light, 其支持OpenGis Consortium (OGC)规范规范的空间数据处理函数。

8.1.4. SpatiaLite的一些主要功能

SpatiaLite对SQLite的扩展,使其能够兼容OGC的空间数据规范。

  • 支持WKT和WKB格式

  • 支持SQL空间函数AsText()GeomFromText()Area()PointN()

  • 对OpenGIS空间函数集的完全支持需要借助于GEOS, 支持高级复杂空间分析函数如:Overlaps(), Touches(), Union(), Buffer()

  • 遵循OpenGIS规范完全支持空间元数据格式

  • 支持对Shape文件的导入与导出

  • 采用PROJ.4和EPSG支持坐标系的投影变换

  • 采用GNU libiconv支持各语言字符编码

  • 基于SQLite的RTree扩展真正地实现了空间索引

  • VirtualShape扩展使得SQLite访问Shape文件就像操作VIRTUAL TABLE一样

  • 用户可以对外部Shape文件进行标准SQL查询操作,且无需导入或者转换Shape文件

  • VirtualText扩展使得SQLite访问CSV/TxtTab文件就像操作VIRTUAL TABLE一样

  • 用于可以对外部CSV/TxtTab文件进行标准SQL查询操作,而无需导入或者转换CSV/TxtTab文件

  • GUI工具用户界面友好,支持上述所有功能

SpatiaLite的精彩部分包括:

  • 可以处理大多数的图形数据,包括:点、线、多边形、点集合、线集合、多边形集合和几何对象集。

  • 每个几何要素都有一个空间参照标志符(spatial reference identifier,SRID),来标识其空间参照。

  • 几何对象列包括特定的几何类型和特定的SRID。可以阻止在数据库表中保存错误的几何对象或错误的空间参照。

  • 支持几何对象在WKT和WKB格式之间进行转换。

  • 支持几何功能,如面积量算,多边形和线简化,几何对象的距离量算,几何对象集合计算(九交模型),以及缓冲区生成等。

  • 支持几何对象在不同空间参照系间转换,以及平移、缩放或旋转几何对象。

  • 支持用最小外包矩形来快速计算空间关系

  • 支持用几何对象自身的空间关系运算(九交模型,如相等,接触和交叉等等),而不是用最小矩形来计算。

  • 正确运用R-树索引可以大大提高空间查询的速度。

  • 实施空间索引的另外一种方法是利用MBR内存缓冲。这是用最小边界矩形来索引要素的极快方法,但是受限于可用的RAM,所以不适于大型数据集。

虽然SpatiaLite是一种轻量型数据库,且功能惊人。对于具体的应用而言,SpatiaLite可能是基于Python语言的空间地理项目最好的选择。

8.1.5. 安装

安装SpaitaLite/libspatialite

libspatialite 是SpatiaLite的核心,必须得最先安装。 在网址为: http://www.gaia-gis.it/gaia-sins/的 页面, 包含了 Caia-SINS 的项目集合,源代码,以及Linux、Windows下面的二进制包。 Windows用户可根据需求,直接下载并执行; Mac OS系统中,一般已经是完整的环境,不需要单独安装配置; Linux用户可以下载二进制包,或者编译安装。 对于Debian Jessis用户,可通过下面的命令进行安装:

apt-get install libspatialite7 libsqlite3-mod-spatialite
apt-get install python-pyspatialite
apt-get install spatialite-bin

libspatialite5 就是SpatiaLite的核心库了, python-pyspatialite 通过pysqlite完成Python与SpatiaLite的通信, spatialite-bin 是命令行工具。 其实还有一个 spatialite-gui , 想来应该是窗口软件了,不过我没有用过,有兴趣的读者可以自行试用。

在Python 3中,已经集成了SQLite的功能,所以不需要再安装SQLite,SpatiaLite是SQLite的扩展,是在Python运行时动态加载的,只需要安装类库就行。

在Debian Jessie中,安装:

apt install libspatialite5

在Debian 9中,安装如下:

apt install libspatialite7 libsqlite3-mod-spatialite

安装pysqlite

Python使用 pysqlite 模块来与SQLite通信。 在 Python 2.5以上版本中,在标准库模块 sqlite3 包含已绑定的 pysqlite , 但是,此模块可能与SpatiaLite不匹配。 Mac用户的 sqlite3 框架已包含pysqlite,所以可以忽略这部分。 如果想验证Python是否包含有可用的sqlite3,的在Python命令行输入如下代码:

>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> conn.enable_load_extension(True)

如果有错误出现,那么内建的sqlite3不支持扩展,则必须下载并安装其它版本。 且较现代的通用操作系统一般不存在这个问题。

Python连接SpatiaLite数据库

所有的类库已安装完毕,可以通过Python来连接SpatiaLite数据库。 但是作为安装的最后一步,或者说是开始使用的第一步。 因为pysqlite是SQLite的数据库适配器, 还需要加载 libspatialite 扩展,才能在Python程序中使用SpatiaLite的功能。

>>> import sqlite3
>>> conn = sqlite3.connect(":memory:")
>>> conn.enable_load_extension(True)
>>> conn.execute('SELECT load_extension("mod_spatialite.so.7")')
<sqlite3.Cursor at 0x7f20ac1b60c0>

对于Linux用户来说,要保证libspatialite扩展的命名正确。也许还要改变导入的 libspatialite 模块的文件名,这取决于其版本。 对于Debian Jessie,文件名是 libspatialite.so.5 ;对于Debian Stretch中,则是 mod_spatialite.so.7