图书前言

译  者  序

随着互联网经济的兴起,人们习惯于在生活的各个方面使用各类地图软件:驾车外出时要提前查询行程,跑步健身时要记录运动轨迹,等等。尤其是外卖员和顺风车主,他们需要使用地图软件规划线路以提高效率。对于开发者来说,如何选择和使用工具来高效地实现不同人群的需求,以及如何才能准确而快速地对海量数据进行分析,是值得关注的问题。

PostGIS是一个很好的选择,它是PostgreSQL开源关系数据库管理系统的空间数据库扩展,是目前最强大的开源空间数据库引擎。首先,PostGIS是开源的,任何人都可以在网上免费下载安装包,构建自己的开发环境,并针对自己遇到的问题搜索解决方案。其次,PostGIS本身是一个数据库扩展,在数据分析和处理速度方面有着先天的优势。再次,PostGIS功能足够强大,它甚至不再依赖GIS软件,只使用这个空间数据库就足够了。

《PostGIS实战(第3版)》是一本很好的、介绍PostGIS的书,作者Regina是PostGIS核心开发团队和项目指导委员会的成员,拥有丰富的实践经验。本书的主要特点是示例丰富,让读者在例子中不断尝试并探索,从而掌握相关的知识。此外,本书内容较为全面,读者可以根据自己的需要选择特定章节进行学习。

本书由三部分组成:

第Ⅰ部分介绍空间关系数据库的基本概念,特别是PostGIS与PostgreSQL。通过这部分的学习,你可以了解几何、地理、栅格和拓扑等类型的基本概念,掌握每种类型可以解决的问题,并对空间参考系统和数据库存储选项有一个基本的理解。最重要的是,学完本部分的内容后,你将掌握如何加载、查询和查看启用PostGIS的PostgreSQL数据库中的空间数据。

第Ⅱ部分的重点是使用PostGIS解决实际的空间问题,例如使用几何和地理类型进行邻近度分析,使用矢量运算优化数据,使用栅格处理和地图代数计算统计信息,以及使用拓扑保证编辑的一致性,等等。

第Ⅲ部分介绍一些常见的用于补充和增强PostGIS的开源服务器端工具,如过程化语言PL/R、PL/Python和PL/V8,以及创建网络路由应用程序的工具pgRouting,还介绍PostGIS在Web应用程序中的应用。

各类读者阅读本书时均可从中受益。对于GIS从业者和程序员,本书可以提供更快捷的方法以解决地图数据分析的实际问题;对于数据库从业者,通过学习本书,可以拓宽视野,并增加其能够处理的数据类型;对于科研人员和教育工作者,本书可以为他们搭建一个数据库管理、关系数据库使用或GIS方面的框架,方便他们使用空间分析工具来分析数据,进行建模或者培训学生。

本书中存在很多专业术语,作者也使用了很多“俚语”,译者在翻译过程中查阅了大量的资料,力求忠于原文、表达简练。清华大学出版社的专业编辑们对译稿进行了全面、细致的校对,提出了许多宝贵意见,在此表示感谢。虽然译者在翻译过程中对原著内容进行了反复思考,力图传达作者确切的意图,但由于译者水平有限,疏漏之处在所难免,望各位读者、专家和业内人士不吝提出宝贵意见。

译者

 

我们年幼时可能都曾被告知:人如其食。这提醒我们,饮食对我们的健康和生活质量而言是不可或缺的。现代世界,我们使用口袋中感知位置的智能手机、汽车上的GPS和计算机地理编码的互联网地址,“我们是谁,我们就在哪里”已经成为事实——每个人都是一个移动传感器,在地球上移动时会生成不断流动的位置编码数据。

为了管理和驾驭数据流,以及通过经济卫星成像和众包地图开放的并行数据流,我们需要一个能够完成这项任务的工具——一个能够持久存储数据、有效访问数据和有力分析数据的工具。我们需要一个空间数据库,如PostGIS。

在空间数据库出现之前,位置和制图数据的计算机分析是通过在桌面工作站运行的地理信息系统(geographic information system,GIS)进行的。2001年,PostGIS第一次发布时,它的项目名称只是一个简单的文字游戏,自然地,PostgreSQL数据库的空间扩展就被命名为PostGIS。

但随着项目的成熟,这个名字也有了进一步的意义。每年都会添加新的数据分析函数,而且用户会越来越深入地使用这些函数,完成以前需要专门的GIS工作站才能完成的工作。PostGIS实际上是在创造一个后GIS的世界,在这里,我们不再需要GIS软件来做GIS工作,只用一个空间数据库就足够了。

2002年3月,在PostGIS首次发布还不到一年的时候,我就用邮件询问了人们是如何使用PostGIS的。

在Regina Obe的第一封邮件中,她是这样回答的:

我们在波士顿市使用它进行邻近度分析。我们部门的一部分职责是将止赎房产分配给开发商等,以建造房屋、企业等。我们使用PostGIS根据邻近度列出房产,这样,如果开发商想在一块土地上开发,假设土地面积为X,他们就能更好地了解这个项目是否可行。

甚至在项目早期,Regina Obe就已经在测试PostGIS的功能并创建智能分析了。

自2011年《PostGIS实战》首次发行以来,PostGIS本身就一直非常活跃,添加了栅格分析、3D、聚类、时间数据、拓扑等新特性。世界也在不断发展。

大约20年前,当PostGIS还是一个全新的事物时,认为几乎每个人口袋里都会有一个GPS设备(手机)的想法是相当疯狂的,而现在这已经是司空见惯的事了。PostGIS的地理位置管理特性现在正被开发人员广泛使用,这些人几年前还从未听说过空间数据。

在过去的几年里,卫星和航空图像已经进入大众市场,无人机系统已经很普遍,位置传感器几乎被安装在任何移动的资产上。需要分析的数据量以及数据的速度和容量比以往任何时候都要大。

与此同时,PostGIS从未像现在这样易于为你提供服务。可以在任何云提供商上启动一个副本,下载任何平台的构件,如果有足够的兴趣,甚至可以下载开源代码并自行构建,就像多年前Regina所做的那样。

请尽情享受本书和它提供的见解吧,它将教你如何将位置数据应用到工作中。Regina和Leo已经将大量信息提炼成了一本独一无二的简明指南。

Paul Ramsey       

PostGIS项目指导委员会主席

 

前    言

PostGIS是PostgreSQL开源关系数据库管理系统的空间数据库扩展。它是目前最强大的开源空间数据库引擎。它为PostgreSQL添加了几种空间数据类型和四百多个用于处理这些空间类型的函数。PostGIS支持许多符合OGC/ISO SQL/MM标准的、在其他关系数据库(如Oracle、SQL Server、MySQL和IBM DB2)中也能找到的空间函数,还支持许多额外的、PostGIS独有的空间特性。

自本书的上一版以来,其他数据库都增加了空间功能,这通常是PostGIS提供的功能的一个子集。在谷歌BigQuery和Snowflake中可以看到同名函数。许多云提供商现在也在数据库即服务(Database as a Service,DBaaS)中提供PostgreSQL/PostGIS。

来自其他符合ANSI/ISO标准的空间数据库或其他关系数据库的读者,使用PostgreSQL和PostGIS时会感到非常舒适。PostgreSQL是最符合ANSI/ISO SQL标准的数据库管理系统之一。

本书旨在为PostGIS的官方文档提供一本配套的书籍,充当浏览PostGIS提供的数百个函数的一种指南。我们想写一本书,将我们遇到的许多常见的空间问题以及用PostGIS解决这些问题的各种策略记录下来。

除了主要目的外,我们希望为空间思维奠定基础。希望读者能够将本书提供的众多示例和诀窍应用到自己的领域中,甚至孕育出创造性的成果。

 

致    谢

首先,我们要感谢PostGIS软件包的许多维护者,特别是Sebastiaan Couwenberg、Devrim Gündüz、Greg Troxel和Christoph Berg,他们为PostGIS版本的改进提供了很多指导,没有他们,就没有PostGIS。

我们还要感谢PostGIS开发团队和项目指导委员会,特别是Paul Ramsey、Sandro Santilli、Raúl Marín Rodríguez、Darafei Praliaskouski、Bborie Park、Dan Baston、Martin Davis和Nicklas Avén,他们为本书中讨论的新特性做出了贡献。

我们要感谢Manning出版社的每个人。特别是如下几位:我们的策划编辑Susan Ethridge,她帮助我们润色章节并提供了许多必要的建议;我们的文稿编辑Andy Carroll,他发现了许多无意义的句子、无效的代码引用和无效的链接,并对许多表述进行了核实;还有我们的技术评审员,他们测试了代码并在早期发现了代码中的错误。我们还要对以下人员表示感谢:出版商Marjan Bace,组织了评审反馈的评审编辑Aleksandar Dragosavljević,我们的制作和编辑团队成员Mary Piergies、Becky Whitney和Deirdre Hiam,校对人员Melody Dolab,以及其他让我们在整个过程中保持专注的人。

特别要感谢PostGIS过去的贡献者,他们的贡献构成了PostGIS的基础:Olivier Courtin(印象中)、Mateusz Loskot、Pierre Racine和无数其他人。我们感谢PostGIS新闻组社区的订阅者,他们尽可能快、尽可能好地回答问题,而PostGIS的每位博主都以自己的方式给新加入PostGIS的成员一种温暖和愉快的感觉。

如果没有波士顿市的社区发展部(DND),特别是管理信息系统(MIS)和政策开发与研究部门(在这里,Regina第一次接触到GIS和PostGIS),我们就不可能接触到PostGIS。

我们还要感谢评审人员:Alvin Scudder、Arnaldo Ayala、Billy O’Callaghan、Biswanath Chowdhury、Carla Butler、Chris Viner、Daniel Tomás Lares、Daniele Andreis、DeUndre’ Rushon、Dhivya Sivasubramanian、Evyatar Kafkafi、Hilde Van Gysel、Ikechukwu、Okonkwo、Jesus Manuel Lopez Becerra、Luis Moux-Dominguez、Marcus Brown、Mike Haller、Mike Jensen、Paulo Vieira、Philip Patterson、Richard Meinsen、Vladimir Kuptsov和Weyert de Boer。你们的建议让本书的质量更上一层楼。

最后,我们感谢MEAP读者,他们提供了宝贵的建设性意见,并在早期发现了代码和解释中的错误。

 

关 于 本 书

本书主要关注PostGIS 3和PostGIS 3.1系列,以及PostgreSQL 11~13。本书不能替代PostGIS或PostgreSQL官方文档。官方的PostGIS文档很好地介绍了PostGIS中可用的大量函数,并提供了关于如何使用这些函数的示例。但它不会讲解如何将所有这些函数组合在一起以解决问题。这就是本书的目的。虽然本书没有涵盖PostGIS中所有可用的函数,但确实讲解了更常用的有趣函数,并教你如何将它们巧妙地结合起来以解决空间分析和建模中的经典、深奥但有趣的问题。

本书侧重于二维和三维非曲面笛卡儿矢量几何、二维大地测量矢量几何、栅格数据和网络拓扑。

虽然本书的主要目的是讲解PostGIS的用法,但如果我们不了解它的工作环境,就无法完成我们的使命。PostGIS不是孤立的,它很少单独运行。为了完成整个过程,本书还包含以下内容:

l 一个内容广泛的附录详细介绍了PostgreSQL的设置、备份和安全管理。附录还介绍了SQL的基础知识,以及使用它创建函数和其他对象的方法。

l 有几章专门介绍了PostGIS在网络地图中的运用、如何使用桌面工具进行查看、通常与PostGIS一起使用的PostgreSQL PL语言,以及额外的开源插件,如PostGIS封装的TIGER geocoder和单独封装的pgRouting。

本书不会对PostGIS库的数学基础进行严格的处理。我们依赖于对点、线和多边形等概念的直观理解。同样,本书不会深入研究数据库理论。当我们预测一个特定的索引应该比另一个更有效时,我们是凭经验做出有根据的猜测,而不是通过掌握关系代数并分析计算机芯片得出结论。

谁应该阅读本书

本书介绍了PostGIS,并假定读者对编程和数据处理有基本的了解。我们发现对PostGIS感兴趣的读者和最适合阅读本书的读者有以下几类。

GIS从业者和程序员

这些人对数据、大地水准面和投影了如指掌;知道在哪里找到数据来源;可以使用ArcGIS、MapInfo、Leaflet、OpenLayers、谷歌Maps或其他支持Ajax的工具包创建令人惊叹的应用程序;擅长在Esri形状文件中生成数据源,使用QGIS或ArcGIS创建制图杰作;甚至可以向启用了空间特性的数据库中添加数据或从数据库中提取数据,但当被问及有关数据的问题时,他们却答不上来。你也许能够在地图上找到美国所有的沃尔玛,但如果不逐个统计图钉,你未必能回答“密西西比河以东有多少家沃尔玛”,这完全是另外一回事。当然,可以使用桌面工具编写过程代码来回答这些问题,但我们希望展示一种更快的方法。

那么,启用空间特性的数据库提供了哪些新功能呢?

l 它使你能轻松地将空间数据与其他企业数据(如财务信息、观测数据和营销信息)混合在一起。可以使用Esri形状文件、KML文件和其他GIS文件格式执行这些操作,但需要额外的步骤,并且会限制与其他相关数据的连接。PostgreSQL数据库具有一些特性,比如可以提高连接速度的查询计划器,以及许多常用的统计函数,可以使相当复杂的问题和汇总统计变得相对易于运行和编写。

l 无论用户是在屏幕上绘制几何图形并输入相关信息,还是在地图上单击某个点,都有大量围绕数据库构建的基础结构,因此,当收集用户数据时,如果使用数据库,任务就会容易得多。例如,使用.NET、PHP、Perl、Python、Java或其他语言开发自己的Web应用程序。每种语言都有PostgreSQL驱动程序,使你能方便地插入和查询数据。此外,还有大量的选项可供选择,如文本到几何图形的函数,几何到SVG、到KML和到GeoJSON的函数,PostGIS提供的其他处理函数,以及OpenLayers、MapServer和GeoServer等平台提供的几何生成和操作函数。

l 关系数据库提供了管理支持,可以方便地控制谁有权访问什么,不管被访问的是文本属性还是几何图形。

l PostgreSQL提供了触发器,当某些数据库事件发生时,触发器可以生成其他东西,比如其他表中的相关几何图形。

l PostgreSQL有一个多版本并发控制(multi-version concurrency control,MVCC)事务核心来确保当100个用户同时读取或更新数据时,系统不会突然崩溃。

l PostgreSQL允许在数据库中编写自定义函数,这些函数可以从不同的应用程序中调用。在编写存储函数时,可从PostgreSQL提供的多种语言中进行选择。

l 如果专注于喜欢的GIS桌面工具,也不要担心。选择像PostGIS这样的空间DBMS,并不意味着需要放弃所选的工具。Manifold、Cadcorp、MapInfo 10+、AutoCAD、Esri ArcGIS、ArcMap、服务器工具和各种常用的桌面工具都内置了对PostGIS的支持。Safe FME是GIS专业人员最喜欢的一种提取-转换-负载(extract-transform-load,ETL)工具,长期以来它一直支持PostGIS。

DB从业者

在你从事数据库工作的某个时刻,有人可能会提出一个关于面向空间的数据问题。如果没有支持空间的数据库,思维会被限制在坐标、位置名称或其他可以简化为数字和字母的地理属性中。这些对于点数据很有效,但是一旦开始处理面积和区域,就可能完全迷失方向。你也许能在一个郡里找到所有叫史密斯的人,但是如果要找到住在10英里以内的所有叫史密斯的人,就会面临困难。

我们希望具有标准关系数据库背景的读者能够认识到,数据不仅仅是数字、日期和字符,SQL的惊人功能可以在非文本数据上实现。当然,你可能在关系数据库中存储了图像、文档和其他奇怪的东西,但我们怀疑你可以通过对这些字段编写SQL连接的方式完成更多工作。

科学家、研究人员、教育工作者和工程师

许多技能高超的科学家、研究人员、教育工作者和工程师使用空间分析工具来分析他们收集的数据,为他们的发明建模或者培训学生。虽然我们认为自己和他们不一样,但我们最钦佩这些人,因为他们创造知识,从根本上改善我们的生活。他们可能知道许多关于数学、生物、化学、地理、物理、工程等方面的知识,但他们没有接受过数据库管理、关系数据库的运用或GIS方面的培训。我们希望提供一个足够完整的框架,让这些人不用太费力就能跟上进度。

PostgreSQL/PostGIS能提供什么?

l 它提供了集成统计包(如R)的能力,甚至允许在PL/R中编写数据库程序函数,充分利用R的强大功能。

l PostgreSQL还支持PL/Python和PL/JavaScript,相比于普通的Python环境,在数据库中,它允许利用不断增长的Python和JavaScript库进行科学研究,可以更紧密地处理数据。

l 虽然许多人认为PostGIS,顾名思义,是地理信息系统的工具,但我们将其视为空间分析的工具。区别在于,地理学关注的是地球和与地球相关的参考系统,而空间分析关注的是空间和空间的利用。该空间和坐标参考系统可能特定于蚁丘,或尚未确定位置的核电站地图,或大脑的不同区域,或者它可能被用作一个可视化工具来建模固有的非视觉性,如过程建模。虽然你的兴趣领域可能没有被空间分析所触及,但我们鼓励你进行更深入的探索。

l 数据库是大量数据的天然存储库,有很多内置的统计/归纳函数和结构,以便生成有用的报告和分析。如果处理的是空间性质的数据或利用空间作为可视化工具,PostGIS提供了更多的函数来扩展分析。

l 科学研究所需的大部分数据都可通过机器(GPS、报警系统、遥感设备)轻松收集,并通过自动化的输入或标准的输入格式直接传输到数据库。事实上,智能手机和无人驾驶飞机等收集工具正变得越来越便宜,普通民众也越来越容易获得,存储数据的硬件也越来越便宜。

l 部分数据很容易分发。关系数据库是创建所谓的“数据分配器”或“数据集市”的理想选择,它允许其他研究人员轻松获取所需的数据子集,或者提供数据,让公众轻松下载。

以上是空间数据库用户的基本群体,但并不是唯一的群体。如果你曾经环顾世界,想一想,如果要把犯罪统计数据与植树的地点联系起来,或者给定一个地区的海拔模型和温度波动,将种植作物的最佳地点和时间联系起来,那么PostGIS可能是最容易和最划算的工具。

本书的内容安排

本书内容分为三个主要部分,并有三个支持附录。

第I部分:PostGIS简介

第Ⅰ部分介绍空间关系数据库的基本概念,特别是PostGIS/PostgreSQL。这部分旨在介绍行业标准的GIS数据库的概念和实践。在本部分结束时,你应该基本掌握几何、地理、栅格和拓扑等类型以及每种类型努力解决的问题,并对空间参考系统和数据库存储选项有一个基本的理解。最重要的是,你将有能力加载、查询和查看启用PostGIS的PostgreSQL数据库中的空间数据。

第II部分:将PostGIS投入工作

这部分的重点是使用PostGIS解决实际的空间问题,以及探讨如何优化速度。你将学会如何做各种各样的事情:

l 如何使用几何和地理进行邻近度分析。

l 如何使用不同类型的矢量运算来优化数据。

l 如何使用栅格和矢量数据执行无缝栅格处理。

l 如何使用栅格处理、地图代数、直方图和其他栅格统计函数来创建新的矢量数据,以计算感兴趣区域的相关统计数据。

l 如何使用栅格聚合函数从较小的栅格中创建大栅格。

l 如何使用封装的PostGIS TIGER地理编码器使地址归一化,进行地理编码和反向地理编码。

l 如何使用拓扑来保证编辑的一致性。

l 如何简化整个几何图形网络,并在简化的数据集中保持连通性。

第III部分:搭配其他工具使用PostGIS

第III部分介绍构建应用程序时最常与PostGIS搭配使用的工具。我们将介绍pgRouting,这是一种可以直接在数据库中与PostGIS搭配使用来创建网络路由应用程序的工具。此外,还将介绍PostgreSQL存储过程语言:PL/Python、PL/R和PL/V8(也称为PL/JavaScript)。最后,我们将简要研究PostGIS在Web应用程序中的应用,并介绍和PostGIS一起使用的各种地图服务器,以及OpenLayer和Leaflet绘图JavaScript API。我们还将研究如何使用PostGIS JSON和矢量切片输出函数来构建交互式的Web地图。

附录

本书提供三个附录。

附录A提供了用于在PostGIS上获取帮助的额外资源,以及书中讨论的辅助工具。

附录B介绍如何启动并运行PostgreSQL和PostGIS。

附录C是SQL入门,解释JOIN、UNION、INTERSECT、EXCEPT、公用表表达式(common table expression,CTE), 以及LATERAL的概念。这部分还讨论用聚合函数和聚合结构汇总数据的基本原理,以及窗口函数和帧等更高级的主题。

关于代码

本书中使用下列印刷规范:

l 所有代码清单都使用Courier字体。

l 正文中的某些代码字符使用Courier字体。

l 边栏和注释用于突出要点或介绍新的术语。

l 代码注释用于取代代码中的内联注释。这些注释强调代码的重要概念或领域。一些注释显示为带编号的项目符号,如 ,这些项目编号会在稍后的文本中引用。

本书所有章节的完整数据和代码都可以通过扫描封底二维码下载。

关于标题

本书将简介、概述和操作示例结合在一起,以帮助你学习和记忆。根据认知科学的研究,人们更容易记住在自我激励的探索中发现的东西。

虽然Manning里没有一个人是认知科学家,但我们相信,要让学习内容成为永久性的知识,必须经过探索、尝试等环节,还要不断重复所学的内容。对于新事物,人们理解后才能记住它,也就是说,只有在积极探索之后,他们才能掌握它。人们在实战中学习。本书的主要特点在于它是由示例驱动的。它鼓励读者尝试、使用新代码,并探索新想法。

本书的标题还有另一个更朴素的原因:我们的读者很忙。他们用书来完成工作或解决问题。他们需要那些能轻松跳读的书,并且在想要的时候学习想要的东西。他们需要帮助他们实战的书。本系列的书就是为这些读者设计的。

 

作 者 简 介

Regina Obe和Leo Hsu是数据库顾问和作者。Regina是PostGIS核心开发团队和项目指导委员会的成员。

 

关于封面插图

本书封面画像的标题为A Woman from Ubli, Croatia。这张图片取自19世纪中期由Nikola Arsenović绘制的克罗地亚传统服饰图集的副本,由克罗地亚斯普利特的民族博物馆于2003年出版。这些图片由斯普利特Ethnographic博物馆一位热心的管理员提供。该博物馆位于公元304年左右罗马皇帝Diocletian的宫殿遗址,这里曾是中世纪罗马的中心。这本图集包含各种精细彩色人物插图,这些人来自克罗地亚的不同地区,书中还有对当地服饰和日常生活的描述。在过去的200年里,人们的着装规范和生活方式发生了变化,曾经如此丰富的地区多样性现在已经消失了。现在很难区分不同大洲的居民,更不用说相隔几英里的不同村庄或城镇的居民。

也许文化多样性已经转变为更加多样化的个人生活——当然,是更加多样化和快节奏的科技生活。Manning出版社将反映两个世纪前各地区多彩生活的插图用作封面,是为了赞美计算机行业的活力和创新,同时通过古老书籍和图册中的图片带读者领略过去的风土人情。