第 2 章 PostGIS 安装

目录

本章介绍安装 PostGIS 所需的步骤。

2.1. 简短版本

如果所有依赖项都在路径中,请按如下方式编译:

Code
tar -xvzf postgis-3.7.0dev.tar.gz
cd postgis-3.7.0dev
./configure
make
make install

安装 PostGIS 后,您需要使每个数据库可用(第 3.3 节 “创建空间数据库”)或升级它(第 3.4 节 “升级空间数据库”)。

2.2. 从源代码编译和安装

[注意]

现在许多操作系统都包含 PostgreSQL/PostGIS 的预构建包。 在许多情况下,只有当您想要最前沿的版本或者您是软件包维护者时才需要编译。

本节提供一般编译过程。 如果您正在针对Windows或其他操作系统进行编译,则可以在PostGIS 用户编译指南PostGIS开发Wiki中找到更详细的帮助。

可以在 PostGIS 预构建包中找到许多操作系统的PostGIS 预构建包列表

如果您是 Windows 用户,您可以通过 Stackbuilder 或 PostGIS Windows下载站点获得稳定的版本。我们还有非常前沿的Windows实验性版本,通常每周构建一次,或者在有令人兴奋的新变化发生时构建。你可以使用这些版本来尝试正在进行中的PostGIS发布

PostGIS模块是PostgreSQL后台服务器的扩展。在PostGIS 3.7.0dev中,为了编译, 必须 提供完整的PostgreSQL服务器头文件。它可以在PostgreSQL 14 - 18版本之间构建。旧版本的PostgreSQL 再支持。

如果您没有安装 PostgreSQL,请参阅PostgreSQL安装指南。它位于 https://www.postgresql.org

[注意]

对于GEOS功能,当您安装PostgresQL时,您可能需要将PostgreSQL显式链接到标准C++库:

Code
LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE]

这是解决与旧开发工具不正常交互的虚假C++异常的一种变通方法。如果你遇到奇怪的问题(例如,后端意外关闭或类似的问题),尝试这个技巧。当然,这将需要重新从头编译你的PostgreSQL。

下一步是概述 PostGIS 源配置和编译。 这些是为Linux用户编写的,不适用于Windows或Mac。

2.2.1. 获取源代码

从下载站点 https://postgis.net/stuff/postgis-3.7.0dev.tar.gz 获取源代码的存档

Code
wget https://postgis.net/stuff/postgis-3.7.0dev.tar.gz
tar -xvzf postgis-3.7.0dev.tar.gz
cd postgis-3.7.0dev

这将在当前工作目录中创建一个名为 postgis-3.7.0dev 的目录。

或者从 git 存储库 https://git.osgeo.org/gitea/postgis/postgis/ 中查看它。

Code
git clone https://git.osgeo.org/gitea/postgis/postgis.git postgis
cd postgis
sh autogen.sh
    

切换到新创建的 postgis目录以继续安装。

Code
./configure

2.2.2. 安装要求

要构建和使用 PostGIS,您需要:

不可缺少

  • PostgreSQL 14 - 18. 需要完整安装 PostgreSQL(包括服务器头文件)。可从 https://www.postgresql.org 获取18。

    For current release-line support and end-of-life policy, see https://postgis.net/development/versions_eol/

  • GNU C 编译器 (gcc)。其他一些 ANSI C 编译器也可以用来编译PostGIS,但使用gcc编译时我们发现问题要少得多。

  • GNU Make(gmake or make)。对于许多系统,GNU make是 make 的默认版本。通过调用make -v检查版本。 其他版本的make可能无法正确处理 PostGIS Makefile

  • Proj投影转换库 。需要 Proj 6.1 及以上版本。Proj 库用于 PostGIS 中提供坐标重投影支持。Proj 可以从 https://proj.org/ 下载。

  • GEOS 几何库,版本需为 3.8.0 或更高,但建议使用 GEOS 3.14 及以上版本,以充分利用所有新函数和特性。可从 https://libgeos.org 下载。

  • LibXML2、2.5.x 或更高版本。 目前,导入函数(ST_GeomFromGML和ST_GeomFromKML)使用 LibXML2。 您可以从 https://gitlab.gnome.org/GNOME/libxml2/-/releases 下载 LibXML2。

  • JSON-C 0.9或更高版本。JSON-C 目前用于按 ST_GeomFromGeoJson 导入 GeoJSON。 JSON-C 可从 https://github.com/json-c/json-c/releases/ 下载。

  • The GNU Multiple Precision Arithmetic Library (libgmp). Used to control precision of math operations in PostGIS Topology. GMP is available for download from https://gmplib.org/.

  • 推荐使用 GDAL 3 以上版本。此版本对于栅格功能是必需的。更多信息请参阅https://gdal.org/download.html

  • 要使用PostgreSQL+JIT进行编译,需要LLVM版本6或更高版本。请参阅 https://trac.osgeo.org/postgis/ticket/4125

可选择的

  • GDAL(伪可选)仅当您不需要栅格时才可以将其省略。另请确保启用您要使用的驱动程序,如第 3.2 节 “配置栅格支持”中所述。

  • GTK(需要 GTK+2.0, 2.8+)。用于编译shp2pgsql-gui,一个shapefile loader。它位于 http://www.gtk.org/

  • SFCGAL, 1.4.1 or higher is required, 2.3+ is needed to be able to use all functionality. SFCGAL can be used to provide additional 2D and 3D advanced analysis functions to PostGIS cf 第 8 章 SFCGAL函数参考. https://sfcgal.gitlab.io/sfcgal/.

  • 要启用ST_AsMVT,您需要ProtoBuf-C库(运行时)和ProtoC-C编译器(构建时)。要检查 protobuf-c 的正确最低版本,需要 pkg-config。 参见protobuf-c。默认情况下,PostGIS 使用 Wagyu 快速评估 MVT 多边形,但需要 C++11 编译器。 使用 CXXFLAGS 使用您用于 PostgreSQL 安装的相同编译器。如果要禁用此功能并改用 GEOS,请在配置期间指定它。 --without-wagyu

  • CUnit(CUnit)。 这是回归测试所需要的。 http://cunit.sourceforge.net/

  • DocBook (xsltproc)构建文档需要。Docbook可从 http://www.docbook.org/ 获取。

  • DBLatex (dblatex)需要以 PDF 格式构建文档。它位于 http://dblatex.sourceforge.net/

  • PDF documentation needs an SVG rasterizer for its high-resolution figure fallbacks. The build prefers rsvg-convert, and can also use GraphicsMagick (gm convert) or ImageMagick (magick or convert).

2.2.3. 构建配置

与大多数 Linux 安装一样,第一步是生成一个将用于构建源代码的 Makefile。 这是通过 shell 脚本完成的

Code
./configure

如果未提供任何参数,此命令将自动查找在系统上构建 PostGIS 源代码所需的组件和库。./configure 是一种常见的用法,但它接受一些参数,以防您在非标准位置拥有必要的库或程序。

以下列表显示了常用参数:有关完整列表,请使用 --help--help=short参数。

--with-library-minor-version

从 PostGIS 3.0 开始,默认生成的库文件将不再将次要版本作为文件名的一部分。 这意味着所有 PostGIS 3 库都将以 postgis-3 结尾。 这样做是为了使 pg_upgrade 更容易,缺点是您只能在服务器中安装一个版本的 PostGIS 3 系列。 要获取文件的旧行为(包括次要版本):例如 postgis-3.0 将此开关添加到您的配置语句中。

--prefix=PREFIX

This is the installation prefix for PostGIS command-line utilities. By default, utilities are installed in the executable directory reported by the detected PostgreSQL installation.

[小心]

PostgreSQL extension files are installed in the directories reported by pg_config, so the server can load them. This includes the PostGIS shared library and SQL extension files. Use --with-pgconfig=FILE to choose the PostgreSQL installation that PostGIS builds and installs against.

--with-pgconfig=FILE

PostgreSQL有一个名为pg_config的实用程序,使PostGIS等扩展能够定位PostgreSQL安装目录。使用此参数 (--with-pgconfig=/path/to/pg_config)可以手动指定 PostGIS 的特定 PostgreSQL 的安装目录。

--with-gdalconfig=FILE

GDAL是必需的库,提供栅格支持 gdal-config所需的功能,以使软件安装能够找到 GDAL装目录。使用此参数 (--with-gdalconfig=/path/to/gdal-config)手动指定 PostGIS 将针对其构建的特定 GDAL的安装目录。

--with-geosconfig=FILE

作为一个基本的几何库,GEOS 有一个名为 geos-config的实用程序,它会告诉您在安装软件时在哪里安装 GEOS。使用此参数 (--with-geosconfig=/path/to/geos-config) 手动指定要用于 PostGIS 构建的特定 GEOS的安装目录。

--with-xml2config=FILE

LibXML 是执行 GeomFromKML/GML 过程所需的库。通常情况下,如果您已安装 libxml,它将被找到,但如果没有或者您想使用特定版本,您需要指定一个特定的 xml2-config 配置文件,以便让软件安装程序找到 LibXML 安装目录。使用这个参数 (>--with-xml2config=/path/to/xml2-config) 来手动指定 PostGIS 将构建的特定 LibXML 安装。

--with-projdir=DIR

Proj是PostGIS必不可少的投影库。使用此参数 (--with-projdir=/path/to/projdir)手动指定要用于 PostGIS 构建的特定 Proj 的安装目录。

--with-libiconv=DIR

iconv的安装目录。

--with-jsondir=DIR

JSON-C 是 MIT 许可的 JSON 库,是 PostGIS ST_GeomFromJSON 所必需的。使用此参数 (--with-jsondir=/path/to/jsondir) 手动指定要用于 PostGIS 构建的特定 JSON-C的安装目录。

--with-gui

编译数据导入GUI(需要 GTK+2.0)。此参数为 shp2pgsql 创建一个名为 shp2pgsql-gui 的图形用户界面。

--without-raster

在没有栅格功能的情况下进行编译。

--without-topology

不编译 topology 支持。

--with-gettext=no

默认情况下,会检测 gettext 并使用它进行编译,但如果在导致加载程序损坏的不兼容问题下运行,则此命令可以禁用它。使用此功能的配置可以解决的问题示例,请参见http://trac.osgeo.org/postgis/ticket/748。 注意:关闭此功能不会消除许多功能。 它用于 GUI 加载器中的内部帮助/标签功能,这些功能尚未记录,处于实验阶段。

--with-sfcgal=PATH

默认情况下,如果没有此开关,PostGIS 将不会安装 sfcgal 支持。 PATH 是一个可选参数,允许指定 sfcgal-config 的备用 PATH。

--without-phony-revision

禁用 postgis_revision.h 更新以匹配 Git 存储库中的当前 HEAD。

[注意]

如果要从代码存储库 获取PostGIS,请先运行以下脚本

Code
./autogen.sh

此脚本生成配置脚本。这用于自定义 PostGIS 安装。

如果要获取 PostGIS 作为存档文件,则无需./autogen.sh,因为 配置已经生成。

2.2.4. 构建

生成Makefile后,构建PostGIS就像运行命令一样简单

Code
make
栅格输出
[last line of output]
PostGIS was built successfully. Ready to install.

所有函数的注释都是根据文档自动生成的。如果你之后想把这些注释安装到自己的空间数据库里,需要运行依赖 docbook 的命令来导入注释。不过,如果是从 tar.gz 包安装,doc 目录里已经包含了 postgis_comments.sql 等注释文件,就不需要再额外生成了;另外,通过 CREATE EXTENSION 安装时,这些注释也会一并包含在内。

Code
make comments

The make cheatsheets target generates html cheat sheets suitable for quick reference or for student handouts. This requires xsltproc to build and will generate 4 files in doc folder topology_cheatsheet.html, raster_cheatsheet.html, postgis_cheatsheet.html

预构建的HTML和PDF版本可以在PostGIS / PostgreSQL学习指南中找到

Code
make cheatsheets

2.2.5. 构建和部署PostGIS扩展

当 PostgreSQL 提供扩展支持时,PostGIS 扩展会被自动构建并安装。

如果要从源存储库构建,则必须先构建函数描述。这些是在安装文档手册时构建的。 您也可以手动安装:

Code
make comments

如果从存档文件构建,则其中一些注释文件已经构建,因此无需构建注释。

如果您针对 PostgreSQL 9.1 进行构建,则应在 make 安装过程中自动构建扩展。如果需要,可以从扩展文件夹生成,或者根据需要在另一台服务器上复制该文件。

Set PGUSER if you need to override the psql connection user, then test before installing. After installation, run the extension regression tests.

Code
cd extensions
cd postgis
make clean
make
export PGUSER=postgres
make check
make install
make check RUNTESTFLAGS=--extension
[注意]

make check 使用 psql 来运行测试,并使用 psql 环境变量。常用的可用于覆盖的有 PGUSERPGPORTPGHOST。参考psql环境变量

扩展文件在同一版本的PostGIS中始终是相同的,无论操作系统如何。只要已经安装了PostGIS二进制文件,就可以将扩展文件从一个操作系统复制到另一个操作系统。

如果您想在与开发环境不同的另一台服务器上手动安装扩展,除了通常需要的PostGIS二进制文件之外,还需要将以下文件从 extensions 文件夹复制到 PostgreSQL 安装目录下的 PostgreSQL/share/extension 文件夹中。

  • 指定未提供时,控制文件postgis.control, postgis_topology.control 显示要安装的扩展版本等信息。

  • 请注意,针对每个扩展的 /sql 文件夹中的所有文件(例如,extensions/postgis/sql/*.sqlextensions/postgis_topology/sql/*.sql)需要复制到 PostgreSQL 的 share/extension 文件夹的最上层

完成这一步后,你应该在 PgAdmin> 中看到 postgispostgis_topology 作为可用的扩展。

如果使用 psql,则可以运行以下查询来验证是否已安装扩展:

Code
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name LIKE 'postgis%'
ORDER BY name;
栅格输出
┌──────────────────┬─────────────────┬───────────────────┐
│ name             │ default_version │ installed_version │
├──────────────────┼─────────────────┼───────────────────┤
│ postgis          │ 3.7.0dev        │ 3.7.0dev        │
│ postgis_raster   │ 3.7.0dev        │ 3.7.0dev        │
│ postgis_sfcgal   │ 3.7.0dev        │                   │
│ postgis_topology │ 3.7.0dev        │                   │
└──────────────────┴─────────────────┴───────────────────┘

如果您正在查询的数据库中安装了扩展程序,您将在 installed_version 列中看到提及。 如果您没有收到任何记录,则意味着您的服务器上根本没有安装 postgis 扩展。 PgAdmin III 1.14+ 还将在数据库浏览器树的扩展 部分中提供此信息,甚至允许通过右键单击进行升级或卸载。

如果您有有效的扩展,则可以使用 pgAdmin 扩展接口或通过运行以下 SQL 将 PostGIS 扩展安装到所选数据库:

Code
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION postgis_topology;

在 psql 中,你可以使用以下命令来查看你已安装的版本以及它们所在的模式。

Code
\connect mygisdb
\x
\dx postgis*
栅格输出
List of installed extensions
┌─[ RECORD 1 ]────────────────────────────────────────────────┐
│ Name        │ postgis                                       │
│ Version     │ 3.7.0dev                                        │
│ Schema      │ public                                        │
│ Description │ PostGIS geometry, geography, and raster…      │
├─[ RECORD 2 ]────────────────────────────────────────────────┤
│ Name        │ postgis_raster                                │
│ Version     │ 3.7.0dev                                        │
│ Schema      │ public                                        │
│ Description │ PostGIS raster types and functions            │
├─[ RECORD 3 ]────────────────────────────────────────────────┤
│ Name        │ postgis_topology                              │
│ Version     │ 3.7.0dev                                        │
│ Schema      │ topology                                      │
│ Description │ PostGIS topology spatial types and functions  │
└─────────────────────────────────────────────────────────────┘
[警告]

扩展表 spatial_ref_syslayertopology 不能单独备份。只有在备份对应的 postgispostgis_topology 扩展时才会一起备份,而这只会在你备份整个数据库时发生。备份中只会包含那些 不是 PostGIS 自带的 srid 记录,所以不要修改我们随 PostGIS 一起提供的条目并指望修改能长期保留——如果发现问题,请提交工单。扩展表的结构永远不会出现在备份里,因为它们是通过 CREATE EXTENSION 创建的,在同一扩展版本下默认结构是一致的。这些行为属于当前 PostgreSQL 扩展模型的固有机制。

如果你在没有使用扩展系统的情况下安装了3.7.0dev版本,你可以通过运行以下命令将其转换为基于扩展的安装方式,以将函数打包到各自的扩展中。在PostgreSQL 13中已移除了使用`unpackaged`安装方式,因此建议在升级到PostgreSQL 13之前切换到扩展构建方式。

Code
CREATE EXTENSION postgis FROM unpackaged;
CREATE EXTENSION postgis_raster FROM unpackaged;
CREATE EXTENSION postgis_topology FROM unpackaged;

2.2.6. 测试

要测试 PostGIS,请运行以下命令

Code
make check

此命令使用针对实际 PostgreSQL 数据库生成的库执行各种检查和回归测试。

[注意]

如果您使用非标准 PostgreSQL、GEOS 或 Proj 位置配置 PostGIS,则可能需要将它们的库位置添加到 LD_LIBRARY_PATH 环境变量中。

[小心]

目前,make check 依赖于PATHPGPORT环境变量来执行检查。它是使用 --with-pgconfig配置参数指定的 PostgreSQL。编辑路径以匹配在配置期间检测到的 PostgreSQL。 或者为不可避免的麻烦做好准备。

[注意]

沙箱式构建账号(非 PostgreSQL 超级用户)在回归测试周期中,可以通过导出 POSTGIS_REGRESS_DB_OWNER 来委托数据库所有权。测试框架会创建一个临时的回归测试库,并将其所有者设为指定的角色,同时仍然使用权限更低的账号进行连接。如果扩展的创建角色需要与数据库所有者不同,可以再配合使用 POSTGIS_REGRESS_ROLE_EXT_CREATOR

这些变量的作用是:在目标 PostgreSQL 实例允许这些委托角色安装扩展的前提下,让自动化环境在不把调用账号提升为超级用户的情况下,依然能够走完整的升级路径和扩展安装流程。

如果成功,make check 将产生近 500 个测试的输出。结果将类似于 以下(下面省略了许多行):

Code
CUnit - A unit testing framework for C - Version 2.1-3
     http://cunit.sourceforge.net/

  .
  .
  .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     44     44    n/a      0        0
               tests    300    300    300      0        0
             asserts   4215   4215   4215      0      n/a
Elapsed time =    0.229 seconds

  .
  .
  .

Running tests

  .
  .
  .

Run tests: 134
Failed: 0


-- if you build with SFCGAL

  .
  .
  .

Running tests

  .
  .
  .

Run tests: 13
Failed: 0

-- if you built with raster support

  .
  .
  .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     12     12    n/a      0        0
               tests     65     65     65      0        0
             asserts  45896  45896  45896      0      n/a


  .
  .
  .

Running tests

  .
  .
  .

Run tests: 101
Failed: 0

-- topology regress

.
.
.

Running tests

  .
  .
  .

Run tests: 51
Failed: 0

-- if you built --with-gui, you should see this too

     CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/

  .
  .
  .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites      2      2    n/a      0        0
               tests      4      4      4      0        0
             asserts      4      4      4      0      n/a

输出应类似于以下内容:

栅格输出
============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== installing fuzzystrmatch               ==============
CREATE EXTENSION
============== installing postgis                     ==============
CREATE EXTENSION
============== running regression test queries        ==============
test test-normalize_address   ... ok

=====================
All 2 tests passed.
=====================

2.2.7. 安装

要安装 PostGIS,请运行以下命令

Code
make install

这会将 PostGIS 安装文件复制到由--prefix参数指定的相应子目录。以下是值得注意的子目录:

  • 加载程序和转储程序二进制文件安装在 [prefix]/bin

  • SQL 文件(例如 postgis.sql)安装在 [prefix]/share/contrib 中。

  • PostGIS 库安装在[prefix]/lib

如果之前生成了make 注释,请运行以下命令来安装这些 SQL 文件:postgis_comments.sql,raster_comments.sql

Code
make comments-install
[注意]

postgis_comments.sql, raster_comments.sql, topology_comments.sql成为 xsltproc 的外部依赖关系,因此它与正常的构建和安装分离。

2.3. 常见问题

当安装或升级未按预期进行时,需要检查一些事项。

PostgreSQL version mismatch.

请确保已安装 PostgreSQL14 或更新版本,并且你正在使用与正在运行的 PostgreSQL 版本相同的 PostgreSQL 源代码进行编译。当你的(Linux)发行版已经安装了 PostgreSQL,或者以其他方式安装了 PostgreSQL 但忘记了时,可能会出现混淆。PostGIS 只能与 PostgreSQL14 或更新版本一起使用,如果使用较旧版本,可能会出现奇怪且意想不到的错误消息。要检查正在运行的 PostgreSQL 版本,可以使用 psql 连接到数据库并运行以下查询:

Code
SELECT version();

If you are running an RPM based distribution, you can check for the existence of pre-installed packages using the rpm command as follows:

Code
rpm -qa | grep postgresql

Restoring an upgrade into a database without PostGIS.

如果升级失败,请确保还原到已安装PostGIS的数据库。

Code
SELECT PostGIS_Full_Version();

此外,请检查配置是否正确检测到 PostgreSQL、Proj4 库和 GEOS 库的安装位置。

配置的输出用于生成 postgis_config.h 文件。检查POSTGIS_PGSQL_VERSION, POSTGIS_PROJ_VERSIONPOSTGIS_GEOS_VERSION变量是否已正确设置。