2. 简介

2.1. 什么是空间数据库?

PostGIS 是一个空间数据库。Oracle Spatial 和 SQL Server(2008 及更高版本)也是空间数据库。但这是什么意思?是什么让一个普通的数据库成为一个空间数据库呢?

简而言之,就是…

空间数据库存储和操作空间对象,就像数据库中的任何其他对象一样。

以下简要介绍了空间数据库的演变,然后回顾了将空间数据与数据库关联的三个方面——数据类型、索引和函数。

  1. 空间数据类型指的是点、线和多边形等形状;

  2. 多维空间索引用于高效处理空间操作;

  3. 空间函数,以 SQL 的形式提出,用于查询空间属性和关系。

空间数据类型、索引和函数相结合,为优化性能和分析提供了灵活的结构。

2.1.1. 最初

在传统的**第一代地理信息系统 (GIS)** 实现中,所有空间数据都存储在平面文件中,需要专门的**GIS** 软件来解释和操作数据。这些第一代管理系统旨在满足用户的所有所需数据都在用户组织域内的需求。它们是专有的、自包含的系统,专门用于处理空间数据。

第二代空间系统将一些数据存储在关系数据库中(通常是“属性”或非空间部分),但仍然缺乏直接集成的灵活性。

当人们开始将空间要素视为一等数据库对象时,真正的空间数据库诞生了。

空间数据库将空间数据与关系数据库完全集成。系统方向从以 GIS 为中心转变为以数据库为中心。

_images/beginning.png

注意

空间数据库管理系统可用于除地理世界以外的应用。空间数据库用于管理与人体解剖结构、大规模集成电路、分子结构和电磁场等相关的数据。

2.1.2. 空间数据类型

普通数据库有字符串、数字和日期。空间数据库添加了额外的(空间)类型来表示**地理要素**。这些空间数据类型抽象并封装了边界和维度等空间结构。在许多方面,空间数据类型可以简单地理解为形状。

_images/hierarchy.png

空间数据类型按类型层次结构组织。每个子类型继承其超类型的结构(属性)和行为(方法或函数)。

2.1.3. 空间索引和边界框

普通数据库提供**索引**以允许快速随机访问数据子集。标准类型(数字、字符串、日期)的索引通常使用B 树 索引。

B 树使用自然排序顺序对数据进行分区,并将数据放入分层树中。数字、字符串和日期的自然排序顺序很容易确定 - 每个值都小于、大于或等于其他每个值。

但由于多边形可以重叠,可以包含在彼此中,并且排列在二维(或更多)空间中,因此 B 树不能用于有效地索引它们。真正的空间数据库提供“空间索引”,它可以回答“哪些对象在这个特定的边界框内?”的问题。

**边界框**是能够包含给定要素的最小矩形 - 平行于坐标轴。

_images/boundingbox.png

使用边界框是因为回答“A 是否在 B 内部?”对于多边形来说计算量非常大,但对于矩形来说非常快。即使是最复杂的多边形和线串也可以用一个简单的边界框来表示。

索引必须快速执行才能发挥作用。因此,空间索引不像 B 树那样提供精确结果,而是提供近似结果。问题“哪些线在该多边形内?”将被空间索引解释为“哪些线的边界框包含在该多边形的边界框内?”

各种数据库实现的实际空间索引差异很大。最常见的实现是 R 树四叉树(在 PostGIS 中使用),但还有 基于网格的索引GeoHash 索引 在其他空间数据库中实现。

2.1.4. 空间函数

为了在查询期间操作数据,普通数据库提供诸如连接字符串、对字符串执行哈希运算、对数字进行数学运算以及从日期中提取信息等 **函数**。

空间数据库提供了一套完整的函数,用于分析几何组件、确定空间关系以及操作几何。这些空间函数是任何空间项目的构建块。

大多数空间函数可以归入以下五类之一

  1. 转换:将几何与外部数据格式转换的函数。

  2. 管理管理有关空间表和 PostGIS 管理的信息的函数。

  3. 检索检索几何的属性和度量的函数。

  4. 比较比较两个几何体与其空间关系的函数。

  5. 生成:从其他几何体生成新几何体的函数。

可能的函数列表非常大,但 OGC SFSQL 定义了一组常见的函数,并由 PostGIS 实现(以及其他有用的函数)。

2.2. 什么是 PostGIS?

PostGIS 通过添加对三种功能的支持,将 PostgreSQL 数据库管理系统变成了一个空间数据库:空间类型、空间索引和空间函数。由于它建立在 PostgreSQL 之上,PostGIS 自动继承了重要的“企业”功能以及开放标准的实现。

2.2.1. 但什么是 PostgreSQL?

PostgreSQL 是一个强大的关系数据库管理系统 (RDBMS)。它是在 BSD 风格的许可下发布的,因此是免费的开源软件。与许多其他开源程序一样,PostgreSQL 不受任何一家公司的控制,但有一个 全球开发人员和公司社区 来开发它。

PostgreSQL 从一开始就设计了类型扩展功能,即在运行时添加新的数据类型、函数和索引的能力。因此,PostGIS 扩展可以由独立的开发团队开发,但仍然可以与核心 PostgreSQL 数据库紧密集成。

2.2.1.1. 为什么选择 PostgreSQL?

熟悉开源数据库的人经常会问:“为什么 PostGIS 不是建立在 MySQL 之上的?”

PostgreSQL 具有以下优势:

  • 默认情况下具有可靠性和事务完整性(ACID)

  • 对 SQL 标准(完整 SQL92)的谨慎支持

  • 可插拔的类型扩展和函数扩展

  • 以社区为导向的开发模式

  • 对列大小没有限制(“TOAST”able 元组)以支持大型 GIS 对象

  • 通用索引结构 (GiST) 以允许 R-Tree 索引

  • 易于添加自定义函数

综合起来,PostgreSQL 为添加新的空间类型提供了一个非常简单的开发路径。在专有领域,只有 Illustra(现在是 Informix Universal Server)允许如此轻松的扩展。这并非巧合;Illustra 是对 1980 年代原始 PostgreSQL 代码库的专有重新设计。

由于在 PostgreSQL 中添加类型的开发路径非常简单,因此从那里开始是有意义的。当 MySQL 在 4.1 版本中发布基本空间类型时,PostGIS 团队查看了他们的代码,并且该练习强化了最初使用 PostgreSQL 的决定。

由于 MySQL 空间对象必须作为特殊情况在字符串类型之上进行黑客攻击,因此 MySQL 代码分布在整个代码库中。PostGIS 0.1 的开发不到一个月。开发一个“MyGIS”0.1 会花费更长的时间,因此可能永远不会问世。

2.2.2. 为什么不使用文件?

自 GIS 软件首次编写以来,Shapefile(以及其他格式,如 Esri File Geodatabase 和 GeoPackage)一直是存储和交互空间数据的标准方式。但是,这些“平面”文件具有以下缺点:

  • 文件需要特殊软件才能读取和写入。 SQL 是对随机数据访问和分析的抽象。没有这种抽象,您将需要自己编写所有访问和分析代码。

  • 并发用户会导致数据损坏和速度变慢。 虽然可以编写额外的代码来确保对同一文件的多次写入不会损坏数据,但当您解决了问题并解决了相关的性能问题时,您已经编写了大部分数据库系统。为什么不直接使用标准数据库呢?

  • 复杂的问题需要复杂的软件来回答。 在数据库中可以用一行 SQL 表达的复杂而有趣的问题(空间连接、聚合等)在针对文件编程时需要数百行专门代码才能回答。

大多数 PostGIS 用户正在设置多个应用程序将访问数据的系统,因此使用标准 SQL 访问方法可以简化部署和开发。一些用户正在处理大型数据集;对于文件,它们可能被分割成多个文件,但在数据库中,它们可以存储为一个大型表。

总之,对多个用户、复杂临时查询和大型数据集性能的支持的结合,是空间数据库区别于基于文件系统的关键。

2.2.3. PostGIS 简史

2001 年 5 月,Refractions Research 发布了第一个版本的 PostGIS。PostGIS 0.1 包含对象、索引和少量函数。结果是一个适合存储和检索的数据库,但不适合分析。

随着函数数量的增加,对组织原则的需求变得越来越明显。开放地理空间联盟的“SQL 简单要素”(SFSQL)规范通过函数命名和要求指南提供了这种结构。

随着 PostGIS 对简单分析和空间连接的支持,Mapserver 成为第一个提供数据库中数据可视化的外部应用程序。

在接下来的几年里,PostGIS 函数的数量不断增加,但其功能仍然有限。许多最有趣的函数(例如,ST_Intersects()、ST_Buffer()、ST_Union())非常难以编码。从头开始编写它们需要多年的工作。

幸运的是,第二个项目,“几何引擎,开源”或GEOS出现了。GEOS 库提供了实现SFSQL规范所需的算法。通过链接 GEOS,PostGIS 在 0.8 版本中提供了对SFSQL的完全支持。

随着 PostGIS 数据容量的增长,另一个问题浮出水面:用于存储几何的表示方式被证明效率相对低下。对于像点和短线这样的较小对象,表示中的元数据高达 300% 的开销。出于性能原因,有必要对表示进行瘦身。通过缩减元数据头和所需维度,开销大大降低。在 PostGIS 1.0 中,这种新的、更快的、轻量级的表示方式成为默认设置。

PostGIS 的最新版本继续添加功能和性能改进,以及对 PostgreSQL 核心系统中新功能的支持。

2.2.4. 谁使用 PostGIS?

有关案例研究的完整列表,请参阅PostGIS 案例研究页面。

2.2.4.1. 法国国家地理研究所

IGN 是法国的国家测绘机构,使用 PostGIS 存储该国的高分辨率地形图“BDUni”。BDUni 拥有超过 1 亿个要素,由 100 多名现场工作人员维护,他们每天验证观测结果并将新的测绘添加到数据库中。IGN 安装使用数据库事务系统来确保更新过程的一致性,以及热备系统来维护系统故障时的正常运行时间。

2.2.4.2. RedFin

RedFin 是一家房地产公司,提供基于网络的服务来探索房产并估算价值。他们的系统最初构建在 MySQL 上,但他们发现迁移到 PostgreSQL 和 PostGIS 在性能和可靠性方面带来了巨大的优势

2.2.5. 哪些应用程序支持 PostGIS?

PostGIS 已成为广泛使用的空间数据库,支持使用它存储和检索数据的第三方程序数量也在不断增加。 支持 PostGIS 的程序 包括服务器和桌面系统上的开源和专有软件。

下表列出了一些利用 PostGIS 的软件

开放/免费

封闭/专有/付费服务

  • 加载/提取

    • Shp2Pgsql

    • ogr2ogr

    • Dxf2PostGIS

    • GeoKettle

  • 基于 Web 的

    • Mapserver

    • GeoServer /geoNode

    • pg_tileserv

    • pg_featureserv

    • Deegree

    • Carto

    • QGIS Server

    • MapGuide 开源(使用 FDO)

  • 桌面

    • QGIS

    • OpenJUMP

    • GRASS

    • pgAdmin

    • DBeaver

    • GvSIG

    • SAGA

    • uDig

  • 加载/提取

    • Safe FME 桌面翻译器/转换器

    • Dbt

  • 基于 Web 的

    • Cadcorp GeognoSIS

    • ESRI ArcGIS Server / Online

  • 服务/DbaaS

    • Aiven for PostgreSQL

    • Amazon RDS / Aurora for PostgreSQL

    • Carto

    • Crunchy Bridge

    • Microsoft Azure for PostgreSQL

    • Google Cloud SQL for PostgreSQL

  • 桌面

    • Cadcorp SIS

    • ESRI 桌面/专业版

    • GeoConcept

    • Global Mapper

    • Manifold

    • MapInfo

    • Microimages TNTmips GIS