>>> 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. 开源地理空间数据库

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

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)。

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.2. 什么是SpatiaLite

SQLite 介绍

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

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

  1. SQLite不执行列值的类型检查。

  2. 您可以在每列中放置任何您想要的数据限制;不进行检查以确保符合在CREATE TABLE中声明的列类型。

  3. 这会让人感到疑惑;但它不是一个大问题,它是一个SQLite的显式“设计功能”。

如果你需要对一些列执行一个有效的类型值检查, SQLite可以帮你做这样的事情:

  1. CHECK子句允许您定义基于列的约束,从而实现类型的一致性。

  2. 在插入或更新列值之前,SQLite强制执行CHECKing。

  3. 适当时SQLite也可以执行隐式类型转换。

SpatiaLite

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

8.1.3. 安装

安装SpaitaLite/libspatialite

libspatialite 是SpatiaLite的核心,必须得最先安装。 在网址为: http://www.gaia-gis.it/gaia-sins/ 的页面, 包含了 Caia-SINS 的项目集合,源代码,以及Linux、Windows下面的二进制包。

Windows用户可根据需求,直接下载并执行; Mac OS系统中,一般已经是完整的环境,不需要单独安装配置; Linux用户可以下载二进制包,或者编译安装。 对于Debian 10、 12 用户,可通过下面的命令进行安装:

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

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

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

安装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