第 2 章。PostGIS 安装

目录

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

2.1. 简短版本

假设您的搜索路径中已包含所有依赖项,则进行编译

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

安装 PostGIS 后,需要在要使用它的每个单独的数据库中启用(第 3.3 节,“创建空间数据库”)或升级(第 3.4 节,“升级空间数据库”)。

2.2. 从源代码编译和安装

[Note]

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

本节包括通用的编译说明,如果您是为 Windows 等或其他操作系统进行编译,您可以在 PostGIS 用户贡献的编译指南PostGIS 开发维基 中找到更多详细的帮助。

各种操作系统的预构建软件包列在 PostGIS 预构建软件包

如果您是 Windows 用户,您可以通过 Stackbuilder 或 PostGIS Windows 下载站点 获取稳定版本。我们也有 非常前沿的 Windows 实验性构建,通常每周构建一两次,或者在发生任何令人兴奋的事情时构建。您可以使用它们来试用正在进行的 PostGIS 版本。

PostGIS 模块是 PostgreSQL 后端服务器的扩展。因此,PostGIS 3.5.2dev 需要 完整的 PostgreSQL 服务器头文件访问权限才能编译。它可以使用 PostgreSQL 版本 12 - 17 构建。 支持早期版本的 PostgreSQL。

如果您尚未安装 PostgreSQL,请参阅 PostgreSQL 安装指南。 https://postgresql.ac.cn

[Note]

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

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

这是解决与旧开发工具交互时出现的伪 C++ 异常问题的变通方法。如果您遇到奇怪的问题(后端意外关闭或类似情况),请尝试此技巧。当然,这将需要从头开始重新编译 PostgreSQL。

以下步骤概述了 PostGIS 源代码的配置和编译。它们是为 Linux 用户编写的,不适用于 Windows 或 Mac。

2.2.1. 获取源代码

从下载网站检索 PostGIS 源代码存档 https://postgis.net.cn/stuff/postgis-3.5.2dev.tar.gz

wget https://postgis.net.cn/stuff/postgis-3.5.2dev.tar.gz
tar -xvzf postgis-3.5.2dev.tar.gz
cd postgis-3.5.2dev

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

或者,从 git 存储库 https://git.osgeo.org/gitea/postgis/postgis/ 中检出源代码。

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

更改到新创建的 postgis 目录以继续安装。

./configure

2.2.2. 安装要求

PostGIS 有以下构建和使用要求

必需

  • PostgreSQL 12 - 17。需要完整安装 PostgreSQL(包括服务器头文件)。PostgreSQL 可从 https://postgresql.ac.cn 获取。

    有关完整的 PostgreSQL / PostGIS 支持矩阵和 PostGIS/GEOS 支持矩阵,请参阅 https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS

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

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

  • Proj 重新投影库。需要 Proj 6.1 或更高版本。Proj 库用于在 PostGIS 中提供坐标重新投影支持。Proj 可从 https://proj.org/ 下载。

  • GEOS 几何库,版本 3.8.0 或更高版本,但需要 GEOS 3.12+ 才能充分利用所有新功能。GEOS 可从 https://libgeos.org 下载。

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

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

  • 首选 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 shape 文件加载器。 https://gtk.org.cn/

  • SFCGAL,需要 1.4.1 或更高版本,并且需要 1.5.0+ 才能使用所有功能。SFCGAL 可用于为 PostGIS 提供额外的 2D 和 3D 高级分析功能,请参阅 第 8 章,SFCGAL 函数参考。它还允许使用 SFCGAL 而不是 GEOS 来处理由两个后端提供的某些 2D 函数(例如 ST_Intersection 或 ST_Area)。PostgreSQL 配置变量 postgis.backend 允许最终用户控制在安装 SFCGAL 时想要使用的后端(默认为 GEOS)。注:SFCGAL 1.2 至少需要 CGAL 4.3 和 Boost 1.54(参阅:https://sfcgal.orghttps://gitlab.com/sfcgal/SFCGAL/

  • 要构建 第 12.1 节,“地址标准化工具”,您还需要 PCRE http://www.pcre.org(通常已在 nix 系统上安装)。如果它检测到 PCRE 库,或您在配置期间传入有效的 --with-pcre-dir=/path/to/pcre,则将自动构建第 12.1 节,“地址标准化工具”

  • 要启用 ST_AsMVT,需要 protobuf-c 库 1.1.0 或更高版本(用于使用)和 protoc-c 编译器(用于构建)。此外,还需要 pkg-config 来验证 protobuf-c 的正确最低版本。请参阅 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 格式构建文档所必需的。DBLatex 可从 http://dblatex.sourceforge.net/ 获取。

  • ImageMagick (convert) 是生成文档中使用的图像所必需的。ImageMagick 可从 https://imagemagick.org.cn/ 获取。

2.2.3. 构建配置

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

./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

这是 PostGIS 加载器可执行文件和共享库的安装位置。默认情况下,此位置与检测到的 PostgreSQL 安装相同。

[Caution]

此参数目前已损坏,因为该软件包只会安装到 PostgreSQL 安装目录中。请访问 http://trac.osgeo.org/postgis/ticket/635 以跟踪此错误。

--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,就可以找到它,但如果没有,或者您想要使用特定版本,则需要将 PostGIS 指向特定的 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 是 PostGIS ST_GeomFromJSON 支持所需的 MIT 许可的 JSON 库。使用此参数 (--with-jsondir=/path/to/jsondir) 手动指定 PostGIS 将针对其构建的特定 JSON-C 安装目录。

--with-pcredir=DIR

PCRE 是 address_standardizer 扩展所需的 BSD 许可的 Perl 兼容正则表达式库。使用此参数 (--with-pcredir=/path/to/pcredir) 手动指定 PostGIS 将针对其构建的特定 PCRE 安装目录。

--with-gui

编译数据导入 GUI (需要 GTK+2.0)。这将为 shp2pgsql 创建 shp2pgsql-gui 图形界面。

--without-raster

编译时不包含栅格支持。

--without-topology

禁用拓扑支持。没有对应的库,因为拓扑所需的所有逻辑都在 postgis-3.5.2dev 库中。

--with-gettext=no

默认情况下,PostGIS 将尝试检测 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。

[Note]

如果您从 代码存储库 获取 PostGIS,那么第一步是运行脚本

./autogen.sh

此脚本将生成 configure 脚本,该脚本反过来用于自定义 PostGIS 的安装。

如果您改为将 PostGIS 获取为 tarball,则无需运行 ./autogen.sh,因为 configure 已生成。

2.2.4. 构建

生成 Makefile 后,构建 PostGIS 就和运行一样简单

make

输出的最后一行应为“PostGIS was built successfully. Ready to install.

从 PostGIS v1.4.0 开始,所有函数都有从文档生成的注释。如果您希望稍后将这些注释安装到您的空间数据库中,请运行需要 docbook 的命令。 postgis_comments.sql 和其他包注释文件 raster_comments.sql、topology_comments.sql 也打包在 doc 文件夹的 tar.gz 发行版中,因此如果从 tar 包安装,则无需生成注释。注释也包含在 CREATE EXTENSION 安装中。

make comments

在 PostGIS 2.0 中引入。这会生成适合快速参考或学生讲义的 HTML 速查表。这需要 xsltproc 进行构建,并将在 doc 文件夹中生成 4 个文件 topology_cheatsheet.htmltiger_geocoder_cheatsheet.htmlraster_cheatsheet.htmlpostgis_cheatsheet.html

您可以从 PostGIS / PostgreSQL 学习指南 下载一些以 HTML 和 PDF 格式提供的预构建版本

make cheatsheets

2.2.5. 构建 PostGIS 扩展并部署它们

如果您使用的是 PostgreSQL 9.1+,则会自动构建和安装 PostGIS 扩展。

如果您是从源代码存储库构建,则需要首先构建函数描述。如果您安装了 docbook,则会构建这些描述。您也可以使用语句手动构建

make comments

如果您是从发行版 tar 包构建,则无需构建注释,因为这些注释已预先打包在 tar 包中。

这些扩展应自动构建为 make install 过程的一部分。如果需要,您可以从扩展文件夹构建,或者如果需要在不同的服务器上使用,则可以复制文件。

cd extensions
cd postgis
make clean
make
export PGUSER=postgres #overwrite psql variables
make check #to test before install
make install
# to test extensions
make check RUNTESTFLAGS=--extension
[Note]

make check 使用 psql 运行测试,因此可以使用 psql 环境变量。常用的可覆盖变量包括 PGUSERPGPORTPGHOST。请参阅 psql 环境变量

扩展文件对于相同版本的 PostGIS 和 PostgreSQL 始终相同,无论操作系统是什么,因此只要您的服务器上已经安装了 PostGIS 二进制文件,就可以将扩展文件从一个操作系统复制到另一个操作系统。

如果您想在与开发环境不同的单独服务器上手动安装扩展,则需要将以下文件从 extensions 文件夹复制到 PostgreSQL 安装的 PostgreSQL / share / extension 文件夹中,以及 regular PostGIS 所需的二进制文件(如果您的服务器上还没有这些文件)。

  • 这些是控制文件,用于表示信息,例如要安装的扩展版本(如果未指定)。 postgis.control, postgis_topology.control

  • 每个扩展的 /sql 文件夹中的所有文件。请注意,这些文件需要复制到 PostgreSQL share/extension 文件夹的根目录 extensions/postgis/sql/*.sqlextensions/postgis_topology/sql/*.sql

完成此操作后,您应该会在 PgAdmin -> 扩展中看到可用的 postgispostgis_topology 扩展。

如果您使用的是 psql,则可以通过运行以下查询来验证是否安装了扩展

SELECT name, default_version,installed_version
FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%';

             name             | default_version | installed_version
------------------------------+-----------------+-------------------
 address_standardizer         | 3.5.2dev         | 3.5.2dev
 address_standardizer_data_us | 3.5.2dev         | 3.5.2dev
 postgis                      | 3.5.2dev         | 3.5.2dev
 postgis_raster               | 3.5.2dev         | 3.5.2dev
 postgis_sfcgal               | 3.5.2dev         |
 postgis_tiger_geocoder       | 3.5.2dev         | 3.5.2dev
 postgis_topology             | 3.5.2dev         |
(6 rows)

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

如果您有可用的扩展,您可以使用 pgAdmin 扩展接口或运行以下 sql 命令在您选择的数据库中安装 postgis 扩展

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch; --needed for postgis_tiger_geocoder
--optional used by postgis_tiger_geocoder, or can be used standalone
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;

在 psql 中,您可以使用来查看您安装的版本以及它们安装的架构。

\connect mygisdb
\x
\dx postgis*
List of installed extensions
-[ RECORD 1 ]-------------------------------------------------
Name        | postgis
Version     | 3.5.2dev
Schema      | public
Description | PostGIS geometry, geography, and raster spat..
-[ RECORD 2 ]-------------------------------------------------
Name        | postgis_raster
Version     | 3.0.0dev
Schema      | public
Description | PostGIS raster types and functions
-[ RECORD 3 ]-------------------------------------------------
Name        | postgis_tiger_geocoder
Version     | 3.5.2dev
Schema      | tiger
Description | PostGIS tiger geocoder and reverse geocoder
-[ RECORD 4 ]-------------------------------------------------
Name        | postgis_topology
Version     | 3.5.2dev
Schema      | topology
Description | PostGIS topology spatial types and functions
[Warning]

扩展表 spatial_ref_syslayertopology 不能显式备份。它们只能在备份相应的 postgispostgis_topology 扩展时才能备份,而这似乎只发生在备份整个数据库时。从 PostGIS 2.0.1 开始,只有未与 PostGIS 打包的 srid 记录会在备份数据库时备份,因此不要随意更改我们打包的 srid,并期望您的更改保留在那里。如果您发现问题,请提交工单。扩展表的结构永远不会备份,因为它们是使用 CREATE EXTENSION 创建的,并且对于给定版本的扩展假定它们是相同的。这些行为已构建到当前的 PostgreSQL 扩展模型中,因此我们对此无能为力。

如果您在未利用我们出色的扩展系统的情况下安装了 3.5.2dev,则可以通过运行以下命令将其更改为基于扩展的,以将函数打包到其各自的扩展中。在 PostgreSQL 13 中删除了使用 `unpackaged` 进行安装,因此建议您在升级到 PostgreSQL 13 之前切换到扩展构建。

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

2.2.6. 测试

如果您希望测试 PostGIS 构建,请运行

make check

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

[Note]

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

[Caution]

目前,make check 在执行检查时依赖 PATHPGPORT 环境变量 - 它 使用可能已使用配置参数 --with-pgconfig 指定的 PostgreSQL 版本。因此,请确保修改您的 PATH 以匹配配置期间检测到的 PostgreSQL 安装,或准备好处理即将到来的麻烦。

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

     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

postgis_tiger_geocoderaddress_standardizer 扩展目前仅支持标准的 PostgreSQL installcheck。要测试这些,请使用以下命令。注意:如果您已经在 PostGIS 代码文件夹的根目录中执行了 make install,则无需执行 make install。

对于 address_standardizer

cd extensions/address_standardizer
make install
make installcheck
	  

输出应如下所示

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test test-init-extensions     ... ok
test test-parseaddress        ... ok
test test-standardize_address_1 ... ok
test test-standardize_address_2 ... ok

=====================
 All 4 tests passed.
=====================

对于 tiger geocoder,请确保您的 PostgreSQL 实例中提供了 postgis 和 fuzzystrmatch 扩展。如果您使用 address_standardizer 支持构建了 postgis,则还会触发 address_standardizer 测试

cd extensions/postgis_tiger_geocoder
make install
make installcheck
	  

输出应如下所示

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== installing fuzzystrmatch               ==============
CREATE EXTENSION
============== installing postgis                     ==============
CREATE EXTENSION
============== installing postgis_tiger_geocoder      ==============
CREATE EXTENSION
============== installing address_standardizer        ==============
CREATE EXTENSION
============== running regression test queries        ==============
test test-normalize_address   ... ok
test test-pagc_normalize_address ... ok

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

2.2.7. 安装

要安装 PostGIS,请输入

make install

这会将 PostGIS 安装文件复制到由 --prefix 配置参数指定的相应子目录中。具体而言

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

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

  • PostGIS 库安装在 [prefix]/lib 中。

如果您之前运行了 make comments 命令以生成 postgis_comments.sqlraster_comments.sql 文件,请通过运行以下命令安装 sql 文件

make comments-install

[Note]

postgis_comments.sqlraster_comments.sqltopology_comments.sql 已从典型的构建和安装目标中分离出来,因为它们带有 xsltproc 的额外依赖项。

2.3. 安装和使用地址标准化工具

address_standardizer 扩展以前是一个单独的软件包,需要单独下载。从 PostGIS 2.2 开始,它现在已捆绑在其中。有关地址标准化工具的更多信息,它做什么以及如何根据您的需求进行配置,请参阅 第 12.1 节,“地址标准化工具”

此标准化工具可以与 PostGIS 打包的 tiger 地理编码器扩展一起使用,作为讨论的 Normalize_Address 的替代方案。要用作替代方案,请参阅 第 2.4.2 节,“将地址标准化扩展与 Tiger 地理编码器一起使用”。您也可以将其用作您自己的地理编码器的构建块,或者使用它来标准化您的地址,以便更容易地比较地址。

地址标准化工具依赖于 PCRE,它通常已经安装在许多 Nix 系统上,但您可以在以下位置下载最新版本:http://www.pcre.org。如果在 第 2.2.3 节,“构建配置” 期间找到 PCRE,则将自动构建地址标准化扩展。如果您有要使用的自定义 pcre 安装,请将 --with-pcredir=/path/to/pcre 传递给配置,其中 /path/to/pcre 是您的 pcre include 和 lib 目录的根文件夹。

对于 Windows 用户,PostGIS 2.1+ 捆绑包已预先打包了 address_standardizer,因此无需编译,可以直接进入 CREATE EXTENSION 步骤。

安装完成后,您可以连接到数据库并运行 SQL

CREATE EXTENSION address_standardizer;

以下测试不需要规则、gaz 或 lex 表

SELECT num, street, city, state, zip
 FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');

输出应为

 num |         street         |  city  | state |  zip
-----+------------------------+--------+-------+-------
 1   | Devonshire Place PH301 | Boston | MA    | 02109

2.4. 安装、升级 Tiger 地理编码器和加载数据

诸如 Tiger 地理编码器之类的额外组件可能未打包在您的 PostGIS 发行版中。如果您缺少 tiger 地理编码器扩展,或者想要比您的安装附带的版本更新的版本,请使用 Windows 未发布版本 部分中适合您 PostgreSQL 版本的软件包中的 share/extension/postgis_tiger_geocoder.* 文件。尽管这些软件包适用于 Windows,但 postgis_tiger_geocoder 扩展文件在任何操作系统上都有效,因为该扩展只是一个 SQL/plpgsql 扩展。

2.4.1. Tiger 地理编码器启用您的 PostGIS 数据库

  1. 这些说明假设您的 PostgreSQL 安装已经安装了 postgis_tiger_geocoder 扩展。

  2. 通过 psql 或 pgAdmin 或其他工具连接到您的数据库,并运行以下 SQL 命令。请注意,如果您要安装在已经具有 postgis 的数据库中,则无需执行第一步。如果您已经安装了 fuzzystrmatch 扩展,则也不需要执行第二步。

    CREATE EXTENSION postgis;
    CREATE EXTENSION fuzzystrmatch;
    CREATE EXTENSION postgis_tiger_geocoder;
    --this one is optional if you want to use the rules based standardizer (pagc_normalize_address)
    CREATE EXTENSION address_standardizer;

    如果您已经安装了 postgis_tiger_geocoder 扩展,并且只想更新到最新版本,请运行

    ALTER EXTENSION postgis UPDATE;
    ALTER EXTENSION postgis_tiger_geocoder UPDATE;

    如果您对 tiger.loader_platformtiger.loader_variables 进行了自定义条目或更改,则可能需要更新这些条目或更改。

  3. 要确认您的安装是否正常工作,请在您的数据库中运行此 SQL

    SELECT na.address, na.streetname,na.streettypeabbrev, na.zip
    	FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;

    输出应为

     address | streetname | streettypeabbrev |  zip
    ---------+------------+------------------+-------
    	   1 | Devonshire | Pl               | 02109
  4. tiger.loader_platform 表中创建一条新记录,其中包含您的可执行文件和服务器的路径。

    例如,要创建一个名为 debbie 的配置文件,该配置文件遵循 sh 约定。您可以执行以下操作

    INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep,
    		   loader, environ_set_command, county_process_command)
    SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep,
    	   loader, environ_set_command, county_process_command
      FROM tiger.loader_platform
      WHERE os = 'sh';

    然后,将 declare_sect 列中的路径编辑为适合 Debbie 的 pg、unzip、shp2pgsql、psql 等路径位置的路径。

    如果您不编辑此 loader_platform 表,它将只包含常见项目位置,并且您必须在生成脚本后编辑生成的脚本。

  5. 从 PostGIS 2.4.1 开始,邮政编码-5 位制表区域 zcta5 加载步骤已修改为加载当前的 zcta5 数据,并且当启用时,它是 Loader_Generate_Nation_Script 的一部分。默认情况下,它处于关闭状态,因为它需要相当长的时间加载(20 到 60 分钟),占用相当大的磁盘空间,并且不经常使用。

    要启用它,请执行以下操作

    UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta520';

    如果存在,则 Geocode 函数可以使用它,如果添加了边界过滤器以限制在该边界内的邮政编码。如果返回的地址缺少邮政编码,Reverse_Geocode 函数会使用它,这种情况在高速公路反向地理编码中经常发生。

  6. 在服务器根目录或您的本地 PC 上创建一个名为 gisdata 的文件夹(如果您具有与服务器的快速网络连接)。此文件夹是下载和处理 tiger 文件的位置。如果您不希望将文件夹放在服务器的根目录中,或者只是想更改为其他文件夹进行暂存,请编辑 tiger.loader_variables 表中的 staging_fold 字段。

  7. gisdata 文件夹或您指定的 staging_fold 所在位置创建一个名为 temp 的文件夹。这将是加载程序提取下载的 tiger 数据所在的文件夹。

  8. 然后运行 Loader_Generate_Nation_Script SQL 函数,请确保使用您的自定义配置文件的名称,并将脚本复制到 .sh 或 .bat 文件。例如,要构建国家/地区加载

    psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
  9. 运行生成的国家/地区加载命令行脚本。

    cd /gisdata
    sh nation_script_load.sh
  10. 在您完成运行国家/地区脚本后,您的 tiger_data 模式中应该有三个表,并且这些表应该填充有数据。通过从 psql 或 pgAdmin 执行以下查询来确认您这样做

    SELECT count(*) FROM tiger_data.county_all;
     count
    -------
      3235
    (1 row)
    SELECT count(*) FROM tiger_data.state_all;
     count
    -------
        56
    (1 row)
    

    如果您标记了要加载的 zcta5,则此表才会有数据

    SELECT count(*) FROM tiger_data.zcta5_all;
     count
    -------
      33933
    (1 row)
    
  11. 默认情况下,与 bgtracttabblock20 对应的表未加载。这些表不被地理编码器使用,但被人们用于人口统计数据。如果您希望将它们作为状态加载的一部分加载,请运行以下语句以启用它们。

    UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock20');

    或者,您可以使用 Loader_Generate_Census_Script 在加载状态数据后仅加载这些表

  12. 对于要加载数据的每个州,生成一个州脚本 Loader_Generate_Script

    [Warning]

    在您已经加载了国家/地区数据之前,请勿生成州脚本,因为州脚本会利用国家/地区脚本加载的县列表。

  13. psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
  14. 运行生成的命令行脚本。

    cd /gisdata
    sh ma_load.sh
  15. 在您完成加载所有数据或到达停止点后,最好分析所有 tiger 表以更新统计信息(包括继承的统计信息)

    SELECT install_missing_indexes();
    vacuum (analyze, verbose) tiger.addr;
    vacuum (analyze, verbose) tiger.edges;
    vacuum (analyze, verbose) tiger.faces;
    vacuum (analyze, verbose) tiger.featnames;
    vacuum (analyze, verbose) tiger.place;
    vacuum (analyze, verbose) tiger.cousub;
    vacuum (analyze, verbose) tiger.county;
    vacuum (analyze, verbose) tiger.state;
    vacuum (analyze, verbose) tiger.zcta5;
    vacuum (analyze, verbose) tiger.zip_lookup_base;
    vacuum (analyze, verbose) tiger.zip_state;
    vacuum (analyze, verbose) tiger.zip_state_loc;

2.4.2. 将地址标准化扩展与 Tiger 地理编码器一起使用

人们的许多抱怨之一是地址标准化函数 Normalize_Address,该函数标准化地址以进行地理编码前的准备。标准化工具远非完美,并且尝试修补其不完善之处需要大量的资源。因此,我们与另一个项目集成,该项目具有更好的地址标准化引擎。要使用此新的 address_standardizer,请按照 第 2.3 节,“安装和使用地址标准化工具”中所述编译扩展,并将其作为扩展安装在您的数据库中。

一旦您将此扩展安装在与安装了 postgis_tiger_geocoder 的同一数据库中,则可以使用 Pagc_Normalize_Address 来代替 Normalize_Address。此扩展与 tiger 无关,因此可以与其他数据源(例如国际地址)一起使用。tiger 地理编码器扩展的确附带了其自己自定义版本的 rules tabletiger.pagc_rules)、gaz tabletiger.pagc_gaz)和 lex tabletiger.pagc_lex)。您可以添加和更新这些表,以改善您自己需求的标准化体验。

2.4.3. 加载 tiger 数据所需的工具

加载过程从人口普查网站下载各自的国家/地区文件、请求的州的数据,提取文件,然后将每个州加载到其自己的一组单独的州表中。每个州表都继承自 tiger 模式中定义的表,因此只需查询这些表即可访问所有数据,并使用 Drop_State_Tables_Generate_Script 随时删除一组州表(如果需要重新加载某个州或者不再需要某个州)。

为了能够加载数据,您需要以下工具

  • 一个从人口普查网站解压缩 zip 文件的工具。

    对于类似 Unix 的系统:unzip 可执行文件,它通常已安装在大多数类似 Unix 的平台上。

    对于 Windows,7-zip 是一个免费的压缩/解压缩工具,您可以从 http://www.7-zip.org/ 下载。

  • shp2pgsql 命令行,它在您安装 PostGIS 时默认安装。

  • wget,它是一个 Web 抓取工具,通常安装在大多数 Unix/Linux 系统上。

    如果您使用的是 Windows,可以从 http://gnuwin32.sourceforge.net/packages/wget.htm 获取预编译的二进制文件

如果您要从 tiger_2010 升级,则需要首先生成并运行 Drop_Nation_Tables_Generate_Script。在加载任何州数据之前,您需要加载全国范围的数据,可以使用 Loader_Generate_Nation_Script 完成。它将为您生成一个加载程序脚本。Loader_Generate_Nation_Script 是一次性步骤,应在升级(从前一年的 tiger 人口普查数据)和新安装时完成。

要加载状态数据,请参阅 Loader_Generate_Script,为您所需的州生成适合您平台的数据加载脚本。请注意,您可以分批安装这些脚本。您不必一次加载所有想要的州。您可以根据需要加载它们。

加载完所需州后,请确保运行

SELECT install_missing_indexes();

Install_Missing_Indexes 中所述。

要测试一切是否按预期工作,请尝试使用 Geocode 对您所在州中的某个地址运行地理编码

2.4.4. 升级您的 Tiger 地理编码器安装和数据

首先按如下方式升级您的 postgis_tiger_geocoder 扩展

ALTER EXTENSION postgis_tiger_geocoder UPDATE;

接下来,删除所有国家表并加载新的表。使用此 SQL 语句生成删除脚本,详细信息请参阅Drop_Nation_Tables_Generate_Script

SELECT drop_nation_tables_generate_script();

运行生成的删除 SQL 语句。

使用此 SELECT 语句生成国家加载脚本,详细信息请参阅Loader_Generate_Nation_Script

对于 Windows

SELECT loader_generate_nation_script('windows'); 

对于 Unix/Linux

SELECT loader_generate_nation_script('sh');

有关如何运行生成脚本的说明,请参阅第 2.4.1 节,“Tiger Geocoder 启用你的 PostGIS 数据库”。此操作只需执行一次。

[Note]

你可以混合使用不同年份的州表,并可以单独升级每个州。在升级某个州之前,首先需要使用Drop_State_Tables_Generate_Script删除该州之前年份的州表。

2.5. 安装期间的常见问题

当你的安装或升级未按预期进行时,需要检查以下几点。

  1. 检查你是否安装了 PostgreSQL 12 或更新版本,并且你的编译所针对的 PostgreSQL 源代码版本与正在运行的 PostgreSQL 版本相同。当你的(Linux)发行版已经安装了 PostgreSQL,或者你之前已经安装了 PostgreSQL 但忘记时,可能会发生混淆。PostGIS 只能与 PostgreSQL 12 或更新版本一起使用,如果使用旧版本,则会产生奇怪且意想不到的错误消息。要检查正在运行的 PostgreSQL 版本,请使用 psql 连接到数据库并运行此查询

    SELECT version();

    如果你正在运行基于 RPM 的发行版,可以使用 rpm 命令检查是否存在预安装的软件包,如下所示:rpm -qa | grep postgresql

  2. 如果你的升级失败,请确保你正在还原到已安装 PostGIS 的数据库中。

    SELECT postgis_full_version();

还要检查 configure 是否正确检测到 PostgreSQL、Proj 库和 GEOS 库的位置和版本。

  1. configure 的输出用于生成 postgis_config.h 文件。检查 POSTGIS_PGSQL_VERSIONPOSTGIS_PROJ_VERSIONPOSTGIS_GEOS_VERSION 变量是否已正确设置。