2. 介绍

2.1. 什么是空间数据库?

PostGIS 是一个空间数据库。Oracle Spatial 和 SQL Server(2008以及更新的版本)也有空间数据库。但是,具体是什么意思?如何让一个普通的数据库成为空间数据库?

简单的说,那就是:

空间数据库在数据库中,可以像操作普通数据一样操作空间数据对象。

下面将简要介绍空间数据库的发展,然后回顾将*空间*数据与数据库关联起来的三个方面——数据类型、索引和函数。

  1. **空间数据类型**是指形状,例如点、线、面;

  2. 多维**空间索引**用于提升空间数据处理的效率;

  3. 空间函数,是定义在:term: ' SQL '中,用于处理空间属性和关系。

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

2.1.1. 开始

在早期的第一代地理信息系统 :term:`GIS`实现中,所有的空间数据都存储在平面文件中,需要特殊的 :term:`GIS`软件来解释和操作这些数据。这些第一代的管理系统被设计用来满足用户的需求,其中所有需要的数据都在用户的组织领域内。它们是专门为处理空间数据而构建的专有、自包含的系统。

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

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

空间数据库完全集成空间数据到一个关系型数据库。系统定位变化从GIS中心到数据库中心。

_images/beginning.png

注解

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

2.1.2. 空间数据类型

普通数据库包含字符串、数字和日期。而空间数据库则添加了额外的(空间)类型,用于表示**地理要素**。这些空间数据类型对地理结构进行了抽象和封装,如边界和维度。在许多方面,空间数据类型可以简单地被理解为形状。

_images/hierarchy.png

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

2.1.3. 空间索引与边界范围框

一个普通的数据库提供**索引**,以便快速和随机地访问数据的子集。对于标准类型(数字,字符串,日期)的索引通常使用`B-tree <http://en.wikipedia.org/wiki/B-tree>`_ 索引进行。

B树通过使用自然排序顺序将数据划分到层次树中。数字、字符串和日期的自然排序顺序很容易确定——每个值都小于、大于或等于其他任何值。

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

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

_images/boundingbox.png

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

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

各种数据库实现的实际空间索引差异很大。最常见的实现是`R-Tree <http://en.wikipedia.org/wiki/R-tree>`_和`Quadtree <http://en.wikipedia.org/wiki/Quadtree>`_ (在PostGIS中使用),但在其他空间数据库中也实现了 `格网索引<http://en.wikipedia.org/wiki/Grid_(spatial_index)>`_ 和`GeoHash索引 <https://en.wikipedia.org/wiki/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不受任何一家公司的控制,而是拥有一个由开发人员和公司组成的 `全球开发社区<https://www.postgresql.org/community/contributors/>`_ 来开发它。

PostgreSQL从一开始就考虑了类型扩展 - 能够在运行时添加新的数据类型,函数和索引。正因为如此,PostGIS扩展可以由一个单独的开发团队开发,但仍然能非常紧密地集成到核心PostgreSQL数据库中。

2.2.1.1. 为什么选择 PostgreSQL?

熟悉开源数据库的人经常会问,“为什么不在 MySQL 上构建 PostGIS?”。

PostgreSQL 有:

  • 默认具备经过验证的可靠性和事务完整性(ACID)

  • 对 SQL 标准的精心支持(完整的 SQL92)

  • 插拔式扩展和功能扩展

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

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

  • 通用索引结构 (GiST) 允许 R 树索引

  • 易于添加自定义功能

综合而言,PostgreSQL 提供了一种非常简单的开发路径来添加新的空间类型。在专有领域,只有 `Illustra <https://en.wikipedia.org/wiki/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 <http://en.wikipedia.org/wiki/Shapefile>`_(以及 Esri File Geodatabase、`GeoPackage 等其他格式)一直是存储空间数据、访问空间数据的标准格式。但是,这些“单一”的文件格式有以下缺点:

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

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

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

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

总的来说,对多用户的支持、复杂的临时查询以及在大型数据集上的性能是使空间数据库与基于文件的系统有所区别的关键因素。

2.2.3. PostGIS 的简单历史

2001 年 5 月,Refractions Research 发布了 PostGIS 的第一版。PostGIS 0.1 拥有对象、索引和一些趁手的函数。那时,它只是适合存储数据和检索数据,并不适合分析数据。

随着函数数量的增加,对组织原则的需求变得明显。开放地理空间联盟(Open Geospatial Consortium)的"Simple Features for SQL"(简称 SFSQL)规范提供了这样的结构,其中包括函数命名和要求的指南。

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

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

幸运的是,第二个项目——"Geometry Engine, Open Source" 或 GEOS,也随之出现。GEOS库提供了实现 SFSQL 规范所需的算法。通过引入GEOS,PostGIS在版本0.8中为 SFSQL 提供了完整的支持。

随着PostGIS数据容量的增长,出现了另一个问题:用于存储几何信息的表示方式相对低效。对于小型对象,如点和短线,表示中的元数据可能会有高达300%的额外开销。出于性能原因,有必要对表示进行精简。通过缩小元数据头和所需的维度,额外开销大大减少。在PostGIS 1.0中,这种新的、更快速、轻量级的表示方式成为了默认选项。

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

2.2.4. 谁在用 PostGIS?

有关案例研究的完整列表,请参阅`PostGIS案例研究 <https://postgis.net/category/casestudy/>`_ 页面。

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的程序<http://trac.osgeo.org/postgis/wiki/UsersWikiToolsSupportPostgis>`_ 包括服务器和桌面系统上的开源软件和专有软件。

下表显示了一些支持PostGIS 的软件列表:

开源/自由

封闭式/专有/付费服务

  • 加载/解析

    • Shp2Pgsql

    • ogr2ogr

    • Dxf2PostGIS

    • GeoKettle

  • Web 端

    • Mapserver

    • GeoServer /geoNode

    • pg_tileserv

    • pg_featureserv

    • Deegree

    • Carto

    • QGIS Server

    • MapGuide Open Source (使用 FDO)

  • 桌面端

    • QGIS

    • OpenJUMP

    • GRASS

    • PgAdmin

    • DBeaver

    • GvSIG

    • SAGA

    • uDig

  • 加载/解析

    • Safe FME Desktop Translator/Converter

    • Dbt

  • Web 端

    • Cadcorp GeognoSIS

    • ESRI ArcGIS Server / Online

  • 服务 / 数据库即服务

    • Aiven for PostgreSQL

    • Amazon RDS / Aurora for PostgreSQL

    • Carto

    • Crunchy Bridge

    • Microsoft Azure for PostgreSQL

    • Google Cloud SQL for PostgreSQL

  • 桌面端

    • Cadcorp SIS

    • ESRI Desktop/Pro

    • GeoConcept

    • Global Mapper

    • Manifold

    • MapInfo

    • Microimages TNTmips GIS