OSDBs的空间扩展

空间数据的特征,例如地点;非结构性(变量长度,例如几何字段)、空间关系、分类和编码,在DBMS中加入相应的函数可以加强对它们的管理。 历史上,空间数据管理的解决方案曾被定义为文件和RDBMS的混合体,由SDE驱动的一个完整的RDBMS、 RDBMS/对象相关的数据库管理系统的一个空间扩展(ORDBMS)、以及其他不同版本。 随着时间的推移,SDE驱动下的RDBMS以及RDBMS/ORDBMS的空间扩展成为较为匠气的技术实现。

空间数据库引擎(SDE)

SDE的RDBMS是一个中间件解决方案(mid-ware solution),在过去的几十年中它由GIS向量推进。 在这一方法下,空间数据通过SDE输入到数据库,就像通过一个通道来种植种子一样。 引擎通过用户的指令从数据库中选择数据并把数据转化为用户需求的形式。 因此,空间数据的操作和执行并不在数据库的内核下进行。 关系数据库是知识空间数据的一个容器,而引擎只是数据的一个通道。 代表这一类型的产品如ESRI公司的ArcSED以及SpatialWare of MapINFO。 他们支持一般的RDBMSs,并且能够在多种数据库平台下交叉使用。 空间数据以二进制大数据块的形式被存储和检索,可以在不同的数据块类型下兼容并且与给定的GIS平台紧密相联系。

这一中间件解决方案具有使用标准的现有组分以及重新使用类属数据管理代码的额外优势(Breunig et al. 2003)。 这就有了一个明确的职责分离,特定的空间开发可以在DBMS开发下单独实现。 然后,这一方法由于其通道映射以及多数据库平台交叉机制,使得该方法效率可能较低。 此外,由于数据模型相对而言更为复杂,SQL扩展以及数据共享和互操作变的较难实现。 用于特定空间数据管理扩展的力度越大,改变这一系统以及利用DBMS改善优势就越困难。

具有空间性的DBMS

对象-关系的DBMSs(ORDBMS)的空间数据管理通过数据库向量来实现。 ORDBMS支持抽象数据类型的定义,他们的操作以及非第一范式(non-firstnormal form,N1NF) 以组织费结构的数据,包括空间数据(需要注意的是,具有近期SQL特性的RDBMS同样能够这么做,但是效果不是很好)。 空间数据以对象的形式被存储和选择。 用户可以使用标准扩展的SQL来编写空间数据的类型和功能,从而使新的类型和功能能够更为紧密的整合到DBMS下,同时,空间数据与其他数据完全整合。 传统的DBMS功能,如索引、可视化查询以及事务管理等对于用户定义的数据累计 和功能以一种无缝的方式实现(Breunig et al. 2003)。

数据库通过用户的命令直接工作而不是通过一个SDE代理,如上所述,使其更容易执行空间操作并且表现良好。 它的缺点在于其体系结构必须局限于特定的数据库平台。 这一方法的实例比如:PostgreSQL/PostGIS、MySQL空间扩展、Ingres空间对象库、Oracle Spatial,IBM DB2 Spatial Extender以及Informix Spatial DataBlade。

空间数据库的标准

空间数据库有三种类型的标准, 分别为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)。

OGC地理信息实验规范介绍

本章以SpatiaLite来进行介绍空间数据库的应用介绍。 SpatiaLite很多方面都是依照PostGIS, 比如其支持OGC的数据处理的一些SQL函数。 因此,下面对OGC标准进行一些说明 [1]。

OGC的地理信息实施规范

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

OGC几何类型层次

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

[Warning: Image ignored]

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

使用预先定义的数据类型的SQL实现

在这一实现中,几何值通过使用一个“几何ID”参考来形成一个几何表的方式实现。 几何值的存储使用几何表中的一个或者多个的行来实现,所有的行都有一个几何ID来作为它们标示性的组成部分。 几何表可以通过使用标准的SQL数字类型或者SQL二进制类型来实现。

这一标准定义了一个管理数据表、几何以及空间参考系统信息的模式,通过一个以预先定义的数据类型为基础的SQL-执行(implementation)来实现。 对照表的定义如下:

[Warning: Image ignored]

  • GEOMETRY_COLUMNS表,描述了可用数据表及其几何特性。
  • SPATIAL_REF_SYS表,描述了坐标系统以及几何转化。
  • FEATRUE TABLE存储了特征集。特别表的列表示特征属性,而行代表单个的特征。特征的几何性是其特征属性其中之一。而逻辑上地几何数据类型,一个几何列通过作为一个几何表的外部键来实现。
  • GEOMETRY TABLE存储几何对象,可以通过标准SQL数字类型或者SQL二进制类型来实现。

SQL的实现依赖于GEOMETRY_COLUMNS表的特定存储类型,一个几何对象通过一个坐标值矩阵或者作为一个单一的二进制值来进行存储。 在第一种情况下,预定义的SQL数值类型被用于定义坐标并且这些数字值从几何表中获取,直到几何对象被完全重构。 在第二种情况下,完整的几何对象从WKB(Well-known Binary)表中获取,并作为一个单一的值存在。

使用几何类型的SQL实现

这一过程包含了一个SQL实现,它是一个“几何类型”集的扩展。 在这一环境下,一个几何值列(geometry-valued column)作为一个列(column)来实现, 其SQL类型由适合类型集中获得。 扩展SQL实现类型系统的机制通过用户定义的类型(User Defined Types, UDT)来决定。

这一标准定义了一个通过一个具有几何类型扩展的SQL-实现(SQL-implemention)来管理特征表、 几何以及空间参考系统信息的模式(图6.3)。

对照表如下:

[Warning: Image ignored]

  1. GEOMETRY_COLUMNS表,描述了可用特征表以及他们的几何特性。
  2. SPATIAL_REF_SYS表,描述了坐标系统以及几何转换。
  3. FEATURE TABLE存储特征集。 特征表的列代表特征属性,行代表个体特征。 特征的几何性是特征属性的一部分,并且是一个SQL几何类型。

ISO SQL/NN Part3:空间(Spatial)

“ISO SQL/NN Part3:空间(Spatial)”是一个国际标准, 它定义了如何使用SQL进行存储、检索和处理空间数据。 这一标准描述了每一种类型的几何类型及方法, 并且在一个定义模式(Definition Schema)下定义了一个信息模式(Information Schema)。 它还解释了基础的空间概念,观点以及方向,这些都用来处理和表述实现标准的产品的编码和一致性规则。

SQL/MM 几何模型

OGC几何类型适用于相应的SQL类型层次,后者由SQL/MM标准定义。 图6.4为标准化的几何类型层次,其中包含了亚类型之间的关系。 所有的类型都用于表征2维空间下的几何特征(R2)。 任何几何类型都可以作为一个列(column)的类型而被使用。 声明一个列作为一个特殊的类型所暗含的含义为类型的任何值或者任何亚类型都可以存储到列中(ISO/IEC2005)。

[Warning: Image ignored]

SQL类型层次和OGC几何类型层次之间最主要的区别在于获取的Line和LinearRing类型的缺失 (使用ST_LineString类型值,覆盖两种情况),以及一系列增加的类型(例如支持圆弧)。

几何方法

大多数的几何方法都可以被分组到以下四个分类当中(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坐标维数空间下操作。

[1] 如果想进一步了解,可以在OGC的网站找OGC规范。

什么是SpatiaLite

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

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

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

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语言的空间地理项目最好的选择。

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

安装

安装SpaitaLite/libspatialite

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

apt-get install libspatialite5
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中,安装:

aptitude install libspatialite5

在Debian 9中,安装如下:

aptitude install libspatialite7 libsqlite3-mod-spatialite

安装pysqlite

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

In [1]:
import sqlite3
conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)

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

Python连接SpatiaLite数据库

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

In [3]:
import sqlite3
conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
conn.execute('SELECT load_extension("mod_spatialite.so.7")')
Out[3]:
<sqlite3.Cursor at 0x7f8df043b180>

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

开源数据库回顾

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进行现代的空间应用开发成为可能。

最后说一个SpatiaLite。